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, with explanations, but I am also having a small (well, a big) favor to ask… :pray:
Could you be so nice to format it for others to have a proper reference? Also ignore the “garbage” at some lines’ end.
Thanks a lot in advance.

PS: Don’t mind the “D” column, it’s a column with values from my device. Also ignore colors, as they’re also for my device.

https://axelzone.ro/storage/victron/can0_info_ids-formated.xlsx

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

1 Like

Thanks for sharing!

Right now I can confirm that 77 objects correlate to my research and are valid from your documentation.

There are a large quantity not present however in the list provided.

I am not yet at liberty to say anything about those.

It may mean they are not present in my source, and until further permission is granted, Id like to abide by the legality. Otherwise all efforts are wasted on the clean-room principle.

Based on my source there are 439 objects.

Until correlative research is done, we cannot know the extent of this list.

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

My source has only 439 objects of the communication class you shared, of which 77 are valid and present.

Your source likely incorporates the accumulated data of all public objects across all device families.

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.

:stuck_out_tongue_winking_eye: yes, but seeing as I don’t want to void my device just yet, Im conducting research on a device I do not possess. Purely objective assessment

The idea being that should we be granted permission to continue research, this extracted list would provide the base identifiers that would define the permission and permissible scope of documentation.

“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…

7 posts were merged into an existing topic: Are Victron firmware mods allowed?