Integration of Batrium Watchmon Core with Sungrow SH10.0RT-20 (BYD HVS Emulation)

System Setup:

  • Inverter: Sungrow SH10.0RT-20 (Off-Grid / Backup output → Home + 4x Hoymiles HMS ca. 5kW)
  • BMS: Batrium Watchmon Core with 8x CellMate K9s & Shuntmon
  • Battery: DIY 128x 340Ah LiFePO4
  • PV on SH10.0RT-20: 12kW

The Problem:
I am using the Sungrow SH10.0RT-20 (compatible with BYD HVS). I selected CAN protocol “Reserved40 (BYD)” on the Batrium. The communication works, but the Sungrow inverter automatically detects a battery capacity of only 5.1 kWh and limits the charge/discharge current to 10A.

Investigation & Findings:
I suspected the Batrium settings for Base Address, Remote Address, and Group Address were not being transmitted correctly. Using a CAN bridge between the Watchmon Core and the inverter, I confirmed my suspicion:

  • No Change: Modifying the Batrium settings did not change the values on CAN ID 0x250.
  • The Fix (CAN Bridge): I manually modified CAN ID 0x250 via the bridge.
    • Changed Byte 6 from 02 (2 Modules = 5.1kWh) to 04 .
    • Changed Byte 7 to 02 .
  • Result: The Sungrow immediately recognized 10.2 kWh capacity and allowed charge/discharge currents exceeding 20A.

The Question:
Does the Batrium “Reserved 40 (BYD-HVS)” profile currently ignore the Base/Remote/Group Address settings for CAN ID 0x250? It appears the Watchmon Core is hardcoding the HVS battery size to “2 modules” (5.1kWh) instead of calculating total capacity or reading user inputs.

Request:
Can you please check the Batrium firmware for the BYD HVS emulation? The bytes for capacity and current limits do not seem to be updating dynamically based on user configuration.

2 Likes

Hi ProbeV6

Thanks for the detailed troubleshooting. I have looked at our firmware and confirmed it is hardcoded to 0x02 for pack size. I have passed on this info to our software engineer for inclusion in our next release so that you can set the value from the Remote Address.

Interestingly, our documentation from a while ago hints that this was how it worked already, perhaps the feature got stalled or rolled back?

Either way, it’s a good feature, and I want it in our firmware.

Could you clarify what you mean by byte 6 and 7? Is that starting from zero?

What does byte 7 do? (I suspect pack type?)

Thanks again for the work here.

During BYD HVS battery initialization from Batrium Core to inverter:

ID: 0x250: 03 16 00 66 00 33 02 09

Byte 0 = 03

Byte 1 = 16

Byte 2 = 00

Byte 3 = 66 → Module voltage = ((d[2] << 8) | d[3]) * 100 = 0x0066 = 102 V (32x LiFePo4)

Byte 4 = 00

Byte 5 = 33 → total_capacity_Wh = ((d[4] << 8) | d[5]) * 100 = 5100 Wh

Byte 6 = 02 → Number of modules 2-5?

Byte 7 = 09

My code is very simple:

cpp
// ====================================================================
// Function to modify the 0x250 message (only for BMS → Inverter)
// ====================================================================
void modifyMessageFromBMS(CANMessage &msg) {
if (msg.id == 0x250 && msg.len >= 7) {
// Byte4 (Index 4) to 0x05
// Byte5 (Index 5) to 0x14 → capacity 130 kWh
// Byte6 (Index 6) to 0x04 → battery nominal voltage 4 * 102V = 408V
msg.data[4] = 0x05;
msg.data[5] = 0x14;
msg.data[6] = 0x04;
}
}
With this modification, iSolarCloud (Sungrow SH10RT-20) automatically recognizes the battery as 130 kWh. As a result, it permanently allows over 20A (in my case about 24A).

Thank you for including this in the firmware update. Then I can disconnect my CAN bridge workaround in the future.


My Sungrow is on the latest firmware version.

Hi @ProbeV6, what type of CAN bridge are you using?