From 75c83c4a283f061083ba4541e3e4be8bc4ce645a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Brab=C3=A4nder?= Date: Tue, 9 Dec 2025 01:48:12 +0000 Subject: [PATCH 1/7] Fix serial number lengt Read additional parameter like SoH etc. --- dbus-serialbattery/bms/jkbms_pb.py | 87 +++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 8 deletions(-) diff --git a/dbus-serialbattery/bms/jkbms_pb.py b/dbus-serialbattery/bms/jkbms_pb.py index 1258f94e..5975cae4 100644 --- a/dbus-serialbattery/bms/jkbms_pb.py +++ b/dbus-serialbattery/bms/jkbms_pb.py @@ -16,9 +16,9 @@ def __init__(self, port, baud, address): self.unique_identifier_tmp = "" self.cell_count = 0 self.address = address - self.command_status = b"\x10\x16\x20\x00\x01\x02\x00\x00" - self.command_settings = b"\x10\x16\x1e\x00\x01\x02\x00\x00" - self.command_about = b"\x10\x16\x1c\x00\x01\x02\x00\x00" + self.command_status = b"\x10\x16\x20\x00\x01\x02\x00\x00" + self.command_settings = b"\x10\x16\x1e\x00\x01\x02\x00\x00" + self.command_about = b"\x10\x16\x1c\x00\x01\x02\x00\x00" self.history.exclude_values_to_calculate = ["charge_cycles"] BATTERYTYPE = "JKBMS PB Model" @@ -94,10 +94,36 @@ def get_settings(self): CapBatCell = unpack_from(">1) + #Bit2: GPS Heartbeat + GPSHeartbeat=0x01 & (CtrlBitMask>>2) + #Bit3: Port Switch 1:RS485 0: CAN + PortSwitch=0x01 & (CtrlBitMask>>3) + #Bit4: LCD Always ON + LCDAlwaysOn=0x1 & (CtrlBitMask>>4) + #Bit5: Special Charger + SpecialCharger=0x1 & (CtrlBitMask>>5) + #Bit6: Smart Sleep + SmartSleep=0x1 & (CtrlBitMask>>6) + + + TMPBatOTA = unpack_from(" Date: Tue, 9 Dec 2025 01:57:33 +0000 Subject: [PATCH 2/7] enable SoH when available --- dbus-serialbattery/battery.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dbus-serialbattery/battery.py b/dbus-serialbattery/battery.py index a260010c..be8cb5aa 100644 --- a/dbus-serialbattery/battery.py +++ b/dbus-serialbattery/battery.py @@ -310,6 +310,7 @@ def __init__(self, port: str, baud: int, address: str): self.soc_calc_reset_start_time: int = None self.soc_calc: float = None # save soc_calc to preserve on restart self.soc: float = None + self.soh: float = None self.charge_fet: bool = None self.discharge_fet: bool = None self.balance_fet: bool = None @@ -950,6 +951,7 @@ def manage_charge_voltage_limit(self) -> None: + (f" • penalty_sum: {safe_number_format(penalty_sum, '{:.3f}')} V" if utils.CVL_CONTROLLER_MODE == 1 else "") + "\n" + f"soc: {self.soc}% • soc_calc: {self.soc_calc}%\n" + + f"soh: {self.soh}%\n" + f"current: {safe_number_format(self.current, '{:.2f}')}A" + (f" • current_calc: {safe_number_format(self.current_calc, '{:.2f}')} A\n" if self.current_calc is not None else "\n") + f"current_time: {current_time}\n" @@ -2137,7 +2139,7 @@ def log_settings(self) -> None: logger.info(f"Battery {self.type} connected to dbus from {self.port}") logger.info("========== Settings ==========") logger.info( - f"> Connection voltage: {self.voltage} V | Current: {self.current_calc} A | SoC: {self.soc}%" + f"> Connection voltage: {self.voltage} V | Current: {self.current_calc} A | SoC: {self.soc}% | SoH: {self.soh}%" + (f" | SoC calc: {self.soc_calc:.0f}%" if utils.SOC_CALCULATION else "") ) logger.info(f"> Cell count: {self.cell_count} | Cells populated: {cell_counter}") From e04e46fe1e2c7f1b049e0e7b1f2ef67e4a92faa1 Mon Sep 17 00:00:00 2001 From: BitSeb Date: Tue, 9 Dec 2025 02:28:58 +0000 Subject: [PATCH 3/7] reformating code after lint check --- dbus-serialbattery/battery.py | 2 +- dbus-serialbattery/bms/jkbms_pb.py | 38 ++++++++++++++++-------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/dbus-serialbattery/battery.py b/dbus-serialbattery/battery.py index be8cb5aa..dce6fc05 100644 --- a/dbus-serialbattery/battery.py +++ b/dbus-serialbattery/battery.py @@ -2139,7 +2139,7 @@ def log_settings(self) -> None: logger.info(f"Battery {self.type} connected to dbus from {self.port}") logger.info("========== Settings ==========") logger.info( - f"> Connection voltage: {self.voltage} V | Current: {self.current_calc} A | SoC: {self.soc}% | SoH: {self.soh}%" + f"> Connection voltage: {self.voltage} V | Current: {self.current_calc} A | SoC: {self.soc}% | SoH: {self.soh}%" + (f" | SoC calc: {self.soc_calc:.0f}%" if utils.SOC_CALCULATION else "") ) logger.info(f"> Cell count: {self.cell_count} | Cells populated: {cell_counter}") diff --git a/dbus-serialbattery/bms/jkbms_pb.py b/dbus-serialbattery/bms/jkbms_pb.py index 5975cae4..a80b2fec 100644 --- a/dbus-serialbattery/bms/jkbms_pb.py +++ b/dbus-serialbattery/bms/jkbms_pb.py @@ -185,24 +185,24 @@ def get_settings(self): logger.debug("TIMSmartSleep: " + str(TIMSmartSleep)) status_data = self.read_serial_data_jkbms_pb(self.command_about, 300) - #vendor_version start 0: 16 chars - #hw_version start 16: 8 chars - #sw_version start 24: 8 chars - #oddruntim start 32: 1 UINT32 - #pwr_on_time start 36: 1 UINT32 + # vendor_version start 0: 16 chars + # hw_version start 16: 8 chars + # sw_version start 24: 8 chars + # oddruntim start 32: 1 UINT32 + # pwr_on_time start 36: 1 UINT32 - vendor_id = status_data[6:21].decode("utf-8").split('\x00',1)[0] # 16 chars - hw_version = status_data[22:29].decode("utf-8").split('\x00',1)[0] # 8 chars - sw_version = status_data[30:37].decode("utf-8").split('\x00',1)[0] # 8 chars - bms_version = (hw_version + " / " + sw_version) + vendor_id = status_data[6:21].decode("utf-8").split('\x00',1)[0] # 16 chars + hw_version = status_data[22:29].decode("utf-8").split('\x00',1)[0] # 8 chars + sw_version = status_data[30:37].decode("utf-8").split('\x00',1)[0] # 8 chars + bms_version = hw_version + " / " + sw_version ODDRunTime = unpack_from(" Date: Tue, 9 Dec 2025 02:38:27 +0000 Subject: [PATCH 4/7] reformating code --- dbus-serialbattery/bms/jkbms_pb.py | 61 +++++++++++++++--------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/dbus-serialbattery/bms/jkbms_pb.py b/dbus-serialbattery/bms/jkbms_pb.py index a80b2fec..dba93503 100644 --- a/dbus-serialbattery/bms/jkbms_pb.py +++ b/dbus-serialbattery/bms/jkbms_pb.py @@ -16,9 +16,9 @@ def __init__(self, port, baud, address): self.unique_identifier_tmp = "" self.cell_count = 0 self.address = address - self.command_status = b"\x10\x16\x20\x00\x01\x02\x00\x00" - self.command_settings = b"\x10\x16\x1e\x00\x01\x02\x00\x00" - self.command_about = b"\x10\x16\x1c\x00\x01\x02\x00\x00" + self.command_status = b"\x10\x16\x20\x00\x01\x02\x00\x00" + self.command_settings = b"\x10\x16\x1e\x00\x01\x02\x00\x00" + self.command_about = b"\x10\x16\x1c\x00\x01\x02\x00\x00" self.history.exclude_values_to_calculate = ["charge_cycles"] BATTERYTYPE = "JKBMS PB Model" @@ -94,29 +94,28 @@ def get_settings(self): CapBatCell = unpack_from(">1) - #Bit2: GPS Heartbeat - GPSHeartbeat=0x01 & (CtrlBitMask>>2) - #Bit3: Port Switch 1:RS485 0: CAN - PortSwitch=0x01 & (CtrlBitMask>>3) - #Bit4: LCD Always ON - LCDAlwaysOn=0x1 & (CtrlBitMask>>4) - #Bit5: Special Charger - SpecialCharger=0x1 & (CtrlBitMask>>5) - #Bit6: Smart Sleep - SmartSleep=0x1 & (CtrlBitMask>>6) - - - TMPBatOTA = unpack_from("> 1) + # Bit2: GPS Heartbeat + GPSHeartbeat = 0x01 & (CtrlBitMask >> 2) + # Bit3: Port Switch 1:RS485 0: CAN + PortSwitch = 0x01 & (CtrlBitMask >> 3) + # Bit4: LCD Always ON + LCDAlwaysOn = 0x1 & (CtrlBitMask >> 4) + # Bit5: Special Charger + SpecialCharger = 0x1 & (CtrlBitMask >> 5) + # Bit6: Smart Sleep + SmartSleep = 0x1 & (CtrlBitMask >> 6) + + TMPBatOTA = unpack_from(" Date: Tue, 9 Dec 2025 02:48:03 +0000 Subject: [PATCH 5/7] reformatting code ... --- dbus-serialbattery/bms/jkbms_pb.py | 31 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/dbus-serialbattery/bms/jkbms_pb.py b/dbus-serialbattery/bms/jkbms_pb.py index dba93503..8e434f82 100644 --- a/dbus-serialbattery/bms/jkbms_pb.py +++ b/dbus-serialbattery/bms/jkbms_pb.py @@ -94,10 +94,10 @@ def get_settings(self): CapBatCell = unpack_from("> 6) - TMPBatOTA = unpack_from(" Date: Tue, 9 Dec 2025 02:53:03 +0000 Subject: [PATCH 6/7] reformatting code --- dbus-serialbattery/bms/jkbms_pb.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dbus-serialbattery/bms/jkbms_pb.py b/dbus-serialbattery/bms/jkbms_pb.py index 8e434f82..119afad8 100644 --- a/dbus-serialbattery/bms/jkbms_pb.py +++ b/dbus-serialbattery/bms/jkbms_pb.py @@ -190,17 +190,17 @@ def get_settings(self): # oddruntim start 32: 1 UINT32 # pwr_on_time start 36: 1 UINT32 - vendor_id = status_data[6:21].decode("utf-8").split('\x00', 1)[0] # 16 chars - hw_version = status_data[22:29].decode("utf-8").split('\x00', 1)[0] # 8 chars - sw_version = status_data[30:37].decode("utf-8").split('\x00', 1)[0] # 8 chars + vendor_id = status_data[6:21].decode("utf-8").split("\x00", 1)[0] # 16 chars + hw_version = status_data[22:29].decode("utf-8").split("\x00", 1)[0] # 8 chars + sw_version = status_data[30:37].decode("utf-8").split("\x00", 1)[0] # 8 chars bms_version = hw_version + " / " + sw_version ODDRunTime = unpack_from(" Date: Tue, 9 Dec 2025 02:59:50 +0000 Subject: [PATCH 7/7] disable heat for flake 8 check --- dbus-serialbattery/bms/jkbms_pb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbus-serialbattery/bms/jkbms_pb.py b/dbus-serialbattery/bms/jkbms_pb.py index 119afad8..42cd67e9 100644 --- a/dbus-serialbattery/bms/jkbms_pb.py +++ b/dbus-serialbattery/bms/jkbms_pb.py @@ -292,7 +292,7 @@ def read_status_data(self): bal = unpack_from("