From 02d4d9c16afa1d99c6f018a15210c96780728be8 Mon Sep 17 00:00:00 2001 From: "Strawder, Paul" Date: Fri, 26 May 2023 13:55:58 +0200 Subject: [PATCH] bugfix: Heltec BMS test_connection breaks on other modbus compliant BMS systems --- etc/dbus-serialbattery/bms/heltecmodbus.py | 4 ++- etc/dbus-serialbattery/config.default.ini | 2 +- etc/dbus-serialbattery/dbus-serialbattery.py | 27 ++++++++++++-------- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/etc/dbus-serialbattery/bms/heltecmodbus.py b/etc/dbus-serialbattery/bms/heltecmodbus.py index 9291fd26..b6271bfb 100644 --- a/etc/dbus-serialbattery/bms/heltecmodbus.py +++ b/etc/dbus-serialbattery/bms/heltecmodbus.py @@ -119,7 +119,7 @@ def read_status_data(self): mbdev = mbdevs[self.address] with locks[self.address]: - for n in range(1, RETRYCNT): + for n in range(1, RETRYCNT + 1): try: ccur = mbdev.read_register(191, 0, 3, False) self.max_battery_charge_current = ( @@ -223,6 +223,8 @@ def read_status_data(self): + "): " + str(e) ) + if n == RETRYCNT: + return False continue logger.info(self.hardware_version) diff --git a/etc/dbus-serialbattery/config.default.ini b/etc/dbus-serialbattery/config.default.ini index 25762314..7631fc6d 100644 --- a/etc/dbus-serialbattery/config.default.ini +++ b/etc/dbus-serialbattery/config.default.ini @@ -180,7 +180,7 @@ TIME_TO_SOC_INC_FROM = False ; --------- Additional settings --------- -; Specify only one BMS type to load else leave empty to try to load all availabe +; Specify only one BMS type to load else leave empty to try to load all available ; LltJbd, Ant, Daly, Daly, Jkbms, Lifepower, Renogy, Renogy, Ecs BMS_TYPE = diff --git a/etc/dbus-serialbattery/dbus-serialbattery.py b/etc/dbus-serialbattery/dbus-serialbattery.py index 6530ace1..c3358ae3 100644 --- a/etc/dbus-serialbattery/dbus-serialbattery.py +++ b/etc/dbus-serialbattery/dbus-serialbattery.py @@ -74,17 +74,24 @@ def get_battery(_port) -> Union[Battery, None]: while count > 0: # create a new battery object that can read the battery and run connection test for test in expected_bms_types: - logger.info("Testing " + test["bms"].__name__) - batteryClass = test["bms"] - baud = test["baud"] - battery: Battery = batteryClass( - port=_port, baud=baud, address=test.get("address") - ) - if battery.test_connection(): - logger.info( - "Connection established to " + battery.__class__.__name__ + # noinspection PyBroadException + try: + logger.info("Testing " + test["bms"].__name__) + batteryClass = test["bms"] + baud = test["baud"] + battery: Battery = batteryClass( + port=_port, baud=baud, address=test.get("address") ) - return battery + if battery.test_connection(): + logger.info( + "Connection established to " + battery.__class__.__name__ + ) + return battery + except KeyboardInterrupt: + return None + except Exception: + # Ignore any malfunction test_function() + pass count -= 1 sleep(0.5)