From 86c2956d69f0c1b857ab221437b5bec6663d06ee Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Fri, 29 Mar 2024 14:39:08 +0100 Subject: [PATCH] Handle mqtt connection events --- pyhon/appliance.py | 12 ++++++++++++ pyhon/appliances/dw.py | 2 +- pyhon/appliances/ov.py | 2 +- pyhon/appliances/td.py | 2 +- pyhon/appliances/wd.py | 2 +- pyhon/connection/mqtt.py | 8 +++++++- pyhon/hon.py | 1 - 7 files changed, 23 insertions(+), 6 deletions(-) diff --git a/pyhon/appliance.py b/pyhon/appliance.py index 3754aca..63f7781 100644 --- a/pyhon/appliance.py +++ b/pyhon/appliance.py @@ -43,6 +43,10 @@ class HonAppliance: self._additional_data: Dict[str, Any] = {} self._last_update: Optional[datetime] = None self._default_setting = HonParameter("", {}, "") + self._connection = ( + not self._attributes.get("lastConnEvent", {}).get("category", "") + == "DISCONNECTED" + ) try: self._extra: Optional[ApplianceBase] = importlib.import_module( @@ -90,6 +94,14 @@ class HonAppliance: return f"{attribute}{zone}{self._zone}" return attribute + @property + def connection(self) -> bool: + return self._connection + + @connection.setter + def connection(self, connection: bool) -> None: + self._connection = connection + @property def appliance_model_id(self) -> str: return str(self._info.get("applianceModelId", "")) diff --git a/pyhon/appliances/dw.py b/pyhon/appliances/dw.py index 5d0465d..7cfe4bb 100644 --- a/pyhon/appliances/dw.py +++ b/pyhon/appliances/dw.py @@ -7,7 +7,7 @@ from pyhon.appliances.base import ApplianceBase class Appliance(ApplianceBase): def attributes(self, data: Dict[str, Any]) -> Dict[str, Any]: data = super().attributes(data) - if data.get("lastConnEvent", {}).get("category", "") == "DISCONNECTED": + if not self.parent.connection: data["parameters"]["machMode"].value = "0" data["active"] = bool(data.get("activity")) return data diff --git a/pyhon/appliances/ov.py b/pyhon/appliances/ov.py index 21831a3..498e0dc 100644 --- a/pyhon/appliances/ov.py +++ b/pyhon/appliances/ov.py @@ -6,7 +6,7 @@ from pyhon.appliances.base import ApplianceBase class Appliance(ApplianceBase): def attributes(self, data: Dict[str, Any]) -> Dict[str, Any]: data = super().attributes(data) - if data.get("lastConnEvent", {}).get("category", "") == "DISCONNECTED": + if not self.parent.connection: data["parameters"]["temp"].value = 0 data["parameters"]["onOffStatus"].value = 0 data["parameters"]["remoteCtrValid"].value = 0 diff --git a/pyhon/appliances/td.py b/pyhon/appliances/td.py index 1f33044..0675997 100644 --- a/pyhon/appliances/td.py +++ b/pyhon/appliances/td.py @@ -8,7 +8,7 @@ from pyhon.parameter.fixed import HonParameterFixed class Appliance(ApplianceBase): def attributes(self, data: Dict[str, Any]) -> Dict[str, Any]: data = super().attributes(data) - if data.get("lastConnEvent", {}).get("category", "") == "DISCONNECTED": + if not self.parent.connection: data["parameters"]["machMode"].value = "0" data["active"] = bool(data.get("activity")) data["pause"] = data["parameters"]["machMode"] == "3" diff --git a/pyhon/appliances/wd.py b/pyhon/appliances/wd.py index 6ae0388..70b8b89 100644 --- a/pyhon/appliances/wd.py +++ b/pyhon/appliances/wd.py @@ -7,7 +7,7 @@ from pyhon.appliances.base import ApplianceBase class Appliance(ApplianceBase): def attributes(self, data: Dict[str, Any]) -> Dict[str, Any]: data = super().attributes(data) - if data.get("lastConnEvent", {}).get("category", "") == "DISCONNECTED": + if not self.parent.connection: data["parameters"]["machMode"].value = "0" data["active"] = bool(data.get("activity")) data["pause"] = data["parameters"]["machMode"] == "3" diff --git a/pyhon/connection/mqtt.py b/pyhon/connection/mqtt.py index f4aa256..3210c6e 100644 --- a/pyhon/connection/mqtt.py +++ b/pyhon/connection/mqtt.py @@ -90,8 +90,14 @@ class MQTTClient: appliance.sync_params_to_command("settings") self._hon.notify() elif topic and "disconnected" in topic: - _LOGGER.info("Disconnected %s", appliance.nick_name) + _LOGGER.info( + "Disconnected %s: %s", + appliance.nick_name, + payload.get("disconnectReason"), + ) + appliance.connection = False elif topic and "connected" in topic: + appliance.connection = True _LOGGER.info("Connected %s", appliance.nick_name) elif topic and "discovery" in topic: _LOGGER.info("Discovered %s", appliance.nick_name) diff --git a/pyhon/hon.py b/pyhon/hon.py index 64e7e8a..2f6f88d 100644 --- a/pyhon/hon.py +++ b/pyhon/hon.py @@ -1,4 +1,3 @@ -import asyncio import logging from pathlib import Path from types import TracebackType