From 982de486e5c4823d181c008eb6198f17294711bc Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 4 May 2026 14:05:59 +0200 Subject: [PATCH 1/5] improve messages --- .../helpermodules/utils/error_handling.py | 13 ++------- packages/modules/common/hardware_check.py | 28 ++++++++----------- 2 files changed, 14 insertions(+), 27 deletions(-) diff --git a/packages/helpermodules/utils/error_handling.py b/packages/helpermodules/utils/error_handling.py index 7695451ea8..c444cec61d 100644 --- a/packages/helpermodules/utils/error_handling.py +++ b/packages/helpermodules/utils/error_handling.py @@ -8,16 +8,7 @@ log = logging.getLogger(__name__) -CP_ERROR = ("Anhaltender Fehler beim Auslesen des Ladepunkts. Soll-Stromstärke, Lade- und Stecker-Status wird " - "zurückgesetzt.") - -INTERNAL_ERROR_HINT = ("Liebe Kunden, das Log ist zur Auswertung durch Support-Mitarbeiter der openWB GmbH gedacht. " - "Meldungen, die hier erscheinen können wie Fehlermeldungen aussehen, sind aber oft ganz normal. " - "Beispielsweise führen wir Abfragen der internen Hardware mehrere tausend mal pro Stunde aus " - "(wir gehen bis ans Limit der seriellen Kommunikation um eine möglichst feine Auflösung zu " - "erreichen), eine Abfrage-Fehlerquote von 1-2% ist dabei normal. Wirklich relevante " - "Fehlermeldungen erscheinen in der grafischen Nutzeroberfläche an prominenter Stelle. Bitte " - "belastet unseren Support nicht mit Fragen nach euch unbekannten Log-Meldungen.") +CP_ERROR = "Soll-Stromstärke, Lade- und Stecker-Status wird zurückgesetzt." class ErrorTimerContext: @@ -42,7 +33,7 @@ def __exit__(self, exception_type, exception, exception_traceback) -> bool: # keine Werte mehr gepublished. return False else: - log.error(f"{exception}\n{INTERNAL_ERROR_HINT}") + log.error(exception) return True return True diff --git a/packages/modules/common/hardware_check.py b/packages/modules/common/hardware_check.py index 908049e218..ed990560fd 100644 --- a/packages/modules/common/hardware_check.py +++ b/packages/modules/common/hardware_check.py @@ -15,19 +15,15 @@ MAX_ATTEMPTS = 3 RETRY_DELAY_SECONDS = 0.3 -OPEN_TICKET = (" Bitte nehme bei anhaltenden Problemen über die Support-Funktion in den Einstellungen Kontakt mit " + - "uns auf.") -RS485_ADAPTER_BROKEN = ("Auslesen von Zähler UND Evse nicht möglich. Vermutlich ist {} defekt oder zwei " - "Busteilnehmer haben die gleiche Modbus-ID. Bitte die Zähler-ID prüfen.") -USB_ADAPTER_BROKEN = RS485_ADAPTER_BROKEN.format('der USB-Adapter') -LAN_ADAPTER_BROKEN = (f"{RS485_ADAPTER_BROKEN.format('der LAN-Konverter abgestürzt,')} " - "Bitte den openWB series2 satellit stromlos machen.") -METER_PROBLEM = "Der Zähler konnte nicht ausgelesen werden. Vermutlich ist der Zähler falsch konfiguriert oder defekt." -METER_BROKEN_VOLTAGES = "Die Spannungen des Zählers konnten nicht korrekt ausgelesen werden: {}V Der Zähler ist defekt." +RS485_ADAPTER_BROKEN = "Erneutes Auslesen des {}" +USB_ADAPTER_BROKEN = RS485_ADAPTER_BROKEN.format('USB-Adapters') +LAN_ADAPTER_BROKEN = RS485_ADAPTER_BROKEN.format('LAN-Konverters') +METER_PROBLEM = "Erneutes Auslesen des Zählers" +METER_BROKEN_VOLTAGES = "Erneutes Auslesen der Spannungen am Zähler" METER_NO_SERIAL_NUMBER = ("Die Seriennummer des Zählers für das Ladelog kann nicht ausgelesen werden. Wenn Du die " "Seriennummer für Abrechnungszwecke benötigst, wende Dich bitte an unseren Support. Die " "Funktionalität wird dadurch nicht beeinträchtigt!") -EVSE_BROKEN = "Auslesen der EVSE nicht möglich. Vermutlich ist die EVSE defekt oder hat eine unbekannte Modbus-ID. " +EVSE_BROKEN = "Erneutes Auslesen der EVSE" def check_meter_values(counter_state: CounterState, fault_state: Optional[FaultState] = None) -> None: @@ -110,18 +106,18 @@ def request_and_check_hardware(self: ClientHandlerProtocol, if meter_check_passed is False: if evse_check_passed is False: if isinstance(self.client, ModbusTcpClient_): - raise Exception(LAN_ADAPTER_BROKEN + OPEN_TICKET) + raise Exception(LAN_ADAPTER_BROKEN) else: - raise Exception(USB_ADAPTER_BROKEN + OPEN_TICKET) + raise Exception(USB_ADAPTER_BROKEN) else: - raise Exception(meter_error_msg + OPEN_TICKET) + raise Exception(meter_error_msg) elif evse_check_passed and meter_check_passed and meter_error_msg is not None: - fault_state.warning(meter_error_msg + OPEN_TICKET) + fault_state.warning(meter_error_msg) if evse_check_passed is False: if meter_error_msg is not None: - raise Exception(EVSE_BROKEN + " " + meter_error_msg + OPEN_TICKET) + raise Exception(EVSE_BROKEN + " " + meter_error_msg) else: - raise Exception(EVSE_BROKEN + OPEN_TICKET) + raise Exception(EVSE_BROKEN) return evse_state, counter_state def check_meter(self: ClientHandlerProtocol) -> Tuple[bool, Optional[str], CounterState]: From 9b7fb69787964c88b9af99dbe840cd06666ef0cf Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 11 May 2026 14:55:00 +0200 Subject: [PATCH 2/5] review --- packages/helpermodules/utils/error_handling.py | 4 ++-- packages/modules/common/hardware_check.py | 2 +- packages/modules/common/hardware_check_test.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/helpermodules/utils/error_handling.py b/packages/helpermodules/utils/error_handling.py index c444cec61d..7e8b8c69c5 100644 --- a/packages/helpermodules/utils/error_handling.py +++ b/packages/helpermodules/utils/error_handling.py @@ -33,13 +33,13 @@ def __exit__(self, exception_type, exception, exception_traceback) -> bool: # keine Werte mehr gepublished. return False else: - log.error(exception) + log.exception(exception) return True return True def error_counter_exceeded(self) -> bool: if self.error_timestamp is not None and timecheck.check_timestamp(self.error_timestamp, self.timeout) is False: - log.error(self.__exceeded_msg) + log.exception(self.__exceeded_msg) return True else: return False diff --git a/packages/modules/common/hardware_check.py b/packages/modules/common/hardware_check.py index ed990560fd..6f88ef506b 100644 --- a/packages/modules/common/hardware_check.py +++ b/packages/modules/common/hardware_check.py @@ -19,7 +19,7 @@ USB_ADAPTER_BROKEN = RS485_ADAPTER_BROKEN.format('USB-Adapters') LAN_ADAPTER_BROKEN = RS485_ADAPTER_BROKEN.format('LAN-Konverters') METER_PROBLEM = "Erneutes Auslesen des Zählers" -METER_BROKEN_VOLTAGES = "Erneutes Auslesen der Spannungen am Zähler" +METER_BROKEN_VOLTAGES = "Erneutes Auslesen der Spannungen am Zähler: {}V" METER_NO_SERIAL_NUMBER = ("Die Seriennummer des Zählers für das Ladelog kann nicht ausgelesen werden. Wenn Du die " "Seriennummer für Abrechnungszwecke benötigst, wende Dich bitte an unseren Support. Die " "Funktionalität wird dadurch nicht beeinträchtigt!") diff --git a/packages/modules/common/hardware_check_test.py b/packages/modules/common/hardware_check_test.py index 07336b5a1a..cb886152fc 100644 --- a/packages/modules/common/hardware_check_test.py +++ b/packages/modules/common/hardware_check_test.py @@ -8,7 +8,7 @@ from modules.common.component_state import CounterState, EvseState from modules.common.evse import Evse from modules.common.hardware_check import ( - EVSE_BROKEN, LAN_ADAPTER_BROKEN, METER_BROKEN_VOLTAGES, METER_PROBLEM, OPEN_TICKET, USB_ADAPTER_BROKEN, + EVSE_BROKEN, LAN_ADAPTER_BROKEN, METER_BROKEN_VOLTAGES, METER_PROBLEM, USB_ADAPTER_BROKEN, SeriesHardwareCheckMixin, _check_meter_values) from modules.common.modbus import NO_CONNECTION, ModbusSerialClient_, ModbusTcpClient_ from modules.conftest import SAMPLE_IP, SAMPLE_PORT @@ -21,7 +21,7 @@ [pytest.param(Exception("Modbus"), None, [230]*3, None, False, ModbusSerialClient_, EVSE_BROKEN, id="EVSE defekt"), pytest.param(Exception("Modbus"), None, [230, 0, 230], None, False, ModbusSerialClient_, - EVSE_BROKEN + " " + METER_BROKEN_VOLTAGES.format([230, 0, 230]) + OPEN_TICKET, + EVSE_BROKEN + " " + METER_BROKEN_VOLTAGES.format([230, 0, 230]), id="EVSE defekt und Zähler eine Phase defekt"), pytest.param(None, Exception("Modbus"), None, None, None, ModbusSerialClient_, METER_PROBLEM, id="Zähler falsch konfiguriert"), From 7e7ec48950e17059885ad2cb1206cb28b7be2f85 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 13 May 2026 12:11:27 +0200 Subject: [PATCH 3/5] improve text --- packages/helpermodules/exceptions/registry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/helpermodules/exceptions/registry.py b/packages/helpermodules/exceptions/registry.py index 6d892a48a0..f94dbb81b1 100644 --- a/packages/helpermodules/exceptions/registry.py +++ b/packages/helpermodules/exceptions/registry.py @@ -25,7 +25,7 @@ class ExceptionRegistry: def translate_exception(self, exception: Exception) -> Tuple[str, FaultStateLevel]: entry = self.find_registry_entry(exception) if entry is None: - return "{} {}".format(type(exception), exception.args), FaultStateLevel.ERROR + return str(exception.args), FaultStateLevel.ERROR if isinstance(entry.handler, str): return entry.handler, FaultStateLevel.ERROR result = entry.handler(exception) From da134591a8aa156cb8730d2296a19e9bc288cc86 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 13 May 2026 12:18:39 +0200 Subject: [PATCH 4/5] fix --- packages/helpermodules/exceptions/registry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/helpermodules/exceptions/registry.py b/packages/helpermodules/exceptions/registry.py index f94dbb81b1..b83987142c 100644 --- a/packages/helpermodules/exceptions/registry.py +++ b/packages/helpermodules/exceptions/registry.py @@ -25,7 +25,7 @@ class ExceptionRegistry: def translate_exception(self, exception: Exception) -> Tuple[str, FaultStateLevel]: entry = self.find_registry_entry(exception) if entry is None: - return str(exception.args), FaultStateLevel.ERROR + return str(exception.args[0]), FaultStateLevel.ERROR if isinstance(entry.handler, str): return entry.handler, FaultStateLevel.ERROR result = entry.handler(exception) From d46fb6b390cf505e69c586a8bf29f8b247096026 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 13 May 2026 12:31:25 +0200 Subject: [PATCH 5/5] fix pytest --- packages/helpermodules/exceptions/registry_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/helpermodules/exceptions/registry_test.py b/packages/helpermodules/exceptions/registry_test.py index ff4f4ce093..7d3d90d258 100644 --- a/packages/helpermodules/exceptions/registry_test.py +++ b/packages/helpermodules/exceptions/registry_test.py @@ -32,7 +32,7 @@ class ErrorF(ErrorD): @pytest.mark.parametrize("exception,expected_message", [ - [ErrorRoot, " ('ErrorRoot',)"], + [ErrorRoot, "ErrorRoot"], [ErrorB, "B"], [ErrorC, "A"], [ErrorD, "B"],