I have built an electrical system for a van to campervan conversion. Sinopoly LiFePO4 cells with ElectroDacus SBMS0, CCGX, MultiPlus 24/5000/120, SmartSolar 150/35, BatteryProtect BP65. The SBMS0 can write status parameters via UART (USB-RS232 interface). I have written a Venus driver to consume these parameters via serial and feed them into the com.victronenergy.battery.ttyUSB0 dbus service. I am writing the following dbus values:
'/Dc/0/Voltage': round(data['battery_voltage'], 2) '/Dc/0/Current': round(data['battery_current'], 2) '/Dc/0/Power': round(data['battery_voltage'] * data['battery_current'], 2) '/Dc/0/Temperature': data['ext_temp'] '/Soc': data['soc'] '/Alarms/LowVoltage': victron_alarm(data['status_uvlk']) '/Alarms/HighVoltage': victron_alarm(data['status_ovlk']) '/Alarms/LowSoc': victron_alarm(data['battery_voltage'] <= BATTERY_SOC_LOW_ALARM) '/Alarms/LowTemperature': victron_alarm(data['ext_temp'] < BATTERY_TEMP_LOW_ALARM) '/Alarms/HighTemperature': victron_alarm(data['ext_temp'] > BATTERY_TEMP_HIGH_ALARM) '/Alarms/HighInternalTemperature': victron_alarm(data['status_iot']) '/Info/MaxChargeVoltage': BATTERY_VOLTAGE_MAX '/Info/BatteryLowVoltage': BATTERY_VOLTAGE_MIN '/Info/MaxChargeCurrent': BATTERY_CURRENT_CHARGE_MAX '/Info/MaxDischargeCurrent': BATTERY_CURRENT_DISCHARGE_MAX '/Capacity': BATTERY_CAPACITY '/Alarms/HighChargeCurrent': victron_alarm(data['status_coc']) '/Alarms/HighDischargeCurrent': victron_alarm(data['status_doc']) '/Alarms/CellImbalance': victron_alarm(data['cell_voltage_delta'] > 20) '/Alarms/InternalFailure': victron_alarm(data['status_eccf'] or data['status_open']) '/Alarms/HighChargeTemperature': victron_alarm(data['battery_current'] > 0.0 and data['ext_temp'] > BATTERY_TEMP_HIGH_ALARM) '/Alarms/LowChargeTemperature': victron_alarm(data['battery_current'] > 0.0 and data['ext_temp'] < BATTERY_TEMP_LOW_ALARM) '/Alarms/LowCellVoltage': victron_alarm(data['status_lvc']) '/System/MinCellVoltage': min(data['cell_voltages']) '/System/MinVoltageCellId': ','.join(str(cell) for cell, voltage in enumerate(data['cell_voltages']) if voltage == min(data['cell_voltages'])) '/System/MaxCellVoltage': max(data['cell_voltages']) '/System/MaxVoltageCellId': ','.join(str(cell) for cell, voltage in enumerate(data['cell_voltages']) if voltage == max(data['cell_voltages'])) '/Io/AllowToCharge': victron_bool(data['status_cfet']) '/Io/AllowToDischarge': victron_bool(data['status_dfet'])
The data appears in the expected places on the CCGX display:
The SBMS0 signals low/high voltage disconnect via optocouplers (as well as via UART) when the battery is empty/full respectively. I am using this to control the MultiPlus using the Two-Signal BMS assistant as described in the "Connecting other lithium systems to Multis and Quattros" document. I also plan to use the SBMS0 to control loads connected via the BP65 by way of the remote pins.
Ideally I would also use the SBMS0 to control the SmartSolar using the VE.Direct non-inverting remote on/off cable. However, the SmartSolar has a single VE.Direct port, which is in use to connect to the CCGX. I therefore need to use the CCGX to control the SmartSolar.
I have confirmed that remote control of the SmartSolar is possible from the CCGX via dbus:
dbus -y com.victronenergy.solarcharger.ttyO0 /Mode SetValue 1 # on dbus -y com.victronenergy.solarcharger.ttyO0 /Mode SetValue 4 # off
However, even with this configuration, the SmartSolar does not stop charging when the SBMS0 signals battery full/over voltage. I had thought that setting /Io/AllowToCharge would provide this control, but it doesn't seem to.
Which dbus values in com.victronenergy.battery.ttyUSB0 do I need to write so that the SmartSolar will stop charging when the SBMS0 determines that charging is complete?