From 3ec47c3cc6978e5fb97d3e428318327929c84b78 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Mon, 21 Oct 2024 20:11:25 +0200 Subject: [PATCH 01/13] Let connect() return smile_version --- plugwise/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugwise/__init__.py b/plugwise/__init__.py index 6e08c09ae..5ae30b340 100644 --- a/plugwise/__init__.py +++ b/plugwise/__init__.py @@ -87,7 +87,7 @@ def __init__( self.smile_version: str = NONE self.smile_zigbee_mac_address: str | None = None - async def connect(self) -> bool: + async def connect(self) -> str: """Connect to Plugwise device and determine its name, type and version.""" result = await self._request(DOMAIN_OBJECTS) # Work-around for Stretch fw 2.7.18 @@ -173,7 +173,7 @@ async def connect(self) -> bool: # Update all endpoints on first connect await self._smile_api.full_update_device() - return True + return self.smile_version async def _smile_detect(self, result: etree, dsmrmain: etree) -> None: """Helper-function for connect(). From d7d69f8375fb350070d023252437e245459d945f Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Mon, 21 Oct 2024 20:13:59 +0200 Subject: [PATCH 02/13] Update related test-code --- tests/test_init.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_init.py b/tests/test_init.py index f07de3ab1..075a84949 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -345,8 +345,8 @@ async def connect( # Connect to the smile try: - connection_state = await smile.connect() - assert connection_state + version = await smile.connect() + assert version != pw_constants.NONE return server, smile, client except ( pw_exceptions.ConnectionFailedError, @@ -428,8 +428,8 @@ async def connect_legacy( # Connect to the smile try: - connection_state = await smile.connect() - assert connection_state + version = await smile.connect() + assert version != pw_constants.NONE return server, smile, client except ( pw_exceptions.ConnectionFailedError, From a59c6af6ba844c59192df1e591895f1e20d26c33 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Mon, 21 Oct 2024 20:17:16 +0200 Subject: [PATCH 03/13] Type as str | None --- plugwise/__init__.py | 4 ++-- tests/test_init.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugwise/__init__.py b/plugwise/__init__.py index 5ae30b340..d55b2211d 100644 --- a/plugwise/__init__.py +++ b/plugwise/__init__.py @@ -84,10 +84,10 @@ def __init__( self.smile_model_id: str | None = None self.smile_name: str = NONE self.smile_type: str = NONE - self.smile_version: str = NONE + self.smile_version: str | None = None self.smile_zigbee_mac_address: str | None = None - async def connect(self) -> str: + async def connect(self) -> str | None: """Connect to Plugwise device and determine its name, type and version.""" result = await self._request(DOMAIN_OBJECTS) # Work-around for Stretch fw 2.7.18 diff --git a/tests/test_init.py b/tests/test_init.py index 075a84949..64bc91004 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -346,7 +346,7 @@ async def connect( # Connect to the smile try: version = await smile.connect() - assert version != pw_constants.NONE + assert version is not None return server, smile, client except ( pw_exceptions.ConnectionFailedError, @@ -429,7 +429,7 @@ async def connect_legacy( # Connect to the smile try: version = await smile.connect() - assert version != pw_constants.NONE + assert version is not None return server, smile, client except ( pw_exceptions.ConnectionFailedError, From 3d140e8023085cae164336b8aba0e18c939156a1 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Mon, 21 Oct 2024 20:20:23 +0200 Subject: [PATCH 04/13] Update CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4f9d8736..44f731e5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v1.4.4 + +- Change connect() output to gateway firmware version. + ## v1.4.3 - Clean up timeout-related, pass _request-function as an argument. From 75a092c1c4109238a64c3d8929937e33c73aa2d8 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Mon, 21 Oct 2024 20:20:58 +0200 Subject: [PATCH 05/13] Bump to v1.4.4a0 test-version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0ccc17d2d..04000e562 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "plugwise" -version = "1.4.3" +version = "1.4.4a0" license = {file = "LICENSE"} description = "Plugwise Smile (Adam/Anna/P1) and Stretch module for Python 3." readme = "README.md" From 70d3914403cdef021c27910b97cf94353c813fd0 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 22 Oct 2024 07:59:07 +0200 Subject: [PATCH 06/13] Also test negative --- tests/test_init.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_init.py b/tests/test_init.py index 64bc91004..9051fa3c5 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -344,6 +344,7 @@ async def connect( assert smile._timeout == 10 # Connect to the smile + version = None try: version = await smile.connect() assert version is not None @@ -353,6 +354,7 @@ async def connect( pw_exceptions.InvalidXMLError, pw_exceptions.InvalidAuthentication, ) as exception: + assert version is None await self.disconnect(server, client) raise exception @@ -427,6 +429,7 @@ async def connect_legacy( assert smile._timeout == 30 # Connect to the smile + version = None try: version = await smile.connect() assert version is not None @@ -436,6 +439,7 @@ async def connect_legacy( pw_exceptions.InvalidXMLError, pw_exceptions.InvalidAuthentication, ) as exception: + assert version is None await self.disconnect(server, client) raise exception From 2ee9288bacdc36516f45cbbe317fddacdbc9cb70 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 22 Oct 2024 17:38:52 +0200 Subject: [PATCH 07/13] Import from packaging and implement --- plugwise/__init__.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/plugwise/__init__.py b/plugwise/__init__.py index d55b2211d..1e4b26fb3 100644 --- a/plugwise/__init__.py +++ b/plugwise/__init__.py @@ -31,6 +31,7 @@ import aiohttp from defusedxml import ElementTree as etree +from packaging.version import Version, parse class Smile(SmileComm): @@ -75,7 +76,7 @@ def __init__( self._target_smile: str = NONE self.gateway_id: str = NONE self.loc_data: dict[str, ThermoLoc] = {} - self.smile_fw_version: str | None = None + self.smile_fw_version: Version | None self.smile_hostname: str = NONE self.smile_hw_version: str | None = None self.smile_legacy = False @@ -84,7 +85,7 @@ def __init__( self.smile_model_id: str | None = None self.smile_name: str = NONE self.smile_type: str = NONE - self.smile_version: str | None = None + self.smile_version: Version | None = None self.smile_zigbee_mac_address: str | None = None async def connect(self) -> str | None: @@ -184,7 +185,7 @@ async def _smile_detect(self, result: etree, dsmrmain: etree) -> None: if (gateway := result.find("./gateway")) is not None: if (v_model := gateway.find("vendor_model")) is not None: model = v_model.text - self.smile_fw_version = gateway.find("firmware_version").text + self.smile_fw_version = parse(gateway.find("firmware_version").text) self.smile_hw_version = gateway.find("hardware_version").text self.smile_hostname = gateway.find("hostname").text self.smile_mac_address = gateway.find("mac_address").text @@ -200,7 +201,7 @@ async def _smile_detect(self, result: etree, dsmrmain: etree) -> None: ) raise UnsupportedDeviceError - version_major: str = self.smile_fw_version.split(".", 1)[0] + version_major= str(self.smile_fw_version.major) self._target_smile = f"{model}_v{version_major}" LOGGER.debug("Plugwise identified as %s", self._target_smile) if self._target_smile not in SMILES: @@ -267,7 +268,7 @@ async def _smile_detect_legacy( or network is not None ): system = await self._request(SYSTEM) - self.smile_fw_version = system.find("./gateway/firmware").text + self.smile_fw_version = parse(system.find("./gateway/firmware").text) return_model = system.find("./gateway/product").text self.smile_hostname = system.find("./gateway/hostname").text # If wlan0 contains data it's active, so eth0 should be checked last @@ -278,7 +279,7 @@ async def _smile_detect_legacy( # P1 legacy: elif dsmrmain is not None: status = await self._request(STATUS) - self.smile_fw_version = status.find("./system/version").text + self.smile_fw_version = parse(status.find("./system/version").text) return_model = status.find("./system/product").text self.smile_hostname = status.find("./network/hostname").text self.smile_mac_address = status.find("./network/mac_address").text From 31136ff90b55c4558915e486b57eeee372f1f802 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 22 Oct 2024 17:41:19 +0200 Subject: [PATCH 08/13] Adapt testing --- tests/test_init.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_init.py b/tests/test_init.py index 9051fa3c5..b0804d7d9 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -2,6 +2,7 @@ """Test Plugwise Home Assistant module and generate test JSON fixtures.""" import importlib import json +from packaging import version # Fixture writing import logging @@ -1008,7 +1009,7 @@ def validate_test_basics( if smile_version: log_msg = f" # Assert version matching '{smile_version}" parent_logger.info(log_msg) - assert smile.smile_version == smile_version + assert smile.smile_version == version.parse(smile_version) log_msg = f" # Assert legacy {smile_legacy}" parent_logger.info(log_msg) if smile_legacy: From bbd436e492aa41e29ab8156acf3a1ee728128ddd Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 22 Oct 2024 17:47:25 +0200 Subject: [PATCH 09/13] Translate back to str --- plugwise/helper.py | 5 +++-- plugwise/legacy/helper.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/plugwise/helper.py b/plugwise/helper.py index 2ddb61d46..da8cddbec 100644 --- a/plugwise/helper.py +++ b/plugwise/helper.py @@ -62,6 +62,7 @@ from dateutil.parser import parse from defusedxml import ElementTree as etree from munch import Munch +from packaging.version import Version class SmileComm: @@ -250,7 +251,7 @@ def __init__(self) -> None: self.gw_data: GatewayData = {} self.gw_devices: dict[str, DeviceData] = {} self.loc_data: dict[str, ThermoLoc] - self.smile_fw_version: str | None + self.smile_fw_version: Version | None self.smile_hw_version: str | None self.smile_mac_address: str | None self.smile_model: str @@ -425,7 +426,7 @@ def _energy_device_info_finder(self, appl: Munch, appliance: etree) -> Munch: def _appl_gateway_info(self, appl: Munch, appliance: etree) -> Munch: """Helper-function for _appliance_info_finder().""" self.gateway_id = appliance.attrib["id"] - appl.firmware = self.smile_fw_version + appl.firmware = str(self.smile_fw_version) appl.hardware = self.smile_hw_version appl.mac = self.smile_mac_address appl.model = self.smile_model diff --git a/plugwise/legacy/helper.py b/plugwise/legacy/helper.py index efce1db13..a82b7005b 100644 --- a/plugwise/legacy/helper.py +++ b/plugwise/legacy/helper.py @@ -44,6 +44,7 @@ # This way of importing aiohttp is because of patch/mocking in testing (aiohttp timeouts) from defusedxml import ElementTree as etree from munch import Munch +from packaging.version import Version def etree_to_dict(element: etree) -> dict[str, str]: @@ -81,7 +82,7 @@ def __init__(self) -> None: self.gw_data: GatewayData = {} self.gw_devices: dict[str, DeviceData] = {} self.loc_data: dict[str, ThermoLoc] - self.smile_fw_version: str | None + self.smile_fw_version: Version | None self.smile_hw_version: str | None self.smile_mac_address: str | None self.smile_model: str @@ -194,7 +195,7 @@ def _create_legacy_gateway(self) -> None: self.gw_devices[self.gateway_id] = {"dev_class": "gateway"} self._count += 1 for key, value in { - "firmware": self.smile_fw_version, + "firmware": str(self.smile_fw_version), "location": self._home_location, "mac_address": self.smile_mac_address, "model": self.smile_model, From 3ff8f7dbb4af435f8584b46d6ff5a7fd106f32e3 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 22 Oct 2024 17:48:27 +0200 Subject: [PATCH 10/13] Fix --- plugwise/__init__.py | 4 ++-- plugwise/legacy/smile.py | 3 ++- plugwise/smile.py | 3 ++- tests/test_init.py | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/plugwise/__init__.py b/plugwise/__init__.py index 1e4b26fb3..977220987 100644 --- a/plugwise/__init__.py +++ b/plugwise/__init__.py @@ -76,7 +76,7 @@ def __init__( self._target_smile: str = NONE self.gateway_id: str = NONE self.loc_data: dict[str, ThermoLoc] = {} - self.smile_fw_version: Version | None + self.smile_fw_version: Version | None = None self.smile_hostname: str = NONE self.smile_hw_version: str | None = None self.smile_legacy = False @@ -88,7 +88,7 @@ def __init__( self.smile_version: Version | None = None self.smile_zigbee_mac_address: str | None = None - async def connect(self) -> str | None: + async def connect(self) -> Version | None: """Connect to Plugwise device and determine its name, type and version.""" result = await self._request(DOMAIN_OBJECTS) # Work-around for Stretch fw 2.7.18 diff --git a/plugwise/legacy/smile.py b/plugwise/legacy/smile.py index 3f8a14f0f..a1813105a 100644 --- a/plugwise/legacy/smile.py +++ b/plugwise/legacy/smile.py @@ -29,6 +29,7 @@ import aiohttp from munch import Munch +from packaging.version import Version class SmileLegacyAPI(SmileLegacyData): @@ -48,7 +49,7 @@ def __init__( _stretch_v2: bool, _target_smile: str, loc_data: dict[str, ThermoLoc], - smile_fw_version: str | None, + smile_fw_version: Version | None, smile_hostname: str, smile_hw_version: str | None, smile_mac_address: str | None, diff --git a/plugwise/smile.py b/plugwise/smile.py index d7b42f760..9a725a470 100644 --- a/plugwise/smile.py +++ b/plugwise/smile.py @@ -35,6 +35,7 @@ # Dict as class from munch import Munch +from packaging.version import Version class SmileAPI(SmileData): @@ -57,7 +58,7 @@ def __init__( _schedule_old_states: dict[str, dict[str, str]], gateway_id: str, loc_data: dict[str, ThermoLoc], - smile_fw_version: str | None, + smile_fw_version: Version | None, smile_hostname: str | None, smile_hw_version: str | None, smile_mac_address: str | None, diff --git a/tests/test_init.py b/tests/test_init.py index b0804d7d9..823e04a64 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -2,7 +2,6 @@ """Test Plugwise Home Assistant module and generate test JSON fixtures.""" import importlib import json -from packaging import version # Fixture writing import logging @@ -18,6 +17,7 @@ # Testing import aiohttp from freezegun import freeze_time +from packaging import version pw_constants = importlib.import_module("plugwise.constants") pw_exceptions = importlib.import_module("plugwise.exceptions") From 2e1ca54cc92486e72c949b9a571434b068a09ed5 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 22 Oct 2024 18:35:55 +0200 Subject: [PATCH 11/13] Bump to a1 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 04000e562..3538f52d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "plugwise" -version = "1.4.4a0" +version = "1.4.4a1" license = {file = "LICENSE"} description = "Plugwise Smile (Adam/Anna/P1) and Stretch module for Python 3." readme = "README.md" From cde5bfb225ea508544fbab3af86bac1042c00e4c Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Thu, 24 Oct 2024 11:25:42 +0200 Subject: [PATCH 12/13] Bump to v1.4.4 release-version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3538f52d8..742a72cf8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "plugwise" -version = "1.4.4a1" +version = "1.4.4" license = {file = "LICENSE"} description = "Plugwise Smile (Adam/Anna/P1) and Stretch module for Python 3." readme = "README.md" From bd8229984bee9c0742375007e50f2aae1e8a905d Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Thu, 24 Oct 2024 11:36:19 +0200 Subject: [PATCH 13/13] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44f731e5c..3a13d7cfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## v1.4.4 -- Change connect() output to gateway firmware version. +- Change connect() function to output the gateway firmware-version. ## v1.4.3