BlueSmart IP22 Charger Registers

Hello Community, Victron Staff
I’m looking for the VE.Direct register description/documentation of the VE.Direct output of the blue smart charger 12 | 30. Can any one help me?

Here the list of registers that I found:

    /* counter / time seconds? */
    case 0x0120: {
        // value = CSVEDirect::getU32(ved);
        // break;
        return true;
    }
    /* Mode
     * value=0  Ladegeraet
     * value=11 Spannungsversorgung
     */
    case 0x0201: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /*
     * value=1 Spannungsversorgung
     */
    case 0x0206: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    case 0x0207: {
        value = CSVEDirect::getU32(ved);
        break;
    }
    /* :A0D200000001E */
    case 0x200D: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Flags
     * b0
     * b1 => 0x02 => night mode on
     * b2
     * b3
     * b4
     * b5
     */
    case 0xE001: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /* night mode 8 hours w/o fan with 15A current
     * counter 28800 seconds to 0 seconds
     */
    case 0xE002: {
        value = CSVEDirect::getU32(ved);
        break;
    }
    case 0xEC41: {
        value = CSVEDirect::getU32(ved);
        break;
    }
    /* Re-Bulk-Spannungsoffset (scale / 1000)
     * value=11 -> 11mV
     */
    case 0xED2E: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* output voltage - same is 0xEDD5 */
    case 0xED8D: {
        // value = CSVEDirect::getU16(ved);
        // break;
        return true;
    }
    case 0xEDD4: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /* output voltage - same is 0xED8D */
    case 0xEDD5: {
        // value = CSVEDirect::getU16(ved);
        // break;
        return true;
    }
    /* output current scale / 100
     * value=3060 or 3070 or 2990
     *  -> 30.6A or 30.7A or 29.9A
     */
    case 0xEDDB: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Abschalten bei Temperatur niedrig 5°C
     * scale / 100
     * value=500
     */
    case 0xEDE0: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Re-Bulk-Strom (scale x1)
     * value=0 -> deactivated
     * value=2 -> 2A
     */
    case 0xEDE1: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Bulk-Spannung
     * Ladevoreinstellung 0:
     *      Voltage => 13.10
     * Ladevoreinstellung 1:
     *      Voltage => 13.10
     * Ladevoreinstellung 2:
     *      Voltage => 13.10
     * Ladevoreinstellung 3:
     *      Voltage => 13.10
     * Ladevoreinstellung 4:
     *      Voltage => 13.40
     */
    case 0xEDE2: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Dauer der Regenrierung hh:mm scale / 100
     * value=100 value=202 -> 2:02
     */
    case 0xEDE3: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Prozentsatz Strom regenerierung scale x1
     * value=3
     */
    case 0xEDE4: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /* Stopp-Modus Regenerierung
     * 1 = Automatisch, an Spannung
     * 0 = Festgelegt
     */
    case 0xEDE5: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    case 0xEDE6: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Schweifstrom scale x1
     * value=0 -> deactivated
     * value=2 -> 2A
     */
    case 0xEDE7: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Maximum Strom A scale x10
     * current => 150
     * current => 300
     */
    case 0xEDF0: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Ladevoreinstellung
     * 0 = Normal
     * 1 = Normal + Reginerierung
     * 2 = Hoch
     * 3 = Hoch + Regenerierung
     * 4 = Li-ion
     */
    case 0xEDF1: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /* Temperaturkompensation (scale / 100)
     * value=0     -> deactivated
     * value=-1620 -> -16.20 mV/°C
     */
    case 0xEDF2: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /*
     * Ladevoreinstellung: 0
     *      Voltage => 16.20
     * Ladevoreinstellung: 1
     *      Voltage => 16.20
     * Ladevoreinstellung: 2
     *      Voltage => 16.20
     * Ladevoreinstellung: 3
     *      Voltage => 16.20
     * Ladevoreinstellung: 4 (Lithium)
     *      Voltage => 0
     */
    case 0xEDF4: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Lagerungsspannung (scale / 100)
     *  Smart Lithium LiFePo4
     *      Voltage => 13.50
     */
    case 0xEDF5: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Erhaltungsspannung (scale / 100)
     *  Smart Lithium LiFePo4
     *      Voltage => 13.50
     */
    case 0xEDF6: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Absorptionsspannung (scale / 100)
     *  Smart Lithium LiFePo4
     *      Voltage => 14.40
     */
    case 0xEDF7: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Wiederholte Konstantspannung alle n Tage (scale / 100)
     * value=700 or 600
     */
    case 0xEDF8: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /*
     * value=100
     */
    case 0xEDF9: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /*
     * value=800
     */
    case 0xEDFA: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Absorptionsdauer (scale / 100)
     *
     * Ladevoreinstellung: 1
     *      value=
     * Ladevoreinstellung: 1
     *      value=
     * Ladevoreinstellung: 2
     *      value=800
     * Ladevoreinstellung: 3
     *      value=800
     * Ladevoreinstellung: 4
     *      value=200
     */
    case 0xEDFB: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Bulk-Zeitbegrenzung hh:mm (scale / 100)
     * value=2400 -> 24:00
     */
    case 0xEDFC: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /*
     *  value => 0
     */
    case 0xEDFD: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /* Absorbtionsdauer
     * 0 = Fest
     * 1 = Adaptiv
     */
    case 0xEDFE: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /*
     * value=1
     */
    case 0xEDFF: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /* always 0xFFFF ?? */
    case 0xEE16: {
        // value = CSVEDirect::getU16(ved);
        // break;
        return true;
    }
    /* reset history */
    case 0x1030: {
        /* no value */
        return true;
    }
    /* Table */
    case 0x1042: {
        show = true;
        break;
    }
    /* Table */
    case 0x1043: {
        show = true;
        break;
    }
    /* Table */
    case 0x1070: {
        show = true;
        break;
    }
    /* -----------------------------
     * Smart Network created
     * ----------------------------- */
    /*
     * :A14EC00436172494F534A
     */
    case 0xEC14: {
        show = true;
        break;
    }
    /*
     * :A12EC004DCF 31
     */
    case 0xEC12: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /*
     * :A13EC00E3C841BD37E9CFB9AF1BF5DD1E9F0EFE96
     */
    case 0xEC13: {
        show = true;
        break;
    }
    /*
     * :A012000000525
     */
    case 0x2001: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /*
     * :A0720000000000024
     */
    case 0x2007: {
        value = CSVEDirect::getU32(ved);
        break;
    }
    /*
     * :A082000000023
     */
    case 0x2008: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /*
     * :A0920000022
     */
    case 0x2009: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /* ???
     * value=200
     * :A422000C80021
     */
    case 0x2042: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /*
     * :A0C2000FF20
     */
    case 0x200C: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /* Unix timestamp ??
     * :A132000FFFFFF7F9C
     */
    case 0x2013: {
        value = CSVEDirect::getU32(ved);
        break;
    }
    /* :A0E200021FC
     *
     * value=33
     * value=1 -> Ladegeraet
     */
    case 0x200E: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /* :A30EC00012E */
    case 0xEC30: {
        show = true;
        break;
    }
    /* :A31EC00018396F49930A300FF4203007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFF85 */
    case 0xEC31: {
        show = true;
        break;
    }
    /* :A16EC000445 */
    case 0xEC16: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /* :A20EC00ECEDFFFFFFFFFFFF8DEDFFFFFFFFFFFF8CEDFFFFFFFFFFFF3EECFFFFFFFFFFFF61 */
    case 0xEC20: {
        show = true;
        break;
    }
    /* :A15EC00004A */
    case 0xEC15: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /*
     *  value=3
     *
     * :A8FED000100CE */
    case 0xED8F: {
        value = CSVEDirect::getU8(ved);
        break;
    }
    /* Output Load Current (scale / 1000)
     * value=450 -> 450mA -> 0.45A */
    case 0xED8C: {
        value = CSVEDirect::getU32(ved);
        break;
    }
    /* Work Mode
     * 1 =
     * 2 =
     * 3 =
     * 4 = Absorption
     * 5 =
     */
    case 0xEDD7: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Output Voltage Spannungsversorgung (scale / 100)
     * value=1280 -> 12.80V
     */
    case 0xEDE9: {
        value = CSVEDirect::getU16(ved);
        break;
    }
    /* Re-Bulk Methode
     * 0 = Spannung
     * 1 = Konstantstrom
     */
    case 0xEE17: {
        value = CSVEDirect::getU8(ved);
        break;
    }

I am putting here a list with what I’ve got.

Hello Alex,
Thank you very much. I’will see what I can :slight_smile:
Here you can see your Excel Sheet in fancy style:
Fancy Formated

Hi Alex,
finally you can find an application on GitHub

Thanks for sharing!

Not understanding right…
You have IDs that are not present on that (my) list with over 1200 IDs?
Or the other way around?

Python lingo… :-)))

Well, I’ve said that not all devices respond to all IDs…
Also it may be an “official” list, as the yellow ones are IDs that Multi RS are responding to, but were not initially included on the list.
So may be - at least from the time of the initial list - other “undocumented” ones.
You can write a small program (or script :-)) ) to scroll the entire base (from 0x0010 to 0xFFFF) and see which ones respond in your case.

“void” your device??? what do you mean?
If a register is not known, the appropriate error is thrown. Usually an 0x8000 error.

One thing is reverse engineer a firmware and another is to interrogate the device, with the appropriate, publicly supplied and documented protocol, to find out the IDs…

I’ve been trying to make sense of the Victron bluetooth protocol to pull trend data off my smartshunt. This spreadsheet of registers has been very helpful. How did you get these? I’m trying to identify a few more IDs, including EC5B which appears to be trend data.

You can find the updated list on the second message of this thread.

Cheers, yeah I saw that. I was just wondering how you generated it. In the process of reverse engineering the bluetooth protocol, I’ve found the shunt is reporting a bunch of IDs not on the list. It would be great if I could get there names somehow.

Take a look at the list now. I’ve update it this morning after your message. And your EC5B example is there now…

Champion! That should help.