Accessing BMS-Can battery data from VE.Can device via Cerbo GX?

I have a BMS-Can compliant 24v LFP house bank with internal BMS communicating to a Cerbo GX via 500kb/s BMS-Can protocol. I’m adding a new charging source (bi-directional DC-DC from Alternator and starting 12v bank) which communicates at 256kb/s (so either VE.Can or CAN-bus BMS). The VE.Can device cannot detect any CanBus batteries.

The Cerbo GX (Mk1) manual states “ VE.Can and BMS-Can cannot be combined on the same bus. If you wish to use both, they require a GX device with two separate buses, each with 2 RJ45 ports - 4 CANbus ports in total.”

The update Mk2 manual states “ VE.Can and BMS-Can cannot be combined on the same bus. If you wish to use both, they require a GX device such as the Cerbo GX MK2 or Ekrano GX with two separate buses, each with 2 RJ45 ports - 4 CANbus ports in total.”

The CerboGX (Mk1) has 4xRJ45, 2 dedicated to BMS-Can and 2 dedicated to VE.Can, and the Mk2 has 4xRJ45, split between 2 CanBus ports selectable to either BMS-Can or VE.Can, so the above statement is unclear as to whether the 2 seperate buses (BMS-Can and VE.Can) can share battery data from the BMS.

My question therefore, is does anyone have a method of communicating BMS-Can battery data to a VE.Can device on a Cerbo GX MK1? and would the CerboGX Mk2 be able to do this?

Thanks kindly for your time.

By itself Venus OS doesn’t do this.
I mean what it receives on one CAN port from BMS, it doesn’t send onto the other.
But you can design your own driver to do this.
The data from BMS is stored onto the system’s dbus.
You can make a small script to periodically take that data from dbus and broadcast it onto the other’s device (charging source) CAN bus.

Hi Alex,
Thanks for the response, not sure designing drivers and scripting is within my competency at this stage, but I’m learning… An alternative I’m considering is using the relay on my Multi2 to send a stop/start charging message to the DC-DC as a non-CAN workaround. Or drop another $450 on the Mk2 Cerbo, which appears to do this, based on the statement from the manual I quoted above.

Do you have any advice on how to do this, documentation, example script, etc? I have a dbus-aggregate battery and I need it to broadcast its BMS information to a WS500.

That battery and its driver are storing information on dbus.
You can use dbus or dbus-send utilities to read those dbus paths to some variables, inside a bash script.
Then in the same script you can take those variable’s values and send them, at reasonable time intervals, over the CAN bus you desire.
Then make that script to run at runtime.
Example on how to do this are on the Victron and Venus OS help/wiki repositories.

Do you have links to these examples? Not how to read the dbus, but how to send information over the CAN bus and how to format it to act like a BMS? That’s exactly what I’ve been looking for but I’ve had no luck.

You want to send CAN frames over one of the CAN buses, where your “listening” device is, right?
So the question to be asked is how that listening device expect that information and how should it be formatted.
Once you have the format, you can use cansend utility, that is shipped inside Venus OS.

Do you have a Cerbo?
Because on a Cerbo, the BMS-CAN bus is configured as an 11bit CAN bus and the VE.CAN bus is configured as an 29bit CAN bus.
On which type of network configuration is your Wakespeed controller working?
How is it expecting the info from the BMS? In which format?
Is your WS controller connected somehow to your Victron system?

I don’t have an example for you, neither I worked with WS devices, but if I were you, I would try to connect that WS device on a separate CAN bus network, created with one USB to CAN converter supported by Venus OS.
Then on that CAN bus network, I would broadcast, with the parameters and format the WS controller expects, the info from the Venus OS dbus, regarding the battery data.

It’s a CerboGX, the WS500 is connected to one of the VE.can ports set to VE.Can and Can-Bus BMS (250 kb/s). I assume it’s using VE.can to communicate with the cerbo (it shows up in devices and reports it’s voltage and field strength and such), and is listening for Can-Bus messages from a BMS. Which it’s not receiving because the BMS only exists in the Cerbos dbus. So I’d guess it’s expecting 11 bit can bus messages.

I see the cansend command works, is there some documentation on it? Googling or searching the venusos wiki turns up nothing.

CerboGX mark 1 or 2?

As for cansend, just use some “wrong” parameters like cansend xyz 123 and the utility will show you its help.
For example:
cansend can1 432#102030 will send on can1 bus (CAN-BMS port) a frame with id 432 and 3 bytes 10, 20 and 30. All values are in hex.

It’s a MK2, since I thought I might configure the other port for RV-C to do some other stuff.

I did find this sheet in a document for communicating with a “SMA/Victron compatible BMS via CAN bus”, which I think would be compatible. I believe the BMS messages have to be continually sent, not just when the dbus values update.

Yes, the values are usually sent at 1Hz.

A more complete crosstable for CAN ids.

Interesting, I wonder if the blue values are what the lynx BMS adds. The Arco Zeus, another alternator regulator, apparently only works with the Lynx. Anyway the document I’m looking at also has this table, which might be enough to get this working.

Have fun! :slight_smile:

PS: Pylontech also publishes that 0x355 info, but only the first 4 bytes, without the HiResSOC.

It says it’s optional but I plan to send it since my BMS is reporting SOC down to the hundredth. Do you know how to format it for the skipped bytes, should I put in zeros for the odd bytes?

Don’t know how your device is expecting it, CAN rules says that the unused bytes up to 8 bytes of a frame to be padded with 0.
Below all the info that is exchanged on my BMS-CAN. The info repeats at 1 second interval. See the “non-standard” broadcasts.
It’s a Pylontech genuine comm.
The 305 and 307 are broadcasted by Cerbo and is used/needed for the BMS to detect the presence of an “inverter”.
307 has been dropped by Victron since several revisions.

My final post, for anyone who comes across this thread in the future. I was never able to get any of the 11 bit BMS specifications to work, recpro, SMA, victron, etc. And I never figured out why. I contacted Wakespeed who sent my questions to one of their engineers, but he didn’t look at any of the logs I sent, just sent back a generic response saying check the BMS specs.

So I tried again with the 29 bit RV-C spec, which is not proprietary, and that works. Since I didn’t implement receiving messages or sending messages to specific nodes, it’s really no more complicated than the 11 bit specs.

The project is on github under xtoddmcx/dbus-to-rvc. It is not meant for public use and probably isn’t coded well, but it might be useful as an example.

Included is a screenshot of a candump, the highlighted lines are the outgoing BMS messages.