diff --git a/packages/helpermodules/setdata.py b/packages/helpermodules/setdata.py index a150ee283c..da6ec6ddc6 100644 --- a/packages/helpermodules/setdata.py +++ b/packages/helpermodules/setdata.py @@ -86,6 +86,8 @@ def on_message(self, client: mqtt.Client, userdata, msg: mqtt.MQTTMessage): self.process_general_topic(msg) elif ("openWB/set/io/" in msg.topic or "openWB/set/internal_io/" in msg.topic): self.process_io_topic(msg) + elif "openWB/set/mqtt/" in msg.topic: + self.process_mqtt_topic(msg) elif "openWB/set/optional/" in msg.topic: self.process_optional_topic(msg) elif "openWB/set/counter/" in msg.topic: @@ -867,6 +869,16 @@ def process_io_topic(self, msg: mqtt.MQTTMessage): except Exception: log.exception(f"Fehler im setdata-Modul: Topic {msg.topic}, Value: {msg.payload}") + def process_mqtt_topic(self, msg: mqtt.MQTTMessage): + if "openWB/set/mqtt/chargepoint/" in msg.topic: + self.process_chargepoint_get_topics(msg) + elif "openWB/set/mqtt/counter/" in msg.topic: + self.process_counter_topic(msg) + elif "openWB/set/mqtt/bat/" in msg.topic: + self.process_bat_topic(msg) + elif "openWB/set/mqtt/pv/" in msg.topic: + self.process_pv_topic(msg) + def process_optional_topic(self, msg: mqtt.MQTTMessage): """ Handler für die Optionalen-Topics diff --git a/packages/modules/chargepoints/mqtt/chargepoint_module.py b/packages/modules/chargepoints/mqtt/chargepoint_module.py index 8f865b29c3..9950dfe83e 100644 --- a/packages/modules/chargepoints/mqtt/chargepoint_module.py +++ b/packages/modules/chargepoints/mqtt/chargepoint_module.py @@ -21,6 +21,21 @@ def __init__(self, config: Mqtt) -> None: self.store = get_chargepoint_value_store(self.config.id) self.fault_state = FaultState(ComponentInfo(self.config.id, "Ladepunkt", "chargepoint")) + def on_connect(client, userdata, flags, rc): + client.subscribe(f"openWB/mqtt/chargepoint/{self.config.id}/#") + + def on_message(client, userdata, message): + received_topics.update({message.topic: decode_payload(message.payload)}) + + received_topics = {} + BrokerClient(f"subscribeMqttChargepointInit{self.config.id}", + on_connect, on_message).start_finite_loop() + for topic, value in received_topics.items(): + if "/set/phases_to_use" in topic: + break + else: + Pub().pub(f"openWB/mqtt/chargepoint/{self.config.id}/set/phases_to_use", 0) + def set_current(self, current: float) -> None: Pub().pub(f"openWB/mqtt/chargepoint/{self.config.id}/set/current", current) @@ -62,9 +77,9 @@ def on_message(client, userdata, message): ) self.store.set(chargepoint_state) else: - raise Exception(f"Keine MQTT Daten für Ladepunkt {self.config.name} empfangen oder es werden veraltete " - "Topics verwendet. Diese funktionieren mit Einschränkungen trotz dieser Fehlermeldung. " - "Bitte die Doku in den Einstellungen beachten.") + self.fault_state.warning(f"Keine MQTT-Daten für Ladepunkt {self.config.name} empfangen oder es werden " + "veraltete, abwärtskompatible Topics verwendet. Bitte die Doku in den " + "Einstellungen beachten.") def switch_phases(self, phases_to_use: int, duration: int) -> None: Pub().pub(f"openWB/mqtt/chargepoint/{self.config.id}/set/phases_to_use", phases_to_use) diff --git a/packages/modules/common/component_context.py b/packages/modules/common/component_context.py index 5e67b018fb..270ea05504 100644 --- a/packages/modules/common/component_context.py +++ b/packages/modules/common/component_context.py @@ -74,7 +74,8 @@ def __exit__(self, exception_type, exception, exception_traceback) -> bool: for component in self.__device_components: fault_state = component.fault_state if fault_state not in self.__ignored_components: - fault_state.from_exception(exception) + if exception: + fault_state.from_exception(exception) fault_state.store_error() delattr(MultiComponentUpdateContext.__thread_local, "active_context") if isinstance(exception, Exception) and self.error_handler is not None: diff --git a/packages/modules/common/fault_state.py b/packages/modules/common/fault_state.py index c91bdffe45..eb92afa6e3 100644 --- a/packages/modules/common/fault_state.py +++ b/packages/modules/common/fault_state.py @@ -82,10 +82,7 @@ def no_error(self, message: Optional[str] = None) -> None: self.fault_state = FaultStateLevel.NO_ERROR def from_exception(self, exception: Optional[Exception] = None) -> None: - if exception is None: - self.fault_str = NO_ERROR - self.fault_state = FaultStateLevel.NO_ERROR - elif isinstance(exception, FaultState): + if isinstance(exception, FaultState): self.fault_str = exception.fault_str self.fault_state = exception.fault_state else: diff --git a/packages/modules/devices/generic/mqtt/device.py b/packages/modules/devices/generic/mqtt/device.py index d6c5509bde..93ab4d5d42 100644 --- a/packages/modules/devices/generic/mqtt/device.py +++ b/packages/modules/devices/generic/mqtt/device.py @@ -40,10 +40,10 @@ def on_message(client, userdata, message): for component in components: component.update(received_topics) else: - raise Exception( - f"Keine MQTT-Daten für Gerät {device_config.id} empfangen oder es werden veraltete Topics" - " verwendet. Diese funktionieren mit Einschränkungen trotz dieser Fehlermeldung. Bitte die Doku in " - "den Einstellungen beachten.") + for component in components: + component.fault_state.warning( + f"Keine MQTT-Daten für Komponente {component.component_config.name} empfangen oder es werden " + "veraltete, abwärtskompatible Topics verwendet. Bitte die Doku in den Einstellungen beachten.") return ConfigurableDevice( device_config=device_config,