SmartShunt and Venus OS disagree on 100% SOC

After reaching full charge according to the set criteria (voltage above 13.9v, current below 2% tail current value, i.e. < 12A, for the specified 3 minute charge detection time) the SmartShunt shows 100% SoC in Victron Connect iOS, but 99% on Cerbo GX, MQTT, modbus, Node-Red, etc. It is connected directly via VE.Direct cable to the Cerbo GX and all other values are updating and look correct.

In fact, you can see (second graph) that bizarrely the SOC as seen over MQTT directly from the Cerbo GX is steady at 99.7% the whole time it probably should have been at 100%.

In fact the battery has been at 14.2v for 45 minutes and current has been below tail for almost as long, fluctuating around +/- 5A. The MultiPlus 12/1200/50 (with ESS active) holds the pack at 14.20v for an hour as expected and then dumps power to bring the voltage down to 13.5v - so it seems to also believe the battery is charged.

The battery BMS is not connected, so the SmartShunt is the sole arbiter of SoC for the system. Clearly the battery is fully charged but anything that depends on Venus OS recognizing it as full does not work when this happens, which is about 50% of the days when there’s enough sun to fully charge the battery by mid-afternoon.

I would not worry about this too much. SOC is a derived parameter, and it is really just an approximation of the battery charge. Cell voltage is the real determining parameter for a discharged or charged battery.

Yeah, I know it’s fully charged but it means things like time since last charged, charge cycle count, etc don’t work. I have automations to do stuff like charge to full after off-peak TOU pricing starts if PV didn’t fully charge the battery during the day. I guess I could key it off something else, or watch for absorb->float transition and force-reset 100% SOC when that happens. But I guess I’m just surprised that the smartshunt firmware sometimes fails to recognize the conditions.

this is making me sort of crazy. I would love to know what the actual algorithm is, because it’s just outright refusing to snap to 100% SOC.

If anyone has insight into how it actually works – do excursions into negative current (discharge) reset the SmartShunt’s charged detection timer? I can’t think of much else. I don’t think there are any short peaks of current above the tail current once the batteries have been sitting at full charge for 20+ minutes.

I’m nearly persuaded to instrument the shunt and battery with high frequency sampling and collect some megabytes of data to at least identify if this is a software problem with the shunt.

once the battery is fully charged, every single report (as seen via mqtt) has “soc”: 99.5999984741211 - no change within 13 decimal places over 15 minutes seems suspect!

yes I think this is true.