From 763d0b611c6c8c5630e65449913286cf75780d5a Mon Sep 17 00:00:00 2001 From: seaspotter Date: Fri, 18 Sep 2026 17:13:46 +0200 Subject: [PATCH] fix: external_openwb occasionally missed retained MQTT topics under load start_finite_loop()'s fixed 1s collection window left little margin for connection/handshake overhead when the paired internal chargepoint was busy (eg mid-charge), occasionally causing get_values() to miss a retained topic despite retain=True. Made the timeout configurable (default unchanged for the other 17 call sites) and doubled it for external_openwb specifically, which has to reliably collect ~20 topics over a real network hop rather than one or two local values. --- packages/helpermodules/broker.py | 4 ++-- .../chargepoints/external_openwb/chargepoint_module.py | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/helpermodules/broker.py b/packages/helpermodules/broker.py index c9b6940c6f..ecd5d2d30c 100644 --- a/packages/helpermodules/broker.py +++ b/packages/helpermodules/broker.py @@ -35,9 +35,9 @@ def __init__(self, def start_infinite_loop(self) -> None: self.client.loop_forever() - def start_finite_loop(self) -> None: + def start_finite_loop(self, timeout: float = 1) -> None: self.client.loop_start() - time.sleep(1) + time.sleep(timeout) self.client.loop_stop() def disconnect(self) -> None: diff --git a/packages/modules/chargepoints/external_openwb/chargepoint_module.py b/packages/modules/chargepoints/external_openwb/chargepoint_module.py index 6c4ab63a42..db60fb8d5b 100644 --- a/packages/modules/chargepoints/external_openwb/chargepoint_module.py +++ b/packages/modules/chargepoints/external_openwb/chargepoint_module.py @@ -66,12 +66,15 @@ def on_message(client, userdata, message): received_topics.update({message.topic: decode_payload(message.payload)}) received_topics = {} + # Höheres Timeout als der Default: muss zuverlässig alle ~20 retained Topics über eine + # echte Netzwerkverbindung zu einer ggf. gerade stark ausgelasteten Gegenstelle einsammeln + # (zB während einer laufenden Ladung), nicht nur ein oder zwei lokale Werte. BrokerClient(f"subscribeSeriesChargepoint{self.config.id}", on_connect, on_message, host=self.config.configuration.ip_address, port=1886 if self.config.configuration.ip_address == "localhost" else 1883 - ).start_finite_loop() + ).start_finite_loop(timeout=2) if received_topics: log.debug(f"Empfange MQTT Daten für Ladepunkt {self.config.id}: {received_topics}")