diff --git a/docs/bms24_additional_protocol V1.25.pdf b/docs/bms24_additional_protocol V1.25.pdf new file mode 100644 index 0000000..07e90f1 Binary files /dev/null and b/docs/bms24_additional_protocol V1.25.pdf differ diff --git a/driver/chargerybms.py b/driver/chargerybms.py index fc1a8ee..f089e02 100644 --- a/driver/chargerybms.py +++ b/driver/chargerybms.py @@ -1,5 +1,6 @@ #!/usr/bin/env python +import argparse import gobject import platform import argparse @@ -13,135 +14,231 @@ import math import struct import decimal - -# Victron packages -sys.path.insert(1, os.path.join(os.path.dirname(__file__), './ext/velib_python')) -from vedbus import VeDbusService - # setup timezone os.environ['TZ'] = 'Europe/Berlin' logging.basicConfig( format='%(asctime)s %(levelname)-8s %(message)s', - level=logging.INFO, + level=logging.DEBUG, datefmt='%Y-%m-%d %H:%M:%S') + +# connect and register to dbus +driver = { + 'name' : "Chargery BMS", + 'servicename' : "chargerybms", + 'instance' : 1, + 'id' : 0x01, + 'version' : 1.2, + 'serial' : "CHGBMS11062020A1", + 'connection' : "com.victronenergy.battery.ttyUSB0" +} + + +parser = argparse.ArgumentParser(description = 'Chargery BMS driver') +parser.add_argument('--version', action='version', version='%(prog)s v' + str(driver['version']) + ' (' + driver['serial'] + ')') +parser.add_argument('--test', action="store_true", help='test some stored examples network packets') +parser.add_argument('--victron', action="store_true", help='enable Victron DBUS support for VenusOS') +args = parser.parse_args() + + serial_port = serial.Serial('/dev/ttyUSB0', 115200, timeout=1) serial_port.flushInput() logging.info(serial_port.name) -# connect and register to dbus +# victron stuff should be used +if args.victron: -driver = { - 'name' : "Chargery BMS", - 'servicename' : "chargerybms", - 'instance' : 1, - 'id' : 0x01, - 'version' : 1.1, - 'serial' : "CHGBMS04032020A1", - 'connection' : "com.victronenergy.battery.ttyUSB0" -} - -from dbus.mainloop.glib import DBusGMainLoop -DBusGMainLoop(set_as_default=True) - -dbusservice = VeDbusService(driver['connection']) - -# Create the management objects, as specified in the ccgx dbus-api document -dbusservice.add_path('/Mgmt/ProcessName', __file__) -dbusservice.add_path('/Mgmt/ProcessVersion', 'Unknown and Python ' + platform.python_version()) -dbusservice.add_path('/Mgmt/Connection', driver['connection']) - -# Create the mandatory objects -dbusservice.add_path('/DeviceInstance', driver['instance']) -dbusservice.add_path('/ProductId', driver['id']) -dbusservice.add_path('/ProductName', driver['name']) -dbusservice.add_path('/FirmwareVersion', driver['version']) -dbusservice.add_path('/HardwareVersion', driver['version']) -dbusservice.add_path('/Serial', driver['serial']) -dbusservice.add_path('/Connected', 1) - -# Create device list -dbusservice.add_path('/Devices/0/DeviceInstance', driver['instance']) -dbusservice.add_path('/Devices/0/FirmwareVersion', driver['version']) -dbusservice.add_path('/Devices/0/ProductId', driver['id']) -dbusservice.add_path('/Devices/0/ProductName', driver['name']) -dbusservice.add_path('/Devices/0/ServiceName', driver['servicename']) -dbusservice.add_path('/Devices/0/VregLink', "(API)") - -# Create the chargery bms path -dbusservice.add_path('/Info/Soc', -1) -dbusservice.add_path('/Info/CurrentMode', -1) -dbusservice.add_path('/Info/Current', -1) -dbusservice.add_path('/Info/Temp/Sensor1', -1) -dbusservice.add_path('/Info/Temp/Sensor2', -1) -dbusservice.add_path('/Info/ChargeEndVoltage', -1) -dbusservice.add_path('/Info/UpdateTimestamp', -1) -dbusservice.add_path('/Voltages/Cell1', -1) -dbusservice.add_path('/Voltages/Cell2', -1) -dbusservice.add_path('/Voltages/Cell3', -1) -dbusservice.add_path('/Voltages/Cell4', -1) -dbusservice.add_path('/Voltages/Cell5', -1) -dbusservice.add_path('/Voltages/Cell6', -1) -dbusservice.add_path('/Voltages/Cell7', -1) -dbusservice.add_path('/Voltages/Cell8', -1) -dbusservice.add_path('/Voltages/Cell9', -1) -dbusservice.add_path('/Voltages/Cell10', -1) -dbusservice.add_path('/Voltages/Cell11', -1) -dbusservice.add_path('/Voltages/Cell12', -1) -dbusservice.add_path('/Voltages/Cell13', -1) -dbusservice.add_path('/Voltages/Cell14', -1) -dbusservice.add_path('/Voltages/Cell15', -1) -dbusservice.add_path('/Voltages/Cell16', -1) -dbusservice.add_path('/Voltages/Sum', -1) -dbusservice.add_path('/Voltages/Diff', -1) -dbusservice.add_path('/Voltages/Max', -1) -dbusservice.add_path('/Voltages/Min', -1) -dbusservice.add_path('/Voltages/UpdateTimestamp', -1) + # Victron packages + sys.path.insert(1, os.path.join(os.path.dirname(__file__), './ext/velib_python')) + from vedbus import VeDbusService -# Create the real values paths -dbusservice.add_path('/Raw/Info/Soc', -1) -dbusservice.add_path('/Raw/Info/CurrentMode', -1) -dbusservice.add_path('/Raw/Info/Current', -1) -dbusservice.add_path('/Raw/Info/Temp/Sensor1', -1) -dbusservice.add_path('/Raw/Info/Temp/Sensor2', -1) -dbusservice.add_path('/Raw/Info/ChargeEndVoltage', -1) -dbusservice.add_path('/Raw/Info/UpdateTimestamp', -1) -dbusservice.add_path('/Raw/Voltages/Cell1', -1) -dbusservice.add_path('/Raw/Voltages/Cell2', -1) -dbusservice.add_path('/Raw/Voltages/Cell3', -1) -dbusservice.add_path('/Raw/Voltages/Cell4', -1) -dbusservice.add_path('/Raw/Voltages/Cell5', -1) -dbusservice.add_path('/Raw/Voltages/Cell6', -1) -dbusservice.add_path('/Raw/Voltages/Cell7', -1) -dbusservice.add_path('/Raw/Voltages/Cell8', -1) -dbusservice.add_path('/Raw/Voltages/Cell9', -1) -dbusservice.add_path('/Raw/Voltages/Cell10', -1) -dbusservice.add_path('/Raw/Voltages/Cell11', -1) -dbusservice.add_path('/Raw/Voltages/Cell12', -1) -dbusservice.add_path('/Raw/Voltages/Cell13', -1) -dbusservice.add_path('/Raw/Voltages/Cell14', -1) -dbusservice.add_path('/Raw/Voltages/Cell15', -1) -dbusservice.add_path('/Raw/Voltages/Cell16', -1) -dbusservice.add_path('/Raw/Voltages/Sum', -1) -dbusservice.add_path('/Raw/Voltages/Diff', -1) -dbusservice.add_path('/Raw/Voltages/Max', -1) -dbusservice.add_path('/Raw/Voltages/Min', -1) -dbusservice.add_path('/Raw/Voltages/UpdateTimestamp', -1) + from dbus.mainloop.glib import DBusGMainLoop + DBusGMainLoop(set_as_default=True) + + dbusservice = VeDbusService(driver['connection']) + + # Create the management objects, as specified in the ccgx dbus-api document + dbusservice.add_path('/Mgmt/ProcessName', __file__) + dbusservice.add_path('/Mgmt/ProcessVersion', 'Unknown and Python ' + platform.python_version()) + dbusservice.add_path('/Mgmt/Connection', driver['connection']) + + # Create the mandatory objects + dbusservice.add_path('/DeviceInstance', driver['instance']) + dbusservice.add_path('/ProductId', driver['id']) + dbusservice.add_path('/ProductName', driver['name']) + dbusservice.add_path('/FirmwareVersion', driver['version']) + dbusservice.add_path('/HardwareVersion', driver['version']) + dbusservice.add_path('/Serial', driver['serial']) + dbusservice.add_path('/Connected', 1) + + # Create device list + dbusservice.add_path('/Devices/0/DeviceInstance', driver['instance']) + dbusservice.add_path('/Devices/0/FirmwareVersion', driver['version']) + dbusservice.add_path('/Devices/0/ProductId', driver['id']) + dbusservice.add_path('/Devices/0/ProductName', driver['name']) + dbusservice.add_path('/Devices/0/ServiceName', driver['servicename']) + dbusservice.add_path('/Devices/0/VregLink', "(API)") + + # Create the chargery bms paths + dbusservice.add_path('/Info/Soc', -1) + dbusservice.add_path('/Info/CurrentMode', -1) + dbusservice.add_path('/Info/Current', -1) + dbusservice.add_path('/Info/Temp/Sensor1', -1) + dbusservice.add_path('/Info/Temp/Sensor2', -1) + dbusservice.add_path('/Info/ChargeEndVoltage', -1) + dbusservice.add_path('/Info/UpdateTimestamp', -1) + dbusservice.add_path('/Voltages/Cell1', -1) + dbusservice.add_path('/Voltages/Cell2', -1) + dbusservice.add_path('/Voltages/Cell3', -1) + dbusservice.add_path('/Voltages/Cell4', -1) + dbusservice.add_path('/Voltages/Cell5', -1) + dbusservice.add_path('/Voltages/Cell6', -1) + dbusservice.add_path('/Voltages/Cell7', -1) + dbusservice.add_path('/Voltages/Cell8', -1) + dbusservice.add_path('/Voltages/Cell9', -1) + dbusservice.add_path('/Voltages/Cell10', -1) + dbusservice.add_path('/Voltages/Cell11', -1) + dbusservice.add_path('/Voltages/Cell12', -1) + dbusservice.add_path('/Voltages/Cell13', -1) + dbusservice.add_path('/Voltages/Cell14', -1) + dbusservice.add_path('/Voltages/Cell15', -1) + dbusservice.add_path('/Voltages/Cell16', -1) + dbusservice.add_path('/Voltages/Cell17', -1) + dbusservice.add_path('/Voltages/Cell18', -1) + dbusservice.add_path('/Voltages/Cell19', -1) + dbusservice.add_path('/Voltages/Cell20', -1) + dbusservice.add_path('/Voltages/Cell21', -1) + dbusservice.add_path('/Voltages/Cell22', -1) + dbusservice.add_path('/Voltages/Cell23', -1) + dbusservice.add_path('/Voltages/Cell24', -1) + dbusservice.add_path('/Voltages/Sum', -1) + dbusservice.add_path('/Voltages/Diff', -1) + dbusservice.add_path('/Voltages/Max', -1) + dbusservice.add_path('/Voltages/Min', -1) + dbusservice.add_path('/Voltages/BatteryCapacityWH', -1) + dbusservice.add_path('/Voltages/BatteryCapacityAH', -1) + dbusservice.add_path('/Voltages/UpdateTimestamp', -1) + dbusservice.add_path('/Impedances/InstantCurrentMode', -1) + dbusservice.add_path('/Impedances/InstantCurrent', -1) + dbusservice.add_path('/Impedances/Cell1', -1) + dbusservice.add_path('/Impedances/Cell2', -1) + dbusservice.add_path('/Impedances/Cell3', -1) + dbusservice.add_path('/Impedances/Cell4', -1) + dbusservice.add_path('/Impedances/Cell5', -1) + dbusservice.add_path('/Impedances/Cell6', -1) + dbusservice.add_path('/Impedances/Cell7', -1) + dbusservice.add_path('/Impedances/Cell8', -1) + dbusservice.add_path('/Impedances/Cell9', -1) + dbusservice.add_path('/Impedances/Cell10', -1) + dbusservice.add_path('/Impedances/Cell11', -1) + dbusservice.add_path('/Impedances/Cell12', -1) + dbusservice.add_path('/Impedances/Cell13', -1) + dbusservice.add_path('/Impedances/Cell14', -1) + dbusservice.add_path('/Impedances/Cell15', -1) + dbusservice.add_path('/Impedances/Cell16', -1) + dbusservice.add_path('/Impedances/Cell17', -1) + dbusservice.add_path('/Impedances/Cell18', -1) + dbusservice.add_path('/Impedances/Cell19', -1) + dbusservice.add_path('/Impedances/Cell20', -1) + dbusservice.add_path('/Impedances/Cell21', -1) + dbusservice.add_path('/Impedances/Cell22', -1) + dbusservice.add_path('/Impedances/Cell23', -1) + dbusservice.add_path('/Impedances/Cell24', -1) + dbusservice.add_path('/Impedances/Sum', -1) + dbusservice.add_path('/Impedances/Diff', -1) + dbusservice.add_path('/Impedances/Max', -1) + dbusservice.add_path('/Impedances/Min', -1) + dbusservice.add_path('/Impedances/UpdateTimestamp', -1) + # Create the real values paths + dbusservice.add_path('/Raw/Info/Soc', -1) + dbusservice.add_path('/Raw/Info/CurrentMode', -1) + dbusservice.add_path('/Raw/Info/Current', -1) + dbusservice.add_path('/Raw/Info/Temp/Sensor1', -1) + dbusservice.add_path('/Raw/Info/Temp/Sensor2', -1) + dbusservice.add_path('/Raw/Info/ChargeEndVoltage', -1) + dbusservice.add_path('/Raw/Info/UpdateTimestamp', -1) + dbusservice.add_path('/Raw/Voltages/Cell1', -1) + dbusservice.add_path('/Raw/Voltages/Cell2', -1) + dbusservice.add_path('/Raw/Voltages/Cell3', -1) + dbusservice.add_path('/Raw/Voltages/Cell4', -1) + dbusservice.add_path('/Raw/Voltages/Cell5', -1) + dbusservice.add_path('/Raw/Voltages/Cell6', -1) + dbusservice.add_path('/Raw/Voltages/Cell7', -1) + dbusservice.add_path('/Raw/Voltages/Cell8', -1) + dbusservice.add_path('/Raw/Voltages/Cell9', -1) + dbusservice.add_path('/Raw/Voltages/Cell10', -1) + dbusservice.add_path('/Raw/Voltages/Cell11', -1) + dbusservice.add_path('/Raw/Voltages/Cell12', -1) + dbusservice.add_path('/Raw/Voltages/Cell13', -1) + dbusservice.add_path('/Raw/Voltages/Cell14', -1) + dbusservice.add_path('/Raw/Voltages/Cell15', -1) + dbusservice.add_path('/Raw/Voltages/Cell16', -1) + dbusservice.add_path('/Raw/Voltages/Cell17', -1) + dbusservice.add_path('/Raw/Voltages/Cell18', -1) + dbusservice.add_path('/Raw/Voltages/Cell19', -1) + dbusservice.add_path('/Raw/Voltages/Cell20', -1) + dbusservice.add_path('/Raw/Voltages/Cell21', -1) + dbusservice.add_path('/Raw/Voltages/Cell22', -1) + dbusservice.add_path('/Raw/Voltages/Cell23', -1) + dbusservice.add_path('/Raw/Voltages/Cell24', -1) + dbusservice.add_path('/Raw/Voltages/Sum', -1) + dbusservice.add_path('/Raw/Voltages/Diff', -1) + dbusservice.add_path('/Raw/Voltages/Max', -1) + dbusservice.add_path('/Raw/Voltages/Min', -1) + dbusservice.add_path('/Raw/Voltages/BatteryCapacityWH', -1) + dbusservice.add_path('/Raw/Voltages/BatteryCapacityAH', -1) + dbusservice.add_path('/Raw/Voltages/UpdateTimestamp', -1) + dbusservice.add_path('/Raw/Impedances/InstantCurrentMode', -1) + dbusservice.add_path('/Raw/Impedances/InstantCurrent', -1) + dbusservice.add_path('/Raw/Impedances/Cell1', -1) + dbusservice.add_path('/Raw/Impedances/Cell2', -1) + dbusservice.add_path('/Raw/Impedances/Cell3', -1) + dbusservice.add_path('/Raw/Impedances/Cell4', -1) + dbusservice.add_path('/Raw/Impedances/Cell5', -1) + dbusservice.add_path('/Raw/Impedances/Cell6', -1) + dbusservice.add_path('/Raw/Impedances/Cell7', -1) + dbusservice.add_path('/Raw/Impedances/Cell8', -1) + dbusservice.add_path('/Raw/Impedances/Cell9', -1) + dbusservice.add_path('/Raw/Impedances/Cell10', -1) + dbusservice.add_path('/Raw/Impedances/Cell11', -1) + dbusservice.add_path('/Raw/Impedances/Cell12', -1) + dbusservice.add_path('/Raw/Impedances/Cell13', -1) + dbusservice.add_path('/Raw/Impedances/Cell14', -1) + dbusservice.add_path('/Raw/Impedances/Cell15', -1) + dbusservice.add_path('/Raw/Impedances/Cell16', -1) + dbusservice.add_path('/Raw/Impedances/Cell17', -1) + dbusservice.add_path('/Raw/Impedances/Cell18', -1) + dbusservice.add_path('/Raw/Impedances/Cell19', -1) + dbusservice.add_path('/Raw/Impedances/Cell20', -1) + dbusservice.add_path('/Raw/Impedances/Cell21', -1) + dbusservice.add_path('/Raw/Impedances/Cell22', -1) + dbusservice.add_path('/Raw/Impedances/Cell23', -1) + dbusservice.add_path('/Raw/Impedances/Cell24', -1) + dbusservice.add_path('/Raw/Impedances/Sum', -1) + dbusservice.add_path('/Raw/Impedances/Diff', -1) + dbusservice.add_path('/Raw/Impedances/Max', -1) + dbusservice.add_path('/Raw/Impedances/Min', -1) + dbusservice.add_path('/Raw/Impedances/UpdateTimestamp', -1) -PACKET_HEADER = 0x24 -PACKET_STATUS_CELLS = 0x56 -PACKET_STATUS_BMS = 0x57 -PACKET_LENGTH_MINIMUM = 15 -PACKET_LENGTH_STATUS_CELLS = 38 -PACKET_LENGTH_STATUS_BMS = 15 +PACKET_HEADER = 0x24 +PACKET_STATUS_CELLS = 0x56 +PACKET_STATUS_BMS = 0x57 +PACKET_STATUS_IMPEDANCES = 0x58 -MIN_CELL_VOLTAGE = 1.0 +PACKET_LENGTH_MINIMUM = 15 +PACKET_LENGTH_STATUS_CELLS = [29, 45, 61] +PACKET_LENGTH_STATUS_BMS = [15] +PACKET_LENGTH_STATUS_IMPEDANCES = [24, 40, 56] + + +MIN_CELL_VOLTAGE = 1.0 +MIN_CELL_IMPEDANCE = 0.1 BMS_STATUS = { 'bms' : { @@ -176,7 +273,7 @@ BMS_STATUS = { 'text' : "" } }, - 'cells' : { + 'voltages' : { 'cell1_voltage' : { 'value' : -1, 'text' : "" @@ -241,6 +338,38 @@ BMS_STATUS = { 'value' : -1, 'text' : "" }, + 'cell17_voltage' : { + 'value' : -1, + 'text' : "" + }, + 'cell18_voltage' : { + 'value' : -1, + 'text' : "" + }, + 'cell19_voltage' : { + 'value' : -1, + 'text' : "" + }, + 'cell20_voltage' : { + 'value' : -1, + 'text' : "" + }, + 'cell21_voltage' : { + 'value' : -1, + 'text' : "" + }, + 'cell22_voltage' : { + 'value' : -1, + 'text' : "" + }, + 'cell23_voltage' : { + 'value' : -1, + 'text' : "" + }, + 'cell24_voltage' : { + 'value' : -1, + 'text' : "" + }, 'agg_voltages' : { 'sum' : { 'value' : -1, @@ -259,11 +388,144 @@ BMS_STATUS = { 'text' : "" } }, + 'battery_capacity_wh' : { + 'value' : -1, + 'text' : "" + }, + 'battery_capacity_ah' : { + 'value' : -1, + 'text' : "" + }, + 'timestamp' : { + 'value' : -1, + 'text' : "" + } + }, + 'impedances' : { + 'cell1_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell2_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell3_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell4_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell5_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell6_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell7_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell8_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell9_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell10_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell11_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell12_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell13_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell14_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell15_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell16_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell17_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell18_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell20_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell21_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell22_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell23_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'cell24_impedance' : { + 'value' : -1, + 'text' : "" + }, + 'agg_impedances' : { + 'sum' : { + 'value' : -1, + 'text' : "" + }, + 'max' : { + 'value' : -1, + 'text' : "" + }, + 'min' : { + 'value' : -1, + 'text' : "" + }, + 'diff' : { + 'value' : -1, + 'text' : "" + } + }, + 'battery_capacity_wh' : { + 'value' : -1, + 'text' : "" + }, + 'battery_capacity_ah' : { + 'value' : -1, + 'text' : "" + }, 'timestamp' : { 'value' : -1, 'text' : "" } } + } @@ -298,8 +560,20 @@ def get_current_value(byte1, byte2): return float((float(byte1 * 256) + float(byte2)) / 10) +def get_current1_value(byte1, byte2): + return float((float(byte1) + float(byte2 * 256)) / 10) + + def get_temperature_value(byte1, byte2): return float((float(byte1 * 256) + float(byte2)) / 10) + + +def get_battery_capacity(byte1, byte2, byte3, byte4): + return float((float(byte1) + float(byte2 * 256) + float(byte3 * 256 * 256) + float(byte4 * 256 * 256 * 256)) / 1000) + + +def get_cell_impedance(byte1, byte2): + return float((float(byte1) + float(byte2 * 256)) / 10) @@ -321,33 +595,23 @@ def parse_packet(packet): if ((ord(packet[0]) == PACKET_HEADER) and (ord(packet[1]) == PACKET_HEADER)): packet_length = ord(packet[3]) logging.debug("Packet Length [" + str (packet_length) + " bytes]") - # debug_packet(packet) + debug_packet(packet) if (ord(packet[2]) == PACKET_STATUS_BMS): - if (len(packet) < PACKET_LENGTH_STATUS_BMS): + if (len(packet) < PACKET_LENGTH_STATUS_BMS[0]): logging.debug("Packet Status BMS too short, skip") packet = "" else: - logging.debug("Packet Status BMS") # checksum value checksum = ord(packet[14]) # calculate checksum checksum_check = (ord(packet[0]) - + ord(packet[1]) - + ord(packet[2]) - + ord(packet[3]) - + ord(packet[4]) - + ord(packet[5]) - + ord(packet[6]) - + ord(packet[7]) - + ord(packet[8]) - + ord(packet[9]) - + ord(packet[10]) - + ord(packet[11]) - + ord(packet[12]) + + ord(packet[1]) + ord(packet[2]) + ord(packet[3]) + ord(packet[4]) + + ord(packet[5]) + ord(packet[6]) + ord(packet[7]) + ord(packet[8]) + + ord(packet[9]) + ord(packet[10]) + ord(packet[11]) + ord(packet[12]) + ord(packet[13])) % 256 logging.debug("Packet Checksum : " + str(checksum) + "|" + str(checksum_check)) @@ -357,8 +621,9 @@ def parse_packet(packet): # charge end voltage BMS_STATUS['bms']['charged_end_voltage']['value'] = get_voltage_value(ord(packet[4]), ord(packet[5])) BMS_STATUS['bms']['charged_end_voltage']['text'] = "{:.2f}".format(BMS_STATUS['bms']['charged_end_voltage']['value']) + "V" - dbusservice["/Info/ChargeEndVoltage"] = BMS_STATUS['bms']['charged_end_voltage']['text'] - dbusservice["/Raw/Info/ChargeEndVoltage"] = BMS_STATUS['bms']['charged_end_voltage']['value'] + if args.victron: + dbusservice["/Info/ChargeEndVoltage"] = BMS_STATUS['bms']['charged_end_voltage']['text'] + dbusservice["/Raw/Info/ChargeEndVoltage"] = BMS_STATUS['bms']['charged_end_voltage']['value'] # actual current BMS_STATUS['bms']['current']['value'] = get_current_value(ord(packet[7]), ord(packet[8])) @@ -372,7 +637,7 @@ def parse_packet(packet): elif (bms_charge_mode == 0x01): BMS_STATUS['bms']['current_mode']['value'] = 1 BMS_STATUS['bms']['current_mode']['text'] = "Charge" - BMS_STATUS['bms']['current']['text'] = "+" + str(BMS_STATUS['bms']['current']['value']) + "A" + BMS_STATUS['bms']['current']['text'] = str(BMS_STATUS['bms']['current']['value']) + "A" elif (bms_charge_mode == 0x02): BMS_STATUS['bms']['current_mode']['value'] = 2 BMS_STATUS['bms']['current_mode']['text'] = "Storage" @@ -381,12 +646,12 @@ def parse_packet(packet): BMS_STATUS['bms']['current_mode']['value'] = -1 BMS_STATUS['bms']['current_mode']['text'] = "" BMS_STATUS['bms']['current']['text'] = "" - - dbusservice["/Info/CurrentMode"] = BMS_STATUS['bms']['current_mode']['text'] - dbusservice["/Info/Current"] = BMS_STATUS['bms']['current']['text'] - - dbusservice["/Raw/Info/CurrentMode"] = BMS_STATUS['bms']['current_mode']['value'] - dbusservice["/Raw/Info/Current"] = BMS_STATUS['bms']['current']['value'] + + if args.victron: + dbusservice["/Info/CurrentMode"] = BMS_STATUS['bms']['current_mode']['text'] + dbusservice["/Info/Current"] = BMS_STATUS['bms']['current']['text'] + dbusservice["/Raw/Info/CurrentMode"] = BMS_STATUS['bms']['current_mode']['value'] + dbusservice["/Raw/Info/Current"] = BMS_STATUS['bms']['current']['value'] # current temperatures BMS_STATUS['bms']['temperature']['sensor_t1']['value'] = get_temperature_value(ord(packet[9]), ord(packet[10])) @@ -394,23 +659,26 @@ def parse_packet(packet): BMS_STATUS['bms']['temperature']['sensor_t2']['value'] = get_temperature_value(ord(packet[11]), ord(packet[12])) BMS_STATUS['bms']['temperature']['sensor_t2']['text'] = str(BMS_STATUS['bms']['temperature']['sensor_t2']['value']) + "C" - dbusservice["/Info/Temp/Sensor1"] = BMS_STATUS['bms']['temperature']['sensor_t1']['text'] - dbusservice["/Info/Temp/Sensor2"] = BMS_STATUS['bms']['temperature']['sensor_t2']['text'] - dbusservice["/Raw/Info/Temp/Sensor1"] = BMS_STATUS['bms']['temperature']['sensor_t1']['value'] - dbusservice["/Raw/Info/Temp/Sensor2"] = BMS_STATUS['bms']['temperature']['sensor_t2']['value'] + if args.victron: + dbusservice["/Info/Temp/Sensor1"] = BMS_STATUS['bms']['temperature']['sensor_t1']['text'] + dbusservice["/Info/Temp/Sensor2"] = BMS_STATUS['bms']['temperature']['sensor_t2']['text'] + dbusservice["/Raw/Info/Temp/Sensor1"] = BMS_STATUS['bms']['temperature']['sensor_t1']['value'] + dbusservice["/Raw/Info/Temp/Sensor2"] = BMS_STATUS['bms']['temperature']['sensor_t2']['value'] # soc value BMS_STATUS['bms']['soc']['value'] = ord(packet[13]) BMS_STATUS['bms']['soc']['text'] = str(ord(packet[13])) + "%" - dbusservice["/Info/Soc"] = BMS_STATUS['bms']['soc']['text'] - dbusservice["/Raw/Info/Soc"] = BMS_STATUS['bms']['soc']['value'] + if args.victron: + dbusservice["/Info/Soc"] = BMS_STATUS['bms']['soc']['text'] + dbusservice["/Raw/Info/Soc"] = BMS_STATUS['bms']['soc']['value'] # update timestamp current_date = datetime.datetime.now() BMS_STATUS['bms']['timestamp']['value'] = time.time() BMS_STATUS['bms']['timestamp']['text'] = current_date.strftime('%a %d.%m.%Y %H:%M:%S') - dbusservice["/Info/UpdateTimestamp"] = BMS_STATUS['bms']['timestamp']['text'] - dbusservice["/Raw/Info/UpdateTimestamp"] = BMS_STATUS['bms']['timestamp']['value'] + if args.victron: + dbusservice["/Info/UpdateTimestamp"] = BMS_STATUS['bms']['timestamp']['text'] + dbusservice["/Raw/Info/UpdateTimestamp"] = BMS_STATUS['bms']['timestamp']['value'] # print (BMS_STATUS) @@ -429,212 +697,837 @@ def parse_packet(packet): elif (ord(packet[2]) == PACKET_STATUS_CELLS): - if (len(packet) < PACKET_LENGTH_STATUS_CELLS): + if (len(packet) < PACKET_LENGTH_STATUS_CELLS[0]): logging.debug("Packet Status Cells too short, skip") packet = "" else: - logging.debug("Packet Status Cells") # checksum value - checksum = ord(packet[37]) + checksum = 0 + checksum_check = -1 - # calculate checksum - checksum_check = (ord(packet[0]) - + ord(packet[1]) - + ord(packet[2]) - + ord(packet[3]) - + ord(packet[4]) - + ord(packet[5]) - + ord(packet[6]) - + ord(packet[7]) - + ord(packet[8]) - + ord(packet[9]) - + ord(packet[10]) - + ord(packet[11]) - + ord(packet[12]) - + ord(packet[13]) - + ord(packet[14]) - + ord(packet[15]) - + ord(packet[16]) - + ord(packet[17]) - + ord(packet[18]) - + ord(packet[19]) - + ord(packet[20]) - + ord(packet[21]) - + ord(packet[22]) - + ord(packet[23]) - + ord(packet[24]) - + ord(packet[25]) - + ord(packet[26]) - + ord(packet[27]) - + ord(packet[28]) - + ord(packet[29]) - + ord(packet[30]) - + ord(packet[31]) - + ord(packet[32]) - + ord(packet[33]) - + ord(packet[34]) - + ord(packet[35]) - + ord(packet[36])) % 256 - logging.debug("Packet Checksum : " + str(checksum) + "|" + str(checksum_check)) + if (packet_length == PACKET_LENGTH_STATUS_CELLS[0]): # packet from BMS8 + logging.debug("Packet Status Cells BMS8") + + if (len(packet) < PACKET_LENGTH_STATUS_CELLS[0]): + logging.debug("Packet Status Cells too short, skip") + packet = "" + else: + + # checksum value + checksum = ord(packet[28]) + + # calculate checksum + checksum_check = (ord(packet[0]) + + ord(packet[1]) + ord(packet[2]) + ord(packet[3]) + ord(packet[4]) + ord(packet[5]) + + ord(packet[6]) + ord(packet[7]) + ord(packet[8]) + ord(packet[9]) + ord(packet[10]) + + ord(packet[11]) + ord(packet[12]) + ord(packet[13]) + ord(packet[14]) + ord(packet[15]) + + ord(packet[16]) + ord(packet[17]) + ord(packet[18]) + ord(packet[19]) + ord(packet[20]) + + ord(packet[21]) + ord(packet[22]) + ord(packet[23]) + ord(packet[24]) + ord(packet[25]) + + ord(packet[26]) + ord(packet[27])) % 256 + logging.debug("Packet Checksum BMS8: " + str(checksum) + "|" + str(checksum_check)) + elif (packet_length == PACKET_LENGTH_STATUS_CELLS[1]): # packet from BMS16 + logging.debug("Packet Status Cells BMS16") + + if (len(packet) < PACKET_LENGTH_STATUS_CELLS[1]): + logging.debug("Packet Status Cells too short, skip") + packet = "" + else: + + # checksum value + checksum = ord(packet[44]) + + # calculate checksum + checksum_check = (ord(packet[0]) + + ord(packet[1]) + ord(packet[2]) + ord(packet[3]) + ord(packet[4]) + ord(packet[5]) + + ord(packet[6]) + ord(packet[7]) + ord(packet[8]) + ord(packet[9]) + ord(packet[10]) + + ord(packet[11]) + ord(packet[12]) + ord(packet[13]) + ord(packet[14]) + ord(packet[15]) + + ord(packet[16]) + ord(packet[17]) + ord(packet[18]) + ord(packet[19]) + ord(packet[20]) + + ord(packet[21]) + ord(packet[22]) + ord(packet[23]) + ord(packet[24]) + ord(packet[25]) + + ord(packet[26]) + ord(packet[27]) + ord(packet[28]) + ord(packet[29]) + ord(packet[30]) + + ord(packet[31]) + ord(packet[32]) + ord(packet[33]) + ord(packet[34]) + ord(packet[35]) + + ord(packet[36]) + ord(packet[37]) + ord(packet[38]) + ord(packet[39]) + ord(packet[40]) + + ord(packet[41]) + ord(packet[42]) + ord(packet[43])) % 256 + logging.debug("Packet Checksum BMS16: " + str(checksum) + "|" + str(checksum_check)) + + elif (packet_length == PACKET_LENGTH_STATUS_CELLS[2]): # packet from BMS24 + logging.debug("Packet Status Cells BMS24") + + if (len(packet) < PACKET_LENGTH_STATUS_CELLS[2]): + logging.debug("Packet Status Cells too short, skip") + packet = "" + else: + + # checksum value + checksum = ord(packet[60]) + + # calculate checksum + checksum_check = (ord(packet[0]) + + ord(packet[1]) + ord(packet[2]) + ord(packet[3]) + ord(packet[4]) + ord(packet[5]) + + ord(packet[6]) + ord(packet[7]) + ord(packet[8]) + ord(packet[9]) + ord(packet[10]) + + ord(packet[11]) + ord(packet[12]) + ord(packet[13]) + ord(packet[14]) + ord(packet[15]) + + ord(packet[16]) + ord(packet[17]) + ord(packet[18]) + ord(packet[19]) + ord(packet[20]) + + ord(packet[21]) + ord(packet[22]) + ord(packet[23]) + ord(packet[24]) + ord(packet[25]) + + ord(packet[26]) + ord(packet[27]) + ord(packet[28]) + ord(packet[29]) + ord(packet[30]) + + ord(packet[31]) + ord(packet[32]) + ord(packet[33]) + ord(packet[34]) + ord(packet[35]) + + ord(packet[36]) + ord(packet[37]) + ord(packet[38]) + ord(packet[39]) + ord(packet[40]) + + ord(packet[41]) + ord(packet[42]) + ord(packet[43]) + ord(packet[44]) + ord(packet[45]) + + ord(packet[46]) + ord(packet[47]) + ord(packet[48]) + ord(packet[49]) + ord(packet[50]) + + ord(packet[51]) + ord(packet[52]) + ord(packet[53]) + ord(packet[54]) + ord(packet[55]) + + ord(packet[56]) + ord(packet[57]) + ord(packet[58]) + ord(packet[59])) % 256 + logging.debug("Packet Checksum BMS16: " + str(checksum) + "|" + str(checksum_check)) + + # data integrity does match if (checksum == checksum_check): - # cell voltages - BMS_STATUS['cells']['cell1_voltage']['value'] = get_voltage_value(ord(packet[4]), ord(packet[5])) - BMS_STATUS['cells']['cell1_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell1_voltage']['value']) + "V" - dbusservice["/Voltages/Cell1"] = BMS_STATUS['cells']['cell1_voltage']['text'] - dbusservice["/Raw/Voltages/Cell1"] = BMS_STATUS['cells']['cell1_voltage']['value'] + # cell voltages BMS8 + BMS_STATUS['voltages']['cell1_voltage']['value'] = get_voltage_value(ord(packet[4]), ord(packet[5])) + BMS_STATUS['voltages']['cell1_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell1_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell1"] = BMS_STATUS['voltages']['cell1_voltage']['text'] + dbusservice["/Raw/Voltages/Cell1"] = BMS_STATUS['voltages']['cell1_voltage']['value'] - BMS_STATUS['cells']['cell2_voltage']['value'] = get_voltage_value(ord(packet[6]), ord(packet[7])) - BMS_STATUS['cells']['cell2_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell2_voltage']['value']) + "V" - dbusservice["/Voltages/Cell2"] = BMS_STATUS['cells']['cell2_voltage']['text'] - dbusservice["/Raw/Voltages/Cell2"] = BMS_STATUS['cells']['cell2_voltage']['value'] + BMS_STATUS['voltages']['cell2_voltage']['value'] = get_voltage_value(ord(packet[6]), ord(packet[7])) + BMS_STATUS['voltages']['cell2_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell2_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell2"] = BMS_STATUS['voltages']['cell2_voltage']['text'] + dbusservice["/Raw/Voltages/Cell2"] = BMS_STATUS['voltages']['cell2_voltage']['value'] - BMS_STATUS['cells']['cell3_voltage']['value'] = get_voltage_value(ord(packet[8]), ord(packet[9])) - BMS_STATUS['cells']['cell3_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell3_voltage']['value']) + "V" - dbusservice["/Voltages/Cell3"] = BMS_STATUS['cells']['cell3_voltage']['text'] - dbusservice["/Raw/Voltages/Cell3"] = BMS_STATUS['cells']['cell3_voltage']['value'] + BMS_STATUS['voltages']['cell3_voltage']['value'] = get_voltage_value(ord(packet[8]), ord(packet[9])) + BMS_STATUS['voltages']['cell3_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell3_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell3"] = BMS_STATUS['voltages']['cell3_voltage']['text'] + dbusservice["/Raw/Voltages/Cell3"] = BMS_STATUS['voltages']['cell3_voltage']['value'] - BMS_STATUS['cells']['cell4_voltage']['value'] = get_voltage_value(ord(packet[10]), ord(packet[11])) - BMS_STATUS['cells']['cell4_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell4_voltage']['value']) + "V" - dbusservice["/Voltages/Cell4"] = BMS_STATUS['cells']['cell4_voltage']['text'] - dbusservice["/Raw/Voltages/Cell4"] = BMS_STATUS['cells']['cell4_voltage']['value'] + BMS_STATUS['voltages']['cell4_voltage']['value'] = get_voltage_value(ord(packet[10]), ord(packet[11])) + BMS_STATUS['voltages']['cell4_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell4_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell4"] = BMS_STATUS['voltages']['cell4_voltage']['text'] + dbusservice["/Raw/Voltages/Cell4"] = BMS_STATUS['voltages']['cell4_voltage']['value'] - BMS_STATUS['cells']['cell5_voltage']['value'] = get_voltage_value(ord(packet[12]), ord(packet[13])) - BMS_STATUS['cells']['cell5_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell5_voltage']['value']) + "V" - dbusservice["/Voltages/Cell5"] = BMS_STATUS['cells']['cell5_voltage']['text'] - dbusservice["/Raw/Voltages/Cell5"] = BMS_STATUS['cells']['cell5_voltage']['value'] + BMS_STATUS['voltages']['cell5_voltage']['value'] = get_voltage_value(ord(packet[12]), ord(packet[13])) + BMS_STATUS['voltages']['cell5_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell5_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell5"] = BMS_STATUS['voltages']['cell5_voltage']['text'] + dbusservice["/Raw/Voltages/Cell5"] = BMS_STATUS['voltages']['cell5_voltage']['value'] - BMS_STATUS['cells']['cell6_voltage']['value'] = get_voltage_value(ord(packet[14]), ord(packet[15])) - BMS_STATUS['cells']['cell6_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell6_voltage']['value']) + "V" - dbusservice["/Voltages/Cell6"] = BMS_STATUS['cells']['cell6_voltage']['text'] - dbusservice["/Raw/Voltages/Cell6"] = BMS_STATUS['cells']['cell6_voltage']['value'] + BMS_STATUS['voltages']['cell6_voltage']['value'] = get_voltage_value(ord(packet[14]), ord(packet[15])) + BMS_STATUS['voltages']['cell6_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell6_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell6"] = BMS_STATUS['voltages']['cell6_voltage']['text'] + dbusservice["/Raw/Voltages/Cell6"] = BMS_STATUS['voltages']['cell6_voltage']['value'] - BMS_STATUS['cells']['cell7_voltage']['value'] = get_voltage_value(ord(packet[16]), ord(packet[17])) - BMS_STATUS['cells']['cell7_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell7_voltage']['value']) + "V" - dbusservice["/Voltages/Cell7"] = BMS_STATUS['cells']['cell7_voltage']['text'] - dbusservice["/Raw/Voltages/Cell7"] = BMS_STATUS['cells']['cell7_voltage']['value'] + BMS_STATUS['voltages']['cell7_voltage']['value'] = get_voltage_value(ord(packet[16]), ord(packet[17])) + BMS_STATUS['voltages']['cell7_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell7_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell7"] = BMS_STATUS['voltages']['cell7_voltage']['text'] + dbusservice["/Raw/Voltages/Cell7"] = BMS_STATUS['voltages']['cell7_voltage']['value'] - BMS_STATUS['cells']['cell8_voltage']['value'] = get_voltage_value(ord(packet[18]), ord(packet[19])) - BMS_STATUS['cells']['cell8_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell8_voltage']['value']) + "V" - dbusservice["/Voltages/Cell8"] = BMS_STATUS['cells']['cell8_voltage']['text'] - dbusservice["/Raw/Voltages/Cell8"] = BMS_STATUS['cells']['cell8_voltage']['value'] + BMS_STATUS['voltages']['cell8_voltage']['value'] = get_voltage_value(ord(packet[18]), ord(packet[19])) + BMS_STATUS['voltages']['cell8_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell8_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell8"] = BMS_STATUS['voltages']['cell8_voltage']['text'] + dbusservice["/Raw/Voltages/Cell8"] = BMS_STATUS['voltages']['cell8_voltage']['value'] - BMS_STATUS['cells']['cell9_voltage']['value'] = get_voltage_value(ord(packet[20]), ord(packet[21])) - BMS_STATUS['cells']['cell9_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell9_voltage']['value']) + "V" - dbusservice["/Voltages/Cell9"] = BMS_STATUS['cells']['cell9_voltage']['text'] - dbusservice["/Raw/Voltages/Cell9"] = BMS_STATUS['cells']['cell9_voltage']['value'] + if (packet_length == PACKET_LENGTH_STATUS_CELLS[1]): # packet from BMS16 - BMS_STATUS['cells']['cell10_voltage']['value'] = get_voltage_value(ord(packet[22]), ord(packet[23])) - BMS_STATUS['cells']['cell10_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell10_voltage']['value']) + "V" - dbusservice["/Voltages/Cell10"] = BMS_STATUS['cells']['cell10_voltage']['text'] - dbusservice["/Raw/Voltages/Cell10"] = BMS_STATUS['cells']['cell10_voltage']['value'] + BMS_STATUS['voltages']['cell9_voltage']['value'] = get_voltage_value(ord(packet[20]), ord(packet[21])) + BMS_STATUS['voltages']['cell9_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell9_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell9"] = BMS_STATUS['voltages']['cell9_voltage']['text'] + dbusservice["/Raw/Voltages/Cell9"] = BMS_STATUS['voltages']['cell9_voltage']['value'] - BMS_STATUS['cells']['cell11_voltage']['value'] = get_voltage_value(ord(packet[24]), ord(packet[25])) - BMS_STATUS['cells']['cell11_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell11_voltage']['value']) + "V" - dbusservice["/Voltages/Cell11"] = BMS_STATUS['cells']['cell11_voltage']['text'] - dbusservice["/Raw/Voltages/Cell11"] = BMS_STATUS['cells']['cell11_voltage']['value'] + BMS_STATUS['voltages']['cell10_voltage']['value'] = get_voltage_value(ord(packet[22]), ord(packet[23])) + BMS_STATUS['voltages']['cell10_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell10_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell10"] = BMS_STATUS['voltages']['cell10_voltage']['text'] + dbusservice["/Raw/Voltages/Cell10"] = BMS_STATUS['voltages']['cell10_voltage']['value'] - BMS_STATUS['cells']['cell12_voltage']['value'] = get_voltage_value(ord(packet[26]), ord(packet[27])) - BMS_STATUS['cells']['cell12_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell12_voltage']['value']) + "V" - dbusservice["/Voltages/Cell12"] = BMS_STATUS['cells']['cell12_voltage']['text'] - dbusservice["/Raw/Voltages/Cell12"] = BMS_STATUS['cells']['cell12_voltage']['value'] + BMS_STATUS['voltages']['cell11_voltage']['value'] = get_voltage_value(ord(packet[24]), ord(packet[25])) + BMS_STATUS['voltages']['cell11_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell11_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell11"] = BMS_STATUS['voltages']['cell11_voltage']['text'] + dbusservice["/Raw/Voltages/Cell11"] = BMS_STATUS['voltages']['cell11_voltage']['value'] - BMS_STATUS['cells']['cell13_voltage']['value'] = get_voltage_value(ord(packet[28]), ord(packet[29])) - BMS_STATUS['cells']['cell13_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell13_voltage']['value']) + "V" - dbusservice["/Voltages/Cell13"] = BMS_STATUS['cells']['cell13_voltage']['text'] - dbusservice["/Raw/Voltages/Cell13"] = BMS_STATUS['cells']['cell13_voltage']['value'] + BMS_STATUS['voltages']['cell12_voltage']['value'] = get_voltage_value(ord(packet[26]), ord(packet[27])) + BMS_STATUS['voltages']['cell12_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell12_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell12"] = BMS_STATUS['voltages']['cell12_voltage']['text'] + dbusservice["/Raw/Voltages/Cell12"] = BMS_STATUS['voltages']['cell12_voltage']['value'] - BMS_STATUS['cells']['cell14_voltage']['value'] = get_voltage_value(ord(packet[30]), ord(packet[31])) - BMS_STATUS['cells']['cell14_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell14_voltage']['value']) + "V" - dbusservice["/Voltages/Cell14"] = BMS_STATUS['cells']['cell14_voltage']['text'] - dbusservice["/Raw/Voltages/Cell14"] = BMS_STATUS['cells']['cell14_voltage']['value'] + BMS_STATUS['voltages']['cell13_voltage']['value'] = get_voltage_value(ord(packet[28]), ord(packet[29])) + BMS_STATUS['voltages']['cell13_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell13_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell13"] = BMS_STATUS['voltages']['cell13_voltage']['text'] + dbusservice["/Raw/Voltages/Cell13"] = BMS_STATUS['voltages']['cell13_voltage']['value'] - BMS_STATUS['cells']['cell15_voltage']['value'] = get_voltage_value(ord(packet[32]), ord(packet[33])) - BMS_STATUS['cells']['cell15_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell15_voltage']['value']) + "V" - dbusservice["/Voltages/Cell15"] = BMS_STATUS['cells']['cell15_voltage']['text'] - dbusservice["/Raw/Voltages/Cell15"] = BMS_STATUS['cells']['cell15_voltage']['value'] + BMS_STATUS['voltages']['cell14_voltage']['value'] = get_voltage_value(ord(packet[30]), ord(packet[31])) + BMS_STATUS['voltages']['cell14_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell14_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell14"] = BMS_STATUS['voltages']['cell14_voltage']['text'] + dbusservice["/Raw/Voltages/Cell14"] = BMS_STATUS['voltages']['cell14_voltage']['value'] - BMS_STATUS['cells']['cell16_voltage']['value'] = get_voltage_value(ord(packet[34]), ord(packet[35])) - BMS_STATUS['cells']['cell16_voltage']['text'] = "{:.3f}".format(BMS_STATUS['cells']['cell16_voltage']['value']) + "V" - dbusservice["/Voltages/Cell16"] = BMS_STATUS['cells']['cell16_voltage']['text'] - dbusservice["/Raw/Voltages/Cell16"] = BMS_STATUS['cells']['cell16_voltage']['value'] + BMS_STATUS['voltages']['cell15_voltage']['value'] = get_voltage_value(ord(packet[32]), ord(packet[33])) + BMS_STATUS['voltages']['cell15_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell15_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell15"] = BMS_STATUS['voltages']['cell15_voltage']['text'] + dbusservice["/Raw/Voltages/Cell15"] = BMS_STATUS['voltages']['cell15_voltage']['value'] + + BMS_STATUS['voltages']['cell16_voltage']['value'] = get_voltage_value(ord(packet[34]), ord(packet[35])) + BMS_STATUS['voltages']['cell16_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell16_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell16"] = BMS_STATUS['voltages']['cell16_voltage']['text'] + dbusservice["/Raw/Voltages/Cell16"] = BMS_STATUS['voltages']['cell16_voltage']['value'] + + + if (packet_length == PACKET_LENGTH_STATUS_CELLS[2]): # packet from BMS24 + + BMS_STATUS['voltages']['cell17_voltage']['value'] = get_voltage_value(ord(packet[36]), ord(packet[37])) + BMS_STATUS['voltages']['cell17_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell17_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell17"] = BMS_STATUS['voltages']['cell17_voltage']['text'] + dbusservice["/Raw/Voltages/Cell17"] = BMS_STATUS['voltages']['cell17_voltage']['value'] + + BMS_STATUS['voltages']['cell18_voltage']['value'] = get_voltage_value(ord(packet[38]), ord(packet[39])) + BMS_STATUS['voltages']['cell18_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell18_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell18"] = BMS_STATUS['voltages']['cell18_voltage']['text'] + dbusservice["/Raw/Voltages/Cell18"] = BMS_STATUS['voltages']['cell18_voltage']['value'] + + BMS_STATUS['voltages']['cell19_voltage']['value'] = get_voltage_value(ord(packet[40]), ord(packet[41])) + BMS_STATUS['voltages']['cell19_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell19_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell19"] = BMS_STATUS['voltages']['cell19_voltage']['text'] + dbusservice["/Raw/Voltages/Cell19"] = BMS_STATUS['voltages']['cell19_voltage']['value'] + + BMS_STATUS['voltages']['cell20_voltage']['value'] = get_voltage_value(ord(packet[42]), ord(packet[43])) + BMS_STATUS['voltages']['cell20_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell20_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell20"] = BMS_STATUS['voltages']['cell20_voltage']['text'] + dbusservice["/Raw/Voltages/Cell20"] = BMS_STATUS['voltages']['cell20_voltage']['value'] + + BMS_STATUS['voltages']['cell21_voltage']['value'] = get_voltage_value(ord(packet[44]), ord(packet[45])) + BMS_STATUS['voltages']['cell21_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell21_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell21"] = BMS_STATUS['voltages']['cell21_voltage']['text'] + dbusservice["/Raw/Voltages/Cell21"] = BMS_STATUS['voltages']['cell21_voltage']['value'] + + BMS_STATUS['voltages']['cell22_voltage']['value'] = get_voltage_value(ord(packet[46]), ord(packet[47])) + BMS_STATUS['voltages']['cell22_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell22_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell22"] = BMS_STATUS['voltages']['cell22_voltage']['text'] + dbusservice["/Raw/Voltages/Cell22"] = BMS_STATUS['voltages']['cell22_voltage']['value'] + + BMS_STATUS['voltages']['cell23_voltage']['value'] = get_voltage_value(ord(packet[48]), ord(packet[49])) + BMS_STATUS['voltages']['cell23_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell23_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell23"] = BMS_STATUS['voltages']['cell23_voltage']['text'] + dbusservice["/Raw/Voltages/Cell23"] = BMS_STATUS['voltages']['cell23_voltage']['value'] + + BMS_STATUS['voltages']['cell24_voltage']['value'] = get_voltage_value(ord(packet[50]), ord(packet[51])) + BMS_STATUS['voltages']['cell24_voltage']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['cell24_voltage']['value']) + "V" + if args.victron: + dbusservice["/Voltages/Cell24"] = BMS_STATUS['voltages']['cell24_voltage']['text'] + dbusservice["/Raw/Voltages/Cell24"] = BMS_STATUS['voltages']['cell24_voltage']['value'] + + # get min/max voltages to calculate the diff cell_voltages = [] - if (BMS_STATUS['cells']['cell1_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell1_voltage']['value']) - if (BMS_STATUS['cells']['cell2_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell2_voltage']['value']) - if (BMS_STATUS['cells']['cell3_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell3_voltage']['value']) - if (BMS_STATUS['cells']['cell4_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell4_voltage']['value']) - if (BMS_STATUS['cells']['cell5_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell5_voltage']['value']) - if (BMS_STATUS['cells']['cell6_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell6_voltage']['value']) - if (BMS_STATUS['cells']['cell7_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell7_voltage']['value']) - if (BMS_STATUS['cells']['cell8_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell8_voltage']['value']) - if (BMS_STATUS['cells']['cell9_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell9_voltage']['value']) - if (BMS_STATUS['cells']['cell10_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell10_voltage']['value']) - if (BMS_STATUS['cells']['cell11_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell11_voltage']['value']) - if (BMS_STATUS['cells']['cell12_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell12_voltage']['value']) - if (BMS_STATUS['cells']['cell13_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell13_voltage']['value']) - if (BMS_STATUS['cells']['cell14_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell14_voltage']['value']) - if (BMS_STATUS['cells']['cell15_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell15_voltage']['value']) - if (BMS_STATUS['cells']['cell16_voltage']['value'] > MIN_CELL_VOLTAGE): - cell_voltages.append(BMS_STATUS['cells']['cell16_voltage']['value']) + if (BMS_STATUS['voltages']['cell1_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell1_voltage']['value']) + if (BMS_STATUS['voltages']['cell2_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell2_voltage']['value']) + if (BMS_STATUS['voltages']['cell3_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell3_voltage']['value']) + if (BMS_STATUS['voltages']['cell4_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell4_voltage']['value']) + if (BMS_STATUS['voltages']['cell5_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell5_voltage']['value']) + if (BMS_STATUS['voltages']['cell6_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell6_voltage']['value']) + if (BMS_STATUS['voltages']['cell7_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell7_voltage']['value']) + if (BMS_STATUS['voltages']['cell8_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell8_voltage']['value']) + if (BMS_STATUS['voltages']['cell9_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell9_voltage']['value']) + if (BMS_STATUS['voltages']['cell10_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell10_voltage']['value']) + if (BMS_STATUS['voltages']['cell11_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell11_voltage']['value']) + if (BMS_STATUS['voltages']['cell12_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell12_voltage']['value']) + if (BMS_STATUS['voltages']['cell13_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell13_voltage']['value']) + if (BMS_STATUS['voltages']['cell14_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell14_voltage']['value']) + if (BMS_STATUS['voltages']['cell15_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell15_voltage']['value']) + if (BMS_STATUS['voltages']['cell16_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell16_voltage']['value']) + if (BMS_STATUS['voltages']['cell17_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell17_voltage']['value']) + if (BMS_STATUS['voltages']['cell18_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell18_voltage']['value']) + if (BMS_STATUS['voltages']['cell19_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell19_voltage']['value']) + if (BMS_STATUS['voltages']['cell20_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell20_voltage']['value']) + if (BMS_STATUS['voltages']['cell21_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell21_voltage']['value']) + if (BMS_STATUS['voltages']['cell22_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell22_voltage']['value']) + if (BMS_STATUS['voltages']['cell23_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell23_voltage']['value']) + if (BMS_STATUS['voltages']['cell24_voltage']['value'] > MIN_CELL_VOLTAGE): + cell_voltages.append(BMS_STATUS['voltages']['cell24_voltage']['value']) - BMS_STATUS['cells']['agg_voltages']['sum']['value'] = sum(cell_voltages) - BMS_STATUS['cells']['agg_voltages']['sum']['text'] = "{:.2f}".format(BMS_STATUS['cells']['agg_voltages']['sum']['value']) + "V" - BMS_STATUS['cells']['agg_voltages']['max']['value'] = max(cell_voltages) - BMS_STATUS['cells']['agg_voltages']['max']['text'] = "{:.3f}".format(BMS_STATUS['cells']['agg_voltages']['max']['value']) + "V" - BMS_STATUS['cells']['agg_voltages']['min']['value'] = min(cell_voltages) - BMS_STATUS['cells']['agg_voltages']['min']['text'] = "{:.3f}".format(BMS_STATUS['cells']['agg_voltages']['min']['value']) + "V" - BMS_STATUS['cells']['agg_voltages']['diff']['value'] = BMS_STATUS['cells']['agg_voltages']['max']['value'] - BMS_STATUS['cells']['agg_voltages']['min']['value'] - BMS_STATUS['cells']['agg_voltages']['diff']['text'] = "{:.0f}".format(BMS_STATUS['cells']['agg_voltages']['diff']['value'] * 1000) + "mV" + BMS_STATUS['voltages']['agg_voltages']['sum']['value'] = sum(cell_voltages) + BMS_STATUS['voltages']['agg_voltages']['sum']['text'] = "{:.2f}".format(BMS_STATUS['voltages']['agg_voltages']['sum']['value']) + "V" + BMS_STATUS['voltages']['agg_voltages']['max']['value'] = max(cell_voltages) + BMS_STATUS['voltages']['agg_voltages']['max']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['agg_voltages']['max']['value']) + "V" + BMS_STATUS['voltages']['agg_voltages']['min']['value'] = min(cell_voltages) + BMS_STATUS['voltages']['agg_voltages']['min']['text'] = "{:.3f}".format(BMS_STATUS['voltages']['agg_voltages']['min']['value']) + "V" + BMS_STATUS['voltages']['agg_voltages']['diff']['value'] = BMS_STATUS['voltages']['agg_voltages']['max']['value'] - BMS_STATUS['voltages']['agg_voltages']['min']['value'] + BMS_STATUS['voltages']['agg_voltages']['diff']['text'] = "{:.0f}".format(BMS_STATUS['voltages']['agg_voltages']['diff']['value'] * 1000) + "mV" + + if args.victron: + dbusservice["/Voltages/Sum"] = BMS_STATUS['voltages']['agg_voltages']['sum']['text'] + dbusservice["/Raw/Voltages/Sum"] = BMS_STATUS['voltages']['agg_voltages']['sum']['value'] + dbusservice["/Voltages/Max"] = BMS_STATUS['voltages']['agg_voltages']['max']['text'] + dbusservice["/Raw/Voltages/Max"] = BMS_STATUS['voltages']['agg_voltages']['max']['value'] + dbusservice["/Voltages/Min"] = BMS_STATUS['voltages']['agg_voltages']['min']['text'] + dbusservice["/Raw/Voltages/Min"] = BMS_STATUS['voltages']['agg_voltages']['min']['value'] + dbusservice["/Voltages/Diff"] = BMS_STATUS['voltages']['agg_voltages']['diff']['text'] + dbusservice["/Raw/Voltages/Diff"] = BMS_STATUS['voltages']['agg_voltages']['diff']['value'] + + + if (packet_length == PACKET_LENGTH_STATUS_CELLS[0]): # packet from BMS8 + + # get battery capacity + BMS_STATUS['voltages']['battery_capacity_wh']['value'] = get_battery_capacity(ord(packet[20]), ord(packet[21]), ord(packet[22]), ord(packet[23])) + BMS_STATUS['voltages']['battery_capacity_wh']['text'] = "{:.0f}".format(BMS_STATUS['voltages']['battery_capacity_wh']['value']) + "Wh" + if args.victron: + dbusservice["/Voltages/BatteryCapacityWH"] = BMS_STATUS['voltages']['battery_capacity_wh']['text'] + dbusservice["/Raw/Voltages/BatteryCapacityWH"] = BMS_STATUS['voltages']['battery_capacity_wh']['value'] + + BMS_STATUS['voltages']['battery_capacity_ah']['value'] = get_battery_capacity(ord(packet[24]), ord(packet[25]), ord(packet[26]), ord(packet[27])) + BMS_STATUS['voltages']['battery_capacity_ah']['text'] = "{:.0f}".format(BMS_STATUS['voltages']['battery_capacity_ah']['value']) + "Ah" + if args.victron: + dbusservice["/Voltages/BatteryCapacityAH"] = BMS_STATUS['voltages']['battery_capacity_ah']['text'] + dbusservice["/Raw/Voltages/BatteryCapacityWH"] = BMS_STATUS['voltages']['battery_capacity_ah']['value'] + + + elif (packet_length == PACKET_LENGTH_STATUS_CELLS[1]): # packet from BMS16 + + # get battery capacity + BMS_STATUS['voltages']['battery_capacity_wh']['value'] = get_battery_capacity(ord(packet[36]), ord(packet[37]), ord(packet[38]), ord(packet[39])) + BMS_STATUS['voltages']['battery_capacity_wh']['text'] = "{:.0f}".format(BMS_STATUS['voltages']['battery_capacity_wh']['value']) + "Wh" + if args.victron: + dbusservice["/Voltages/BatteryCapacityWH"] = BMS_STATUS['voltages']['battery_capacity_wh']['text'] + dbusservice["/Raw/Voltages/BatteryCapacityWH"] = BMS_STATUS['voltages']['battery_capacity_wh']['value'] + + BMS_STATUS['voltages']['battery_capacity_ah']['value'] = get_battery_capacity(ord(packet[40]), ord(packet[41]), ord(packet[42]), ord(packet[43])) + BMS_STATUS['voltages']['battery_capacity_ah']['text'] = "{:.0f}".format(BMS_STATUS['voltages']['battery_capacity_ah']['value']) + "Ah" + if args.victron: + dbusservice["/Voltages/BatteryCapacityAH"] = BMS_STATUS['voltages']['battery_capacity_ah']['text'] + dbusservice["/Raw/Voltages/BatteryCapacityWH"] = BMS_STATUS['voltages']['battery_capacity_ah']['value'] + + + elif (packet_length == PACKET_LENGTH_STATUS_CELLS[2]): # packet from BMS24 + + # get battery capacity + BMS_STATUS['voltages']['battery_capacity_wh']['value'] = get_battery_capacity(ord(packet[52]), ord(packet[53]), ord(packet[54]), ord(packet[55])) + BMS_STATUS['voltages']['battery_capacity_wh']['text'] = "{:.0f}".format(BMS_STATUS['voltages']['battery_capacity_wh']['value']) + "Wh" + if args.victron: + dbusservice["/Voltages/BatteryCapacityWH"] = BMS_STATUS['voltages']['battery_capacity_wh']['text'] + dbusservice["/Raw/Voltages/BatteryCapacityWH"] = BMS_STATUS['voltages']['battery_capacity_wh']['value'] + + BMS_STATUS['voltages']['battery_capacity_ah']['value'] = get_battery_capacity(ord(packet[56]), ord(packet[57]), ord(packet[58]), ord(packet[59])) + BMS_STATUS['voltages']['battery_capacity_ah']['text'] = "{:.0f}".format(BMS_STATUS['voltages']['battery_capacity_ah']['value']) + "Ah" + if args.victron: + dbusservice["/Voltages/BatteryCapacityAH"] = BMS_STATUS['voltages']['battery_capacity_ah']['text'] + dbusservice["/Raw/Voltages/BatteryCapacityWH"] = BMS_STATUS['voltages']['battery_capacity_ah']['value'] - dbusservice["/Voltages/Sum"] = BMS_STATUS['cells']['agg_voltages']['sum']['text'] - dbusservice["/Raw/Voltages/Sum"] = BMS_STATUS['cells']['agg_voltages']['sum']['value'] - dbusservice["/Voltages/Max"] = BMS_STATUS['cells']['agg_voltages']['max']['text'] - dbusservice["/Raw/Voltages/Max"] = BMS_STATUS['cells']['agg_voltages']['max']['value'] - dbusservice["/Voltages/Min"] = BMS_STATUS['cells']['agg_voltages']['min']['text'] - dbusservice["/Raw/Voltages/Min"] = BMS_STATUS['cells']['agg_voltages']['min']['value'] - dbusservice["/Voltages/Diff"] = BMS_STATUS['cells']['agg_voltages']['diff']['text'] - dbusservice["/Raw/Voltages/Diff"] = BMS_STATUS['cells']['agg_voltages']['diff']['value'] # update timestamp current_date = datetime.datetime.now() - BMS_STATUS['cells']['timestamp']['value'] = time.time() - BMS_STATUS['cells']['timestamp']['text'] = current_date.strftime('%a %d.%m.%Y %H:%M:%S') - dbusservice["/Voltages/UpdateTimestamp"] = BMS_STATUS['cells']['timestamp']['text'] - dbusservice["/Raw/Voltages/UpdateTimestamp"] = BMS_STATUS['cells']['timestamp']['value'] + BMS_STATUS['voltages']['timestamp']['value'] = time.time() + BMS_STATUS['voltages']['timestamp']['text'] = current_date.strftime('%a %d.%m.%Y %H:%M:%S') + if args.victron: + dbusservice["/Voltages/UpdateTimestamp"] = BMS_STATUS['voltages']['timestamp']['text'] + dbusservice["/Raw/Voltages/UpdateTimestamp"] = BMS_STATUS['voltages']['timestamp']['value'] # print (BMS_STATUS) - logging.info("BMS cells [DIFF|" + BMS_STATUS['cells']['agg_voltages']['diff']['text'] + - "][SUM|" + BMS_STATUS['cells']['agg_voltages']['sum']['text'] + - "][#1|" + BMS_STATUS['cells']['cell1_voltage']['text'] + - "][#2|" + BMS_STATUS['cells']['cell2_voltage']['text'] + - "][#3|" + BMS_STATUS['cells']['cell3_voltage']['text'] + - "][#4|" + BMS_STATUS['cells']['cell4_voltage']['text'] + - "][#5|" + BMS_STATUS['cells']['cell5_voltage']['text'] + - "][#6|" + BMS_STATUS['cells']['cell6_voltage']['text'] + "]") + if (packet_length == PACKET_LENGTH_STATUS_CELLS[0]): # packet from BMS8 + + logging.info("BMS8 cells " + + "[CAPACITYAH|" + BMS_STATUS['voltages']['battery_capacity_ah']['text'] + + "][CAPACITYWH|" + BMS_STATUS['voltages']['battery_capacity_wh']['text'] + + "][DIFF|" + BMS_STATUS['voltages']['agg_voltages']['diff']['text'] + + "][SUM|" + BMS_STATUS['voltages']['agg_voltages']['sum']['text'] + + "][#1|" + BMS_STATUS['voltages']['cell1_voltage']['text'] + + "][#2|" + BMS_STATUS['voltages']['cell2_voltage']['text'] + + "][#3|" + BMS_STATUS['voltages']['cell3_voltage']['text'] + + "][#4|" + BMS_STATUS['voltages']['cell4_voltage']['text'] + + "][#5|" + BMS_STATUS['voltages']['cell5_voltage']['text'] + + "][#6|" + BMS_STATUS['voltages']['cell6_voltage']['text'] + + "][#7|" + BMS_STATUS['voltages']['cell7_voltage']['text'] + + "][#8|" + BMS_STATUS['voltages']['cell8_voltage']['text'] + "]") + + elif (packet_length == PACKET_LENGTH_STATUS_CELLS[1]): # packet from BMS16 + + logging.info("BMS16 cells " + + "[CAPACITYAH|" + BMS_STATUS['voltages']['battery_capacity_ah']['text'] + + "][CAPACITYWH|" + BMS_STATUS['voltages']['battery_capacity_wh']['text'] + + "][DIFF|" + BMS_STATUS['voltages']['agg_voltages']['diff']['text'] + + "][SUM|" + BMS_STATUS['voltages']['agg_voltages']['sum']['text'] + + "][#1|" + BMS_STATUS['voltages']['cell1_voltage']['text'] + + "][#2|" + BMS_STATUS['voltages']['cell2_voltage']['text'] + + "][#3|" + BMS_STATUS['voltages']['cell3_voltage']['text'] + + "][#4|" + BMS_STATUS['voltages']['cell4_voltage']['text'] + + "][#5|" + BMS_STATUS['voltages']['cell5_voltage']['text'] + + "][#6|" + BMS_STATUS['voltages']['cell6_voltage']['text'] + + "][#7|" + BMS_STATUS['voltages']['cell7_voltage']['text'] + + "][#8|" + BMS_STATUS['voltages']['cell8_voltage']['text'] + + "][#9|" + BMS_STATUS['voltages']['cell9_voltage']['text'] + + "][#10|" + BMS_STATUS['voltages']['cell10_voltage']['text'] + + "][#11|" + BMS_STATUS['voltages']['cell11_voltage']['text'] + + "][#12|" + BMS_STATUS['voltages']['cell12_voltage']['text'] + + "][#13|" + BMS_STATUS['voltages']['cell13_voltage']['text'] + + "][#14|" + BMS_STATUS['voltages']['cell14_voltage']['text'] + + "][#15|" + BMS_STATUS['voltages']['cell15_voltage']['text'] + + "][#16|" + BMS_STATUS['voltages']['cell16_voltage']['text'] + "]") + + + elif (packet_length == PACKET_LENGTH_STATUS_CELLS[2]): # packet from BMS24 + + logging.info("BMS24 cells " + + "[CAPACITYAH|" + BMS_STATUS['voltages']['battery_capacity_ah']['text'] + + "][CAPACITYWH|" + BMS_STATUS['voltages']['battery_capacity_wh']['text'] + + "][DIFF|" + BMS_STATUS['voltages']['agg_voltages']['diff']['text'] + + "][SUM|" + BMS_STATUS['voltages']['agg_voltages']['sum']['text'] + + "][#1|" + BMS_STATUS['voltages']['cell1_voltage']['text'] + + "][#2|" + BMS_STATUS['voltages']['cell2_voltage']['text'] + + "][#3|" + BMS_STATUS['voltages']['cell3_voltage']['text'] + + "][#4|" + BMS_STATUS['voltages']['cell4_voltage']['text'] + + "][#5|" + BMS_STATUS['voltages']['cell5_voltage']['text'] + + "][#6|" + BMS_STATUS['voltages']['cell6_voltage']['text'] + + "][#7|" + BMS_STATUS['voltages']['cell7_voltage']['text'] + + "][#8|" + BMS_STATUS['voltages']['cell8_voltage']['text'] + + "][#9|" + BMS_STATUS['voltages']['cell9_voltage']['text'] + + "][#10|" + BMS_STATUS['voltages']['cell10_voltage']['text'] + + "][#11|" + BMS_STATUS['voltages']['cell11_voltage']['text'] + + "][#12|" + BMS_STATUS['voltages']['cell12_voltage']['text'] + + "][#13|" + BMS_STATUS['voltages']['cell13_voltage']['text'] + + "][#14|" + BMS_STATUS['voltages']['cell14_voltage']['text'] + + "][#15|" + BMS_STATUS['voltages']['cell15_voltage']['text'] + + "][#16|" + BMS_STATUS['voltages']['cell16_voltage']['text'] + + "][#17|" + BMS_STATUS['voltages']['cell17_voltage']['text'] + + "][#18|" + BMS_STATUS['voltages']['cell18_voltage']['text'] + + "][#19|" + BMS_STATUS['voltages']['cell19_voltage']['text'] + + "][#20|" + BMS_STATUS['voltages']['cell20_voltage']['text'] + + "][#21|" + BMS_STATUS['voltages']['cell21_voltage']['text'] + + "][#22|" + BMS_STATUS['voltages']['cell22_voltage']['text'] + + "][#23|" + BMS_STATUS['voltages']['cell23_voltage']['text'] + + "][#24|" + BMS_STATUS['voltages']['cell24_voltage']['text'] + "]") + + else: + logging.debug("Packet Checksum wrong, skip packet") + + # strip packet + packet = packet[packet_length:] + + elif (ord(packet[2]) == PACKET_STATUS_IMPEDANCES): + + if (len(packet) < PACKET_LENGTH_STATUS_IMPEDANCES[0]): + logging.debug("Packet Impedances Cells too short, skip") + packet = "" + else: + + # checksum value + checksum = 0 + checksum_check = -1 + + if (packet_length == PACKET_LENGTH_STATUS_IMPEDANCES[0]): # packet from BMS8 + logging.debug("Packet Impedances Cells BMS8") + + if (len(packet) < PACKET_LENGTH_STATUS_IMPEDANCES[0]): + logging.debug("Packet Impedances Cells too short, skip") + packet = "" + else: + + # checksum value + checksum = ord(packet[23]) + + # calculate checksum + checksum_check = (ord(packet[0]) + + ord(packet[1]) + ord(packet[2]) + ord(packet[3]) + ord(packet[4]) + ord(packet[5]) + + ord(packet[6]) + ord(packet[7]) + ord(packet[8]) + ord(packet[9]) + ord(packet[10]) + + ord(packet[11]) + ord(packet[12]) + ord(packet[13]) + ord(packet[14]) + ord(packet[15]) + + ord(packet[16]) + ord(packet[17]) + ord(packet[18]) + ord(packet[19]) + ord(packet[20]) + + ord(packet[21]) + ord(packet[22])) % 256 + logging.debug("Packet Checksum BMS8: " + str(checksum) + "|" + str(checksum_check)) + + elif (packet_length == PACKET_LENGTH_STATUS_IMPEDANCES[1]): # packet from BMS16 + logging.debug("Packet Impedances Cells BMS16") + + if (len(packet) < PACKET_LENGTH_STATUS_IMPEDANCES[1]): + logging.debug("Packet Impedances Cells too short, skip") + packet = "" + else: + + # checksum value + checksum = ord(packet[39]) + + # calculate checksum + checksum_check = (ord(packet[0]) + + ord(packet[1]) + ord(packet[2]) + ord(packet[3]) + ord(packet[4]) + ord(packet[5]) + + ord(packet[6]) + ord(packet[7]) + ord(packet[8]) + ord(packet[9]) + ord(packet[10]) + + ord(packet[11]) + ord(packet[12]) + ord(packet[13]) + ord(packet[14]) + ord(packet[15]) + + ord(packet[16]) + ord(packet[17]) + ord(packet[18]) + ord(packet[19]) + ord(packet[20]) + + ord(packet[21]) + ord(packet[22]) + ord(packet[23]) + ord(packet[24]) + ord(packet[25]) + + ord(packet[26]) + ord(packet[27]) + ord(packet[28]) + ord(packet[29]) + ord(packet[30]) + + ord(packet[31]) + ord(packet[32]) + ord(packet[33]) + ord(packet[34]) + ord(packet[35]) + + ord(packet[36]) + ord(packet[37]) + ord(packet[38])) % 256 + logging.debug("Packet Checksum BMS16: " + str(checksum) + "|" + str(checksum_check)) + + elif (packet_length == PACKET_LENGTH_STATUS_IMPEDANCES[2]): # packet from BMS24 + logging.debug("Packet Impedances Cells BMS24") + + if (len(packet) < PACKET_LENGTH_STATUS_IMPEDANCES[2]): + logging.debug("Packet Impedances Cells too short, skip") + packet = "" + else: + + # checksum value + checksum = ord(packet[55]) + + # calculate checksum + checksum_check = (ord(packet[0]) + + ord(packet[1]) + ord(packet[2]) + ord(packet[3]) + ord(packet[4]) + ord(packet[5]) + + ord(packet[6]) + ord(packet[7]) + ord(packet[8]) + ord(packet[9]) + ord(packet[10]) + + ord(packet[11]) + ord(packet[12]) + ord(packet[13]) + ord(packet[14]) + ord(packet[15]) + + ord(packet[16]) + ord(packet[17]) + ord(packet[18]) + ord(packet[19]) + ord(packet[20]) + + ord(packet[21]) + ord(packet[22]) + ord(packet[23]) + ord(packet[24]) + ord(packet[25]) + + ord(packet[26]) + ord(packet[27]) + ord(packet[28]) + ord(packet[29]) + ord(packet[30]) + + ord(packet[31]) + ord(packet[32]) + ord(packet[33]) + ord(packet[34]) + ord(packet[35]) + + ord(packet[36]) + ord(packet[37]) + ord(packet[38]) + ord(packet[39]) + ord(packet[40]) + + ord(packet[41]) + ord(packet[42]) + ord(packet[43]) + ord(packet[44]) + ord(packet[45]) + + ord(packet[46]) + ord(packet[47]) + ord(packet[48]) + ord(packet[49]) + ord(packet[50]) + + ord(packet[51]) + ord(packet[52]) + ord(packet[53]) + ord(packet[54])) % 256 + logging.debug("Packet Checksum BMS16: " + str(checksum) + "|" + str(checksum_check)) + + + # data integrity does match + if (checksum == checksum_check): + + # cell impedances BMS8 + BMS_STATUS['impedances']['cell1_impedance']['value'] = get_cell_impedance(ord(packet[8]), ord(packet[9])) + BMS_STATUS['impedances']['cell1_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell1_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell1"] = BMS_STATUS['impedances']['cell1_impedance']['text'] + dbusservice["/Raw/Impedances/Cell1"] = BMS_STATUS['impedances']['cell1_impedance']['value'] + + BMS_STATUS['impedances']['cell2_impedance']['value'] = get_cell_impedance(ord(packet[10]), ord(packet[11])) + BMS_STATUS['impedances']['cell2_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell2_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell2"] = BMS_STATUS['impedances']['cell2_impedance']['text'] + dbusservice["/Raw/Impedances/Cell2"] = BMS_STATUS['impedances']['cell2_impedance']['value'] + + BMS_STATUS['impedances']['cell3_impedance']['value'] = get_cell_impedance(ord(packet[12]), ord(packet[13])) + BMS_STATUS['impedances']['cell3_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell3_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell3"] = BMS_STATUS['impedances']['cell3_impedance']['text'] + dbusservice["/Raw/Impedances/Cell3"] = BMS_STATUS['impedances']['cell3_impedance']['value'] + + BMS_STATUS['impedances']['cell4_impedance']['value'] = get_cell_impedance(ord(packet[14]), ord(packet[15])) + BMS_STATUS['impedances']['cell4_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell4_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell4"] = BMS_STATUS['impedances']['cell4_impedance']['text'] + dbusservice["/Raw/Impedances/Cell4"] = BMS_STATUS['impedances']['cell4_impedance']['value'] + + BMS_STATUS['impedances']['cell5_impedance']['value'] = get_cell_impedance(ord(packet[16]), ord(packet[17])) + BMS_STATUS['impedances']['cell5_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell5_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell5"] = BMS_STATUS['impedances']['cell5_impedance']['text'] + dbusservice["/Raw/Impedances/Cell5"] = BMS_STATUS['impedances']['cell5_impedance']['value'] + + BMS_STATUS['impedances']['cell6_impedance']['value'] = get_cell_impedance(ord(packet[18]), ord(packet[19])) + BMS_STATUS['impedances']['cell6_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell6_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell6"] = BMS_STATUS['impedances']['cell6_impedance']['text'] + dbusservice["/Raw/Impedances/Cell6"] = BMS_STATUS['impedances']['cell6_impedance']['value'] + + BMS_STATUS['impedances']['cell7_impedance']['value'] = get_cell_impedance(ord(packet[20]), ord(packet[21])) + BMS_STATUS['impedances']['cell7_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell7_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell7"] = BMS_STATUS['impedances']['cell7_impedance']['text'] + dbusservice["/Raw/Impedances/Cell7"] = BMS_STATUS['impedances']['cell7_impedance']['value'] + + BMS_STATUS['impedances']['cell8_impedance']['value'] = get_cell_impedance(ord(packet[22]), ord(packet[23])) + BMS_STATUS['impedances']['cell8_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell8_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell8"] = BMS_STATUS['impedances']['cell8_impedance']['text'] + dbusservice["/Raw/Impedances/Cell8"] = BMS_STATUS['impedances']['cell8_impedance']['value'] + + + if (packet_length == PACKET_LENGTH_STATUS_IMPEDANCES[1]): # packet from BMS16 + + + # cell impedances BMS8 + BMS_STATUS['impedances']['cell9_impedance']['value'] = get_cell_impedance(ord(packet[24]), ord(packet[25])) + BMS_STATUS['impedances']['cell9_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell9_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell9"] = BMS_STATUS['impedances']['cell9_impedance']['text'] + dbusservice["/Raw/Impedances/Cell9"] = BMS_STATUS['impedances']['cell9_impedance']['value'] + + BMS_STATUS['impedances']['cell10_impedance']['value'] = get_cell_impedance(ord(packet[26]), ord(packet[27])) + BMS_STATUS['impedances']['cell10_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell10_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell10"] = BMS_STATUS['impedances']['cell10_impedance']['text'] + dbusservice["/Raw/Impedances/Cell10"] = BMS_STATUS['impedances']['cell10_impedance']['value'] + + BMS_STATUS['impedances']['cell11_impedance']['value'] = get_cell_impedance(ord(packet[28]), ord(packet[29])) + BMS_STATUS['impedances']['cell11_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell11_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell11"] = BMS_STATUS['impedances']['cell11_impedance']['text'] + dbusservice["/Raw/Impedances/Cell11"] = BMS_STATUS['impedances']['cell11_impedance']['value'] + + BMS_STATUS['impedances']['cell12_impedance']['value'] = get_cell_impedance(ord(packet[30]), ord(packet[31])) + BMS_STATUS['impedances']['cell12_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell12_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell12"] = BMS_STATUS['impedances']['cell12_impedance']['text'] + dbusservice["/Raw/Impedances/Cell12"] = BMS_STATUS['impedances']['cell12_impedance']['value'] + + BMS_STATUS['impedances']['cell13_impedance']['value'] = get_cell_impedance(ord(packet[32]), ord(packet[33])) + BMS_STATUS['impedances']['cell13_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell13_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell13"] = BMS_STATUS['impedances']['cell13_impedance']['text'] + dbusservice["/Raw/Impedances/Cell13"] = BMS_STATUS['impedances']['cell13_impedance']['value'] + + BMS_STATUS['impedances']['cell14_impedance']['value'] = get_cell_impedance(ord(packet[34]), ord(packet[35])) + BMS_STATUS['impedances']['cell14_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell14_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell14"] = BMS_STATUS['impedances']['cell14_impedance']['text'] + dbusservice["/Raw/Impedances/Cell14"] = BMS_STATUS['impedances']['cell14_impedance']['value'] + + BMS_STATUS['impedances']['cell15_impedance']['value'] = get_cell_impedance(ord(packet[36]), ord(packet[37])) + BMS_STATUS['impedances']['cell15_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell15_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell15"] = BMS_STATUS['impedances']['cell15_impedance']['text'] + dbusservice["/Raw/Impedances/Cell15"] = BMS_STATUS['impedances']['cell15_impedance']['value'] + + BMS_STATUS['impedances']['cell16_impedance']['value'] = get_cell_impedance(ord(packet[38]), ord(packet[39])) + BMS_STATUS['impedances']['cell16_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell16_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell16"] = BMS_STATUS['impedances']['cell16_impedance']['text'] + dbusservice["/Raw/Impedances/Cell16"] = BMS_STATUS['impedances']['cell16_impedance']['value'] + + + if (packet_length == PACKET_LENGTH_STATUS_IMPEDANCES[2]): # packet from BMS24 + + BMS_STATUS['impedances']['cell17_impedance']['value'] = get_cell_impedance(ord(packet[40]), ord(packet[41])) + BMS_STATUS['impedances']['cell17_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell17_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell17"] = BMS_STATUS['impedances']['cell17_impedance']['text'] + dbusservice["/Raw/Impedances/Cell17"] = BMS_STATUS['impedances']['cell17_impedance']['value'] + + BMS_STATUS['impedances']['cell18_impedance']['value'] = get_cell_impedance(ord(packet[42]), ord(packet[43])) + BMS_STATUS['impedances']['cell18_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell18_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell18"] = BMS_STATUS['impedances']['cell18_impedance']['text'] + dbusservice["/Raw/Impedances/Cell18"] = BMS_STATUS['impedances']['cell18_impedance']['value'] + + BMS_STATUS['impedances']['cell19_impedance']['value'] = get_cell_impedance(ord(packet[44]), ord(packet[45])) + BMS_STATUS['impedances']['cell19_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell19_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell19"] = BMS_STATUS['impedances']['cell19_impedance']['text'] + dbusservice["/Raw/Impedances/Cell19"] = BMS_STATUS['impedances']['cell19_impedance']['value'] + + BMS_STATUS['impedances']['cell20_impedance']['value'] = get_cell_impedance(ord(packet[46]), ord(packet[47])) + BMS_STATUS['impedances']['cell20_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell20_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell20"] = BMS_STATUS['impedances']['cell20_impedance']['text'] + dbusservice["/Raw/Impedances/Cell20"] = BMS_STATUS['impedances']['cell20_impedance']['value'] + + BMS_STATUS['impedances']['cell21_impedance']['value'] = get_cell_impedance(ord(packet[48]), ord(packet[49])) + BMS_STATUS['impedances']['cell21_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell21_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell21"] = BMS_STATUS['impedances']['cell21_impedance']['text'] + dbusservice["/Raw/Impedances/Cell21"] = BMS_STATUS['impedances']['cell21_impedance']['value'] + + BMS_STATUS['impedances']['cell22_impedance']['value'] = get_cell_impedance(ord(packet[50]), ord(packet[51])) + BMS_STATUS['impedances']['cell22_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell22_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell22"] = BMS_STATUS['impedances']['cell22_impedance']['text'] + dbusservice["/Raw/Impedances/Cell22"] = BMS_STATUS['impedances']['cell22_impedance']['value'] + + BMS_STATUS['impedances']['cell23_impedance']['value'] = get_cell_impedance(ord(packet[52]), ord(packet[53])) + BMS_STATUS['impedances']['cell23_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell23_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell23"] = BMS_STATUS['impedances']['cell23_impedance']['text'] + dbusservice["/Raw/Impedances/Cell23"] = BMS_STATUS['impedances']['cell23_impedance']['value'] + + BMS_STATUS['impedances']['cell24_impedance']['value'] = get_cell_impedance(ord(packet[54]), ord(packet[55])) + BMS_STATUS['impedances']['cell24_impedance']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['cell24_impedance']['value']) + "mOhm" + if args.victron: + dbusservice["/Impedances/Cell24"] = BMS_STATUS['impedances']['cell24_impedance']['text'] + dbusservice["/Raw/Impedances/Cell24"] = BMS_STATUS['impedances']['cell24_impedance']['value'] + + + # get min/max impedances to calculate the diff + cell_impedances = [] + + if (BMS_STATUS['impedances']['cell1_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell1_impedance']['value']) + if (BMS_STATUS['impedances']['cell2_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell2_impedance']['value']) + if (BMS_STATUS['impedances']['cell3_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell3_impedance']['value']) + if (BMS_STATUS['impedances']['cell4_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell4_impedance']['value']) + if (BMS_STATUS['impedances']['cell5_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell5_impedance']['value']) + if (BMS_STATUS['impedances']['cell6_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell6_impedance']['value']) + if (BMS_STATUS['impedances']['cell7_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell7_impedance']['value']) + if (BMS_STATUS['impedances']['cell8_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell8_impedance']['value']) + if (BMS_STATUS['impedances']['cell9_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell9_impedance']['value']) + if (BMS_STATUS['impedances']['cell10_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell10_impedance']['value']) + if (BMS_STATUS['impedances']['cell11_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell11_impedance']['value']) + if (BMS_STATUS['impedances']['cell12_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell12_impedance']['value']) + if (BMS_STATUS['impedances']['cell13_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell13_impedance']['value']) + if (BMS_STATUS['impedances']['cell14_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell14_impedance']['value']) + if (BMS_STATUS['impedances']['cell15_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell15_impedance']['value']) + if (BMS_STATUS['impedances']['cell16_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell16_impedance']['value']) + if (BMS_STATUS['impedances']['cell17_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell17_impedance']['value']) + if (BMS_STATUS['impedances']['cell18_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell18_impedance']['value']) + if (BMS_STATUS['impedances']['cell19_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell19_impedance']['value']) + if (BMS_STATUS['impedances']['cell20_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell20_impedance']['value']) + if (BMS_STATUS['impedances']['cell21_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell21_impedance']['value']) + if (BMS_STATUS['impedances']['cell22_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell22_impedance']['value']) + if (BMS_STATUS['impedances']['cell23_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell23_impedance']['value']) + if (BMS_STATUS['impedances']['cell24_impedance']['value'] > MIN_CELL_IMPEDANCE): + cell_voltages.append(BMS_STATUS['impedances']['cell24_impedance']['value']) + + BMS_STATUS['impedances']['agg_impedances']['sum']['value'] = sum(cell_voltages) + BMS_STATUS['impedances']['agg_impedances']['sum']['text'] = "{:.2f}".format(BMS_STATUS['impedances']['agg_impedances']['sum']['value']) + "mOhm" + BMS_STATUS['impedances']['agg_impedances']['max']['value'] = max(cell_voltages) + BMS_STATUS['impedances']['agg_impedances']['max']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['agg_impedances']['max']['value']) + "mOhm" + BMS_STATUS['impedances']['agg_impedances']['min']['value'] = min(cell_voltages) + BMS_STATUS['impedances']['agg_impedances']['min']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['agg_impedances']['min']['value']) + "mOhm" + BMS_STATUS['impedances']['agg_impedances']['diff']['value'] = BMS_STATUS['impedances']['agg_impedances']['max']['value'] - BMS_STATUS['impedances']['c']['min']['value'] + BMS_STATUS['impedances']['agg_impedances']['diff']['text'] = "{:.3f}".format(BMS_STATUS['impedances']['agg_impedances']['diff']['value']) + "mOhm" + + if args.victron: + dbusservice["/Impedances/Sum"] = BMS_STATUS['impedances']['agg_impedances']['sum']['text'] + dbusservice["/Raw/Impedances/Sum"] = BMS_STATUS['impedances']['agg_impedances']['sum']['value'] + dbusservice["/Impedances/Max"] = BMS_STATUS['impedances']['agg_impedances']['max']['text'] + dbusservice["/Raw/Impedances/Max"] = BMS_STATUS['impedances']['agg_impedances']['max']['value'] + dbusservice["/Impedances/Min"] = BMS_STATUS['impedances']['agg_impedances']['min']['text'] + dbusservice["/Raw/Impedances/Min"] = BMS_STATUS['impedances']['agg_impedances']['min']['value'] + dbusservice["/Impedances/Diff"] = BMS_STATUS['impedances']['agg_impedances']['diff']['text'] + dbusservice["/Raw/Impedances/Diff"] = BMS_STATUS['impedances']['agg_impedances']['diff']['value'] + + + # update timestamp + current_date = datetime.datetime.now() + BMS_STATUS['impedances']['timestamp']['value'] = time.time() + BMS_STATUS['impedances']['timestamp']['text'] = current_date.strftime('%a %d.%m.%Y %H:%M:%S') + if args.victron: + dbusservice["/Impedances/UpdateTimestamp"] = BMS_STATUS['impedances']['timestamp']['text'] + dbusservice["/Raw/Impedances/UpdateTimestamp"] = BMS_STATUS['impedances']['timestamp']['value'] + + + # print (BMS_STATUS) + if (packet_length == PACKET_LENGTH_STATUS_IMPEDANCES[0]): # packet from BMS8 + + logging.info("BMS8 impedances " + + "][SUM|" + BMS_STATUS['impedances']['agg_impedances']['sum']['text'] + + "][#1|" + BMS_STATUS['impedances']['cell1_impedance']['text'] + + "][#2|" + BMS_STATUS['impedances']['cell2_impedance']['text'] + + "][#3|" + BMS_STATUS['impedances']['cell3_impedance']['text'] + + "][#4|" + BMS_STATUS['impedances']['cell4_impedance']['text'] + + "][#5|" + BMS_STATUS['impedances']['cell5_impedance']['text'] + + "][#6|" + BMS_STATUS['impedances']['cell6_impedance']['text'] + + "][#7|" + BMS_STATUS['impedances']['cell7_impedance']['text'] + + "][#8|" + BMS_STATUS['impedances']['cell8_impedance']['text'] + "]") + + elif (packet_length == PACKET_LENGTH_STATUS_IMPEDANCES[1]): # packet from BMS16 + + logging.info("BMS16 impedances " + + "][SUM|" + BMS_STATUS['impedances']['agg_impedances']['sum']['text'] + + "][#1|" + BMS_STATUS['impedances']['cell1_impedance']['text'] + + "][#2|" + BMS_STATUS['impedances']['cell2_impedance']['text'] + + "][#3|" + BMS_STATUS['impedances']['cell3_impedance']['text'] + + "][#4|" + BMS_STATUS['impedances']['cell4_impedance']['text'] + + "][#5|" + BMS_STATUS['impedances']['cell5_impedance']['text'] + + "][#6|" + BMS_STATUS['impedances']['cell6_impedance']['text'] + + "][#7|" + BMS_STATUS['impedances']['cell7_impedance']['text'] + + "][#8|" + BMS_STATUS['impedances']['cell8_impedance']['text'] + + "][#9|" + BMS_STATUS['impedances']['cell9_impedance']['text'] + + "][#10|" + BMS_STATUS['impedances']['cell10_impedance']['text'] + + "][#11|" + BMS_STATUS['impedances']['cell11_impedance']['text'] + + "][#12|" + BMS_STATUS['impedances']['cell12_impedance']['text'] + + "][#13|" + BMS_STATUS['impedances']['cell13_impedance']['text'] + + "][#14|" + BMS_STATUS['impedances']['cell14_impedance']['text'] + + "][#15|" + BMS_STATUS['impedances']['cell15_impedance']['text'] + + "][#16|" + BMS_STATUS['impedances']['cell16_impedance']['text'] + "]") + + + elif (packet_length == PACKET_LENGTH_STATUS_IMPEDANCES[2]): # packet from BMS24 + + logging.info("BMS24 impedances " + + "][SUM|" + BMS_STATUS['impedances']['agg_impedances']['sum']['text'] + + "][#1|" + BMS_STATUS['impedances']['cell1_impedance']['text'] + + "][#2|" + BMS_STATUS['impedances']['cell2_impedance']['text'] + + "][#3|" + BMS_STATUS['impedances']['cell3_impedance']['text'] + + "][#4|" + BMS_STATUS['impedances']['cell4_impedance']['text'] + + "][#5|" + BMS_STATUS['impedances']['cell5_impedance']['text'] + + "][#6|" + BMS_STATUS['impedances']['cell6_impedance']['text'] + + "][#7|" + BMS_STATUS['impedances']['cell7_impedance']['text'] + + "][#8|" + BMS_STATUS['impedances']['cell8_impedance']['text'] + + "][#9|" + BMS_STATUS['impedances']['cell9_impedance']['text'] + + "][#10|" + BMS_STATUS['impedances']['cell10_impedance']['text'] + + "][#11|" + BMS_STATUS['impedances']['cell11_impedance']['text'] + + "][#12|" + BMS_STATUS['impedances']['cell12_impedance']['text'] + + "][#13|" + BMS_STATUS['impedances']['cell13_impedance']['text'] + + "][#14|" + BMS_STATUS['impedances']['cell14_impedance']['text'] + + "][#15|" + BMS_STATUS['impedances']['cell15_impedance']['text'] + + "][#16|" + BMS_STATUS['impedances']['cell16_impedance']['text'] + + "][#17|" + BMS_STATUS['impedances']['cell17_impedance']['text'] + + "][#18|" + BMS_STATUS['impedances']['cell18_impedance']['text'] + + "][#19|" + BMS_STATUS['impedances']['cell19_impedance']['text'] + + "][#20|" + BMS_STATUS['impedances']['cell20_impedance']['text'] + + "][#21|" + BMS_STATUS['impedances']['cell21_impedance']['text'] + + "][#22|" + BMS_STATUS['impedances']['cell22_impedance']['text'] + + "][#23|" + BMS_STATUS['impedances']['cell23_impedance']['text'] + + "][#24|" + BMS_STATUS['impedances']['cell24_impedance']['text'] + "]") else: logging.debug("Packet Checksum wrong, skip packet") @@ -651,12 +1544,13 @@ def parse_packet(packet): logging.debug("Packet Unknown [2]") packet = "" else: - logging.debug("Packet to short") + logging.debug("Packet too short, skip") packet = "" + def handle_serial_data(): - #try: + try: serial_packet = "" if (serial_port.in_waiting > 0): logging.debug("Data Waiting [" + str(serial_port.in_waiting) + " bytes]") @@ -671,15 +1565,24 @@ def handle_serial_data(): data_buffer_array = "" serial_packet = "" - #except KeyboardInterrupt: - # raise + + if args.victron: + # recheck every second + gobject.timeout_add(1000, handle_serial_data) + + except KeyboardInterrupt: + if args.victron: + raise #except: # logging.debug("Exception") - # recheck every second - gobject.timeout_add(1000, handle_serial_data) - -gobject.timeout_add(1000, handle_serial_data) -mainloop = gobject.MainLoop() -mainloop.run() + +if args.victron: + gobject.timeout_add(1000, handle_serial_data) + mainloop = gobject.MainLoop() + mainloop.run() +else: + while True: + handle_serial_data() + time.sleep(1) diff --git a/gui/qml/PageBatteryChargeryBMS.qml b/gui/qml/PageBatteryChargeryBMS.qml index f752f91..1b46a95 100644 --- a/gui/qml/PageBatteryChargeryBMS.qml +++ b/gui/qml/PageBatteryChargeryBMS.qml @@ -20,17 +20,19 @@ MbPage { MbItemRow { id: battvol - description: qsTr("Battery Voltage") + description: qsTr("Battery") values: [ - MbTextBlock { item { bind: service.path("/Voltages/Sum"); } height: 25 } + MbTextBlock { item { bind: service.path("/Info/CurrentMode"); } height: 25 }, + MbTextBlock { item { bind: service.path("/Info/Current"); } width: 70; height: 25 }, + MbTextBlock { item { bind: service.path("/Voltages/Sum"); } width: 70; height: 25 } ] } MbItemRow { description: qsTr("State of Charge") values: [ - MbTextBlock { item { bind: service.path("/Info/CurrentMode"); } height: 25 }, - MbTextBlock { item { bind: service.path("/Info/Current"); } width: 70; height: 25 }, + MbTextBlock { item { bind: service.path("/Voltages/BatteryCapacityWH"); } height: 25 }, + MbTextBlock { item { bind: service.path("/Voltages/BatteryCapacityAH"); } width: 70; height: 25 }, MbTextBlock { item { bind: service.path("/Info/Soc"); } width: 70; height: 25 } ] } @@ -62,9 +64,18 @@ MbPage { MbSubMenu { - description: qsTr("Cells Details") + description: qsTr("Cells Voltages") subpage: Component { - PageBatteryChargeryBMSDetails { + PageBatteryChargeryBMSVoltages { + bindPrefix: service.path("") + } + } + } + + MbSubMenu { + description: qsTr("Cells Impedances") + subpage: Component { + PageBatteryChargeryBMSImpedances { bindPrefix: service.path("") } } diff --git a/gui/qml/PageBatteryChargeryBMSImpedances.qml b/gui/qml/PageBatteryChargeryBMSImpedances.qml new file mode 100644 index 0000000..6267ed1 --- /dev/null +++ b/gui/qml/PageBatteryChargeryBMSImpedances.qml @@ -0,0 +1,48 @@ +import QtQuick 1.1 +import com.victron.velib 1.0 +import "utils.js" as Utils + +MbPage { + id: root + + property string bindPrefix + property BatteryDetails details: BatteryDetails { bindPrefix: root.bindPrefix } + + model: VisualItemModel { + + MbItemRow { + description: qsTr("Impedances Min|Max|Sum") + values: [ + MbTextBlock { item { bind: service.path("/Impedances/Min"); } width: 70; height: 25 }, + MbTextBlock { item { bind: service.path("/Impedances/Max"); } width: 70; height: 25 }, + MbTextBlock { item { bind: service.path("/Impedances/Sum"); } width: 70; height: 25 } + ] + } + + MbItemRow { + description: qsTr("Cells 1|2|3") + values: [ + MbTextBlock { item { bind: service.path("/Impedances/Cell1"); } width: 70; height: 25 }, + MbTextBlock { item { bind: service.path("/Impedances/Cell2"); } width: 70; height: 25 }, + MbTextBlock { item { bind: service.path("/Impedances/Cell3"); } width: 70; height: 25 } + ] + } + + MbItemRow { + description: qsTr("Cells 4|5|6") + values: [ + MbTextBlock { item { bind: service.path("/Impedances/Cell4"); } width: 70; height: 25 }, + MbTextBlock { item { bind: service.path("/Impedances/Cell5"); } width: 70; height: 25 }, + MbTextBlock { item { bind: service.path("/Impedances/Cell6"); } width: 70; height: 25 } + ] + } + + MbItemRow { + description: qsTr("Impedances Data Updated") + values: [ + MbTextBlock { item { bind: service.path("/Impedances/UpdateTimestamp"); } width: 215; height: 25 } + ] + } + + } +} diff --git a/gui/qml/PageBatteryChargeryBMSDetails.qml b/gui/qml/PageBatteryChargeryBMSVoltages.qml similarity index 94% rename from gui/qml/PageBatteryChargeryBMSDetails.qml rename to gui/qml/PageBatteryChargeryBMSVoltages.qml index 678ad01..9d2802f 100644 --- a/gui/qml/PageBatteryChargeryBMSDetails.qml +++ b/gui/qml/PageBatteryChargeryBMSVoltages.qml @@ -11,7 +11,7 @@ MbPage { model: VisualItemModel { MbItemRow { - description: qsTr("Cells Min|Max|Diff") + description: qsTr("Voltages Min|Max|Diff") values: [ MbTextBlock { item { bind: service.path("/Voltages/Min"); } width: 70; height: 25 }, MbTextBlock { item { bind: service.path("/Voltages/Max"); } width: 70; height: 25 }, @@ -45,7 +45,7 @@ MbPage { } MbItemRow { - description: qsTr("Cells Data Updated") + description: qsTr("Voltages Data Updated") values: [ MbTextBlock { item { bind: service.path("/Voltages/UpdateTimestamp"); } width: 215; height: 25 } ]