From c80d8c5d0c0f656c783e72dd4bb27901dd2ab519 Mon Sep 17 00:00:00 2001 From: Manuel Date: Sat, 6 Jan 2024 11:08:03 +0100 Subject: [PATCH 1/4] Changed: Fix issue loading settings from dbus --- CHANGELOG.md | 5 + etc/dbus-serialbattery/battery.py | 2 - etc/dbus-serialbattery/dbushelper.py | 222 ++++++++++++++------------- etc/dbus-serialbattery/utils.py | 2 +- 4 files changed, 119 insertions(+), 112 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d99217a5..17307485 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,11 @@ ## v1.0.x +* Changed: Fix issue on first driver startup, when no device setting in dbus exists by @mr-manuel + + +## v1.0.20240102beta + * Added: Bluetooth: Show signal strength of BMS in log by @mr-manuel * Added: Configure logging level in `config.ini` by @mr-manuel * Added: Create unique identifier, if not provided from BMS by @mr-manuel diff --git a/etc/dbus-serialbattery/battery.py b/etc/dbus-serialbattery/battery.py index 1db9aa0f..aa02a2de 100644 --- a/etc/dbus-serialbattery/battery.py +++ b/etc/dbus-serialbattery/battery.py @@ -493,8 +493,6 @@ def manage_charge_voltage_linear(self) -> None: if self.soc_reset_requested: # logger.info("set soc_reset_requested to False") self.soc_reset_requested = False - # IDEA: Save "soc_reset_last_reached" in the dbus path com.victronenergy.settings - # to make it restart persistent self.soc_reset_last_reached = current_time if self.control_voltage: # check if battery changed from bulk/absoprtion to float diff --git a/etc/dbus-serialbattery/dbushelper.py b/etc/dbus-serialbattery/dbushelper.py index 0636c7e1..2a06aa19 100644 --- a/etc/dbus-serialbattery/dbushelper.py +++ b/etc/dbus-serialbattery/dbushelper.py @@ -126,126 +126,130 @@ def setup_instance(self): # } # loop through devices in dbus settings - for key, value in settings_from_dbus["Settings"]["Devices"].items(): - # check if it's a serialbattery - if "serialbattery" in key: - # check used device instances - if "ClassAndVrmInstance" in value: - device_instances_used.append( - value["ClassAndVrmInstance"][ - value["ClassAndVrmInstance"].rfind(":") + 1 : - ] - ) - - # check the unique identifier, if the battery was already connected once - # if so, get the last saved data - if ( - "UniqueIdentifier" in value - and value["UniqueIdentifier"] == self.bms_id - ): - # set found_bms to true - found_bms = True - - # get the instance from the object name - device_instance = int( - value["ClassAndVrmInstance"][ - value["ClassAndVrmInstance"].rfind(":") + 1 : - ] - ) - logger.info( - f"Found existing battery with DeviceInstance = {device_instance}" - ) + if ( + "Settings" in settings_from_dbus + and "Devices" in settings_from_dbus["Settings"] + ): + for key, value in settings_from_dbus["Settings"]["Devices"].items(): + # check if it's a serialbattery + if "serialbattery" in key: + # check used device instances + if "ClassAndVrmInstance" in value: + device_instances_used.append( + value["ClassAndVrmInstance"][ + value["ClassAndVrmInstance"].rfind(":") + 1 : + ] + ) - if "AllowMaxVoltage" in value and isinstance( - value["AllowMaxVoltage"], int + # check the unique identifier, if the battery was already connected once + # if so, get the last saved data + if ( + "UniqueIdentifier" in value + and value["UniqueIdentifier"] == self.bms_id ): - self.battery.allow_max_voltage = ( - True if value["AllowMaxVoltage"] == 1 else False + # set found_bms to true + found_bms = True + + # get the instance from the object name + device_instance = int( + value["ClassAndVrmInstance"][ + value["ClassAndVrmInstance"].rfind(":") + 1 : + ] + ) + logger.info( + f"Found existing battery with DeviceInstance = {device_instance}" ) - self.battery.max_voltage_start_time = None - # check if the battery has a custom name - if "CustomName" in value and value["CustomName"] != "": - custom_name = value["CustomName"] + if "AllowMaxVoltage" in value and isinstance( + value["AllowMaxVoltage"], int + ): + self.battery.allow_max_voltage = ( + True if value["AllowMaxVoltage"] == 1 else False + ) + self.battery.max_voltage_start_time = None - if "MaxVoltageStartTime" in value and isinstance( - value["MaxVoltageStartTime"], int - ): - self.battery.max_voltage_start_time = int( - value["MaxVoltageStartTime"] - ) + # check if the battery has a custom name + if "CustomName" in value and value["CustomName"] != "": + custom_name = value["CustomName"] - # load SOC from dbus only if SOC_CALCULATION is enabled - if utils.SOC_CALCULATION: - if "SocCalc" in value: - self.battery.soc_calc = float(value["SocCalc"]) - logger.info( - f"Soc_calc read from dbus: {self.battery.soc_calc}" + if "MaxVoltageStartTime" in value and isinstance( + value["MaxVoltageStartTime"], int + ): + self.battery.max_voltage_start_time = int( + value["MaxVoltageStartTime"] ) - else: - logger.info("Soc_calc not found in dbus") - if "SocResetLastReached" in value and isinstance( - value["SocResetLastReached"], int - ): - self.battery.soc_reset_last_reached = int( - value["SocResetLastReached"] - ) + # load SOC from dbus only if SOC_CALCULATION is enabled + if utils.SOC_CALCULATION: + if "SocCalc" in value: + self.battery.soc_calc = float(value["SocCalc"]) + logger.info( + f"Soc_calc read from dbus: {self.battery.soc_calc}" + ) + else: + logger.info("Soc_calc not found in dbus") + + if "SocResetLastReached" in value and isinstance( + value["SocResetLastReached"], int + ): + self.battery.soc_reset_last_reached = int( + value["SocResetLastReached"] + ) - # check the last seen time and remove the battery it it was not seen for 30 days - elif "LastSeen" in value and int(value["LastSeen"]) < int(time()) - ( - 60 * 60 * 24 * 30 - ): - # remove entry - del_return = self.removeSetting( - get_bus(), - "com.victronenergy.settings", - "/Settings/Devices/" + key, - [ - "AllowMaxVoltage", - "ClassAndVrmInstance", - "CustomName", - "LastSeen", - "MaxVoltageStartTime", - "SocCalc", - "SocResetLastReached", - "UniqueIdentifier", - ], - ) - logger.info( - f"Remove /Settings/Devices/{key} from dbus. Delete result: {del_return}" - ) + # check the last seen time and remove the battery it it was not seen for 30 days + elif "LastSeen" in value and int(value["LastSeen"]) < int( + time() + ) - (60 * 60 * 24 * 30): + # remove entry + del_return = self.removeSetting( + get_bus(), + "com.victronenergy.settings", + "/Settings/Devices/" + key, + [ + "AllowMaxVoltage", + "ClassAndVrmInstance", + "CustomName", + "LastSeen", + "MaxVoltageStartTime", + "SocCalc", + "SocResetLastReached", + "UniqueIdentifier", + ], + ) + logger.info( + f"Remove /Settings/Devices/{key} from dbus. Delete result: {del_return}" + ) - # check if the battery has a last seen time, if not then it's an old entry and can be removed - elif "LastSeen" not in value: - del_return = self.removeSetting( - get_bus(), - "com.victronenergy.settings", - "/Settings/Devices/" + key, - ["ClassAndVrmInstance"], - ) - logger.info( - f"Remove /Settings/Devices/{key} from dbus. " - + f"Old entry. Delete result: {del_return}" - ) + # check if the battery has a last seen time, if not then it's an old entry and can be removed + elif "LastSeen" not in value: + del_return = self.removeSetting( + get_bus(), + "com.victronenergy.settings", + "/Settings/Devices/" + key, + ["ClassAndVrmInstance"], + ) + logger.info( + f"Remove /Settings/Devices/{key} from dbus. " + + f"Old entry. Delete result: {del_return}" + ) - if "ruuvi" in key: - # check if Ruuvi tag is enabled, if not remove entry. - if ( - "Enabled" in value - and value["Enabled"] == "0" - and "ClassAndVrmInstance" not in value - ): - del_return = self.removeSetting( - get_bus(), - "com.victronenergy.settings", - "/Settings/Devices/" + key, - ["CustomName", "Enabled", "TemperatureType"], - ) - logger.info( - f"Remove /Settings/Devices/{key} from dbus. " - + f"Ruuvi tag was disabled and had no ClassAndVrmInstance. Delete result: {del_return}" - ) + if "ruuvi" in key: + # check if Ruuvi tag is enabled, if not remove entry. + if ( + "Enabled" in value + and value["Enabled"] == "0" + and "ClassAndVrmInstance" not in value + ): + del_return = self.removeSetting( + get_bus(), + "com.victronenergy.settings", + "/Settings/Devices/" + key, + ["CustomName", "Enabled", "TemperatureType"], + ) + logger.info( + f"Remove /Settings/Devices/{key} from dbus. " + + f"Ruuvi tag was disabled and had no ClassAndVrmInstance. Delete result: {del_return}" + ) logger.debug("setup_instance(): for loop ended") diff --git a/etc/dbus-serialbattery/utils.py b/etc/dbus-serialbattery/utils.py index 97fa9e08..8526ec98 100644 --- a/etc/dbus-serialbattery/utils.py +++ b/etc/dbus-serialbattery/utils.py @@ -37,7 +37,7 @@ def _get_list_from_config( # Constants -DRIVER_VERSION = "1.1.20231224dev" +DRIVER_VERSION = "1.1.20240106dev" zero_char = chr(48) degree_sign = "\N{DEGREE SIGN}" From 6da7dad4e2343a3ab0cd2c6a213d2dddc0535add Mon Sep 17 00:00:00 2001 From: Manuel Date: Fri, 12 Jan 2024 09:07:49 +0100 Subject: [PATCH 2/4] Added nightly install option makes it easier for users to pretest fixes --- etc/dbus-serialbattery/install.sh | 77 ++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 21 deletions(-) diff --git a/etc/dbus-serialbattery/install.sh b/etc/dbus-serialbattery/install.sh index c54c92c6..fddbb510 100755 --- a/etc/dbus-serialbattery/install.sh +++ b/etc/dbus-serialbattery/install.sh @@ -94,20 +94,25 @@ if [ "$version" = "nightly build" ]; then PS3="Select the branch from wich you want to install the current code (possible bugs included): " - select branch in master dev quit + select branch in "master" "dev" "dev (mr-manuel's repo)" "quit" do case $branch in - master) + "master") echo "Selected branch: $branch" #echo "Selected number: $REPLY" break ;; - dev) + "dev") echo "Selected branch: $branch" #echo "Selected number: $REPLY" break ;; - quit) + "dev (mr-manuel's repo)") + echo "Selected branch: $branch" + #echo "Selected number: $REPLY" + break + ;; + "quit") exit 0 ;; *) @@ -119,28 +124,58 @@ if [ "$version" = "nightly build" ]; then cd /tmp - # clean already extracted folder - rm -rf /tmp/dbus-serialbattery-$branch + if [ "$branch" = "dev (mr-manuel's repo)" ]; then + branch="dev" + + # clean already extracted folder + rm -rf /tmp/venus-os_dbus-serialbattery-$branch + + # download driver + wget -O $branch.zip https://github.com/mr-manuel/venus-os_dbus-serialbattery/archive/refs/heads/$branch.zip + if [ $? -ne 0 ]; then + echo "Error during downloading the ZIP file. Please try again." + # restore config.ini + if [ -f "/data/etc/dbus-serialbattery_config.ini.backup" ]; then + mv /data/etc/dbus-serialbattery_config.ini.backup /data/etc/dbus-serialbattery/config.ini + fi + exit + fi - # download driver - wget -O $branch.zip https://github.com/Louisvdw/dbus-serialbattery/archive/refs/heads/$branch.zip - if [ $? -ne 0 ]; then - echo "Error during downloading the TAR file. Please try again." - # restore config.ini - if [ -f "/data/etc/dbus-serialbattery_config.ini.backup" ]; then - mv /data/etc/dbus-serialbattery_config.ini.backup /data/etc/dbus-serialbattery/config.ini + # extract archive + unzip -q $branch.zip + + # remove old driver + rm -rf /data/etc/dbus-serialbattery + + # copy driver + cp -rf /tmp/venus-os_dbus-serialbattery-$branch/etc/dbus-serialbattery/ /data/etc + + else + + # clean already extracted folder + rm -rf /tmp/dbus-serialbattery-$branch + + # download driver + wget -O $branch.zip https://github.com/Louisvdw/dbus-serialbattery/archive/refs/heads/$branch.zip + if [ $? -ne 0 ]; then + echo "Error during downloading the ZIP file. Please try again." + # restore config.ini + if [ -f "/data/etc/dbus-serialbattery_config.ini.backup" ]; then + mv /data/etc/dbus-serialbattery_config.ini.backup /data/etc/dbus-serialbattery/config.ini + fi + exit fi - exit - fi - # extract archive - unzip -q $branch.zip + # extract archive + unzip -q $branch.zip - # remove old driver - rm -rf /data/etc/dbus-serialbattery + # remove old driver + rm -rf /data/etc/dbus-serialbattery - # copy driver - cp -rf /tmp/dbus-serialbattery-$branch/etc/dbus-serialbattery/ /data/etc + # copy driver + cp -rf /tmp/dbus-serialbattery-$branch/etc/dbus-serialbattery/ /data/etc + + fi # set permissions chmod +x /data/etc/dbus-serialbattery/*.sh From 62221211cf68c7fa210aba1403fd1c9eceb27e45 Mon Sep 17 00:00:00 2001 From: Manuel Date: Fri, 12 Jan 2024 09:09:56 +0100 Subject: [PATCH 3/4] Changed: more detailed error output when an exception happens --- CHANGELOG.md | 1 + etc/dbus-serialbattery/bms/ant.py | 14 ++++++++-- .../bms/battery_template.py | 14 ++++++++-- etc/dbus-serialbattery/bms/daly.py | 14 ++++++++-- etc/dbus-serialbattery/bms/ecs.py | 14 ++++++++-- etc/dbus-serialbattery/bms/hlpdatabms4s.py | 14 ++++++++-- etc/dbus-serialbattery/bms/jkbms.py | 14 ++++++++-- etc/dbus-serialbattery/bms/jkbms_ble.py | 14 ++++++++-- etc/dbus-serialbattery/bms/jkbms_brn.py | 26 +++++++++++++++---- etc/dbus-serialbattery/bms/lifepower.py | 14 ++++++++-- etc/dbus-serialbattery/bms/lltjbd.py | 14 ++++++++-- etc/dbus-serialbattery/bms/mnb.py | 14 ++++++++-- etc/dbus-serialbattery/bms/renogy.py | 14 ++++++++-- etc/dbus-serialbattery/bms/revov.py | 14 ++++++++-- etc/dbus-serialbattery/bms/seplos.py | 14 ++++++++-- etc/dbus-serialbattery/bms/sinowealth.py | 14 ++++++++-- etc/dbus-serialbattery/utils.py | 2 +- 17 files changed, 191 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17307485..9743edd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ ## v1.0.x * Changed: Fix issue on first driver startup, when no device setting in dbus exists by @mr-manuel +* Changed: More detailed error output when an exception happens by @mr-manuel ## v1.0.20240102beta diff --git a/etc/dbus-serialbattery/bms/ant.py b/etc/dbus-serialbattery/bms/ant.py index ceb6be68..6b4c792e 100644 --- a/etc/dbus-serialbattery/bms/ant.py +++ b/etc/dbus-serialbattery/bms/ant.py @@ -8,6 +8,7 @@ from utils import read_serial_data, logger import utils from struct import unpack_from +import sys class ANT(Battery): @@ -32,8 +33,17 @@ def test_connection(self): try: result = self.read_status_data() result = result and self.refresh_data() - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) result = False return result diff --git a/etc/dbus-serialbattery/bms/battery_template.py b/etc/dbus-serialbattery/bms/battery_template.py index e859c675..98fe4204 100644 --- a/etc/dbus-serialbattery/bms/battery_template.py +++ b/etc/dbus-serialbattery/bms/battery_template.py @@ -9,6 +9,7 @@ from utils import is_bit_set, read_serial_data, logger import utils from struct import unpack_from +import sys class BatteryTemplate(Battery): @@ -29,8 +30,17 @@ def test_connection(self): result = self.read_status_data() # get first data to show in startup log, only if result is true result = result and self.refresh_data() - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) result = False return result diff --git a/etc/dbus-serialbattery/bms/daly.py b/etc/dbus-serialbattery/bms/daly.py index f9639fcc..d3799014 100644 --- a/etc/dbus-serialbattery/bms/daly.py +++ b/etc/dbus-serialbattery/bms/daly.py @@ -6,6 +6,7 @@ from time import sleep, time from datetime import datetime from re import sub +import sys class Daly(Battery): @@ -66,8 +67,17 @@ def test_connection(self): self.read_soc_data(ser) self.read_battery_code(ser) - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) result = False # give the user a feedback that no BMS was found diff --git a/etc/dbus-serialbattery/bms/ecs.py b/etc/dbus-serialbattery/bms/ecs.py index ddfdf901..416fa1d6 100644 --- a/etc/dbus-serialbattery/bms/ecs.py +++ b/etc/dbus-serialbattery/bms/ecs.py @@ -4,6 +4,7 @@ from utils import logger import utils import minimalmodbus +import sys class Ecs(Battery): @@ -58,8 +59,17 @@ def test_connection(self): except IOError: result = False - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) result = False # give the user a feedback that no BMS was found diff --git a/etc/dbus-serialbattery/bms/hlpdatabms4s.py b/etc/dbus-serialbattery/bms/hlpdatabms4s.py index 9f33dc25..b4870f05 100644 --- a/etc/dbus-serialbattery/bms/hlpdatabms4s.py +++ b/etc/dbus-serialbattery/bms/hlpdatabms4s.py @@ -4,6 +4,7 @@ import utils import serial from time import sleep +import sys class HLPdataBMS4S(Battery): @@ -20,8 +21,17 @@ def test_connection(self): result = False try: result = self.read_test_data() - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) result = False # give the user a feedback that no BMS was found diff --git a/etc/dbus-serialbattery/bms/jkbms.py b/etc/dbus-serialbattery/bms/jkbms.py index 0a391d39..da279244 100644 --- a/etc/dbus-serialbattery/bms/jkbms.py +++ b/etc/dbus-serialbattery/bms/jkbms.py @@ -4,6 +4,7 @@ import utils from struct import unpack_from from re import sub +import sys class Jkbms(Battery): @@ -25,8 +26,17 @@ def test_connection(self): # Return True if success, False for failure try: return self.read_status_data() - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) return False def get_settings(self): diff --git a/etc/dbus-serialbattery/bms/jkbms_ble.py b/etc/dbus-serialbattery/bms/jkbms_ble.py index 46742807..d025b5b6 100644 --- a/etc/dbus-serialbattery/bms/jkbms_ble.py +++ b/etc/dbus-serialbattery/bms/jkbms_ble.py @@ -6,6 +6,7 @@ from time import sleep, time from bms.jkbms_brn import Jkbms_Brn import os +import sys # from bleak import BleakScanner, BleakError # import asyncio @@ -69,8 +70,17 @@ def test_connection(self): if not result: logger.error("No BMS found at " + self.address) - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) result = False return result diff --git a/etc/dbus-serialbattery/bms/jkbms_brn.py b/etc/dbus-serialbattery/bms/jkbms_brn.py index f0c29ee1..df5e0b15 100644 --- a/etc/dbus-serialbattery/bms/jkbms_brn.py +++ b/etc/dbus-serialbattery/bms/jkbms_brn.py @@ -460,19 +460,35 @@ async def asy_connect_and_scrape(self): self.trigger_soc_reset = False await self.reset_soc_jk(client) await asyncio.sleep(0.01) - except Exception as err: - self.run = False + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno logger.info( - f"--> asy_connect_and_scrape(): error while connecting to bt: {err}" + f"--> asy_connect_and_scrape(): error while connecting to bt: {repr(exception_object)} " + + f"of type {exception_type} in {file} line #{line}" ) + self.run = False finally: self.run = False if client.is_connected: try: await client.disconnect() - except Exception as err: + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno logger.info( - f"--> asy_connect_and_scrape(): error while disconnecting: {err}" + f"--> asy_connect_and_scrape(): error while disconnecting: {repr(exception_object)} " + + f"of type {exception_type} in {file} line #{line}" ) logger.info("--> asy_connect_and_scrape(): Exit") diff --git a/etc/dbus-serialbattery/bms/lifepower.py b/etc/dbus-serialbattery/bms/lifepower.py index b46421fb..7b188c2c 100644 --- a/etc/dbus-serialbattery/bms/lifepower.py +++ b/etc/dbus-serialbattery/bms/lifepower.py @@ -5,6 +5,7 @@ import utils from struct import unpack_from import re +import sys class Lifepower(Battery): @@ -28,8 +29,17 @@ def test_connection(self): result = False try: result = self.read_status_data() - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) result = False return result diff --git a/etc/dbus-serialbattery/bms/lltjbd.py b/etc/dbus-serialbattery/bms/lltjbd.py index 645a5142..ffbd16c0 100644 --- a/etc/dbus-serialbattery/bms/lltjbd.py +++ b/etc/dbus-serialbattery/bms/lltjbd.py @@ -4,6 +4,7 @@ import utils from struct import unpack_from, pack import struct +import sys # Protocol registers REG_ENTER_FACTORY = 0x00 @@ -268,8 +269,17 @@ def test_connection(self): and self.get_settings() and self.refresh_data() ) - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) result = False return result diff --git a/etc/dbus-serialbattery/bms/mnb.py b/etc/dbus-serialbattery/bms/mnb.py index ac95608d..55155de2 100644 --- a/etc/dbus-serialbattery/bms/mnb.py +++ b/etc/dbus-serialbattery/bms/mnb.py @@ -8,6 +8,7 @@ from battery import Protection, Battery, Cell from utils import logger from bms.mnb_utils_max17853 import data_cycle, init_max +import sys # from struct import * # from bms.mnb_test_max17853 import * # use test for testing @@ -97,8 +98,17 @@ def test_connection(self): result = False try: result = self.read_status_data() - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) result = False return result diff --git a/etc/dbus-serialbattery/bms/renogy.py b/etc/dbus-serialbattery/bms/renogy.py index e920a771..a1a94628 100644 --- a/etc/dbus-serialbattery/bms/renogy.py +++ b/etc/dbus-serialbattery/bms/renogy.py @@ -4,6 +4,7 @@ import utils from struct import unpack import struct +import sys class Renogy(Battery): @@ -49,8 +50,17 @@ def test_connection(self): result = self.read_gen_data() # get first data to show in startup log result = result and self.refresh_data() - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) result = False return result diff --git a/etc/dbus-serialbattery/bms/revov.py b/etc/dbus-serialbattery/bms/revov.py index 17764989..6db47c9d 100644 --- a/etc/dbus-serialbattery/bms/revov.py +++ b/etc/dbus-serialbattery/bms/revov.py @@ -7,6 +7,7 @@ from utils import * from struct import * import struct +import sys # Author: L Sheed # Date: 3 May 2022 @@ -57,8 +58,17 @@ def test_connection(self): # get first data to show in startup log if result: self.refresh_data() - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) result = False return result diff --git a/etc/dbus-serialbattery/bms/seplos.py b/etc/dbus-serialbattery/bms/seplos.py index 0a0c3fe2..67002d91 100644 --- a/etc/dbus-serialbattery/bms/seplos.py +++ b/etc/dbus-serialbattery/bms/seplos.py @@ -3,6 +3,7 @@ from utils import logger import utils import serial +import sys class Seplos(Battery): @@ -82,8 +83,17 @@ def test_connection(self): result = False try: result = self.read_status_data() - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) result = False # give the user a feedback that no BMS was found diff --git a/etc/dbus-serialbattery/bms/sinowealth.py b/etc/dbus-serialbattery/bms/sinowealth.py index 8e4e900e..735c1680 100644 --- a/etc/dbus-serialbattery/bms/sinowealth.py +++ b/etc/dbus-serialbattery/bms/sinowealth.py @@ -8,6 +8,7 @@ from utils import kelvin_to_celsius, read_serial_data, logger import utils from struct import unpack_from +import sys class Sinowealth(Battery): @@ -47,8 +48,17 @@ def test_connection(self): result = self.read_status_data() result = result and self.get_settings() result = result and self.refresh_data() - except Exception as err: - logger.error(f"Unexpected {err=}, {type(err)=}") + except Exception: + ( + exception_type, + exception_object, + exception_traceback, + ) = sys.exc_info() + file = exception_traceback.tb_frame.f_code.co_filename + line = exception_traceback.tb_lineno + logger.error( + f"Exception occurred: {repr(exception_object)} of type {exception_type} in {file} line #{line}" + ) result = False return result diff --git a/etc/dbus-serialbattery/utils.py b/etc/dbus-serialbattery/utils.py index 8526ec98..4a3266bd 100644 --- a/etc/dbus-serialbattery/utils.py +++ b/etc/dbus-serialbattery/utils.py @@ -37,7 +37,7 @@ def _get_list_from_config( # Constants -DRIVER_VERSION = "1.1.20240106dev" +DRIVER_VERSION = "1.1.20240112dev" zero_char = chr(48) degree_sign = "\N{DEGREE SIGN}" From da0f5243ab0e40b85f4348e5f1454a14b7b5c3f8 Mon Sep 17 00:00:00 2001 From: Manuel Date: Fri, 12 Jan 2024 09:13:16 +0100 Subject: [PATCH 4/4] Possible fix for #912 https://github.com/Louisvdw/dbus-serialbattery/issues/912 --- etc/dbus-serialbattery/bms/lltjbd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/dbus-serialbattery/bms/lltjbd.py b/etc/dbus-serialbattery/bms/lltjbd.py index ffbd16c0..7ae58f48 100644 --- a/etc/dbus-serialbattery/bms/lltjbd.py +++ b/etc/dbus-serialbattery/bms/lltjbd.py @@ -632,7 +632,7 @@ def validate_packet(data): ">>> ERROR: Invalid response packet. Expected begin packet character 0xDD" ) if status != 0x0: - logger.warn(">>> WARN: BMS rejected request. Status " + status) + logger.warn(">>> WARN: BMS rejected request. Status " + str(status)) return False if len(data) != payload_length + 7: logger.error(