Skip to content

Commit a3f4945

Browse files
authored
Merge pull request #639 from plugwise/change_connect
Change the output of the connect() function
2 parents bebf8e2 + bd82299 commit a3f4945

File tree

8 files changed

+34
-20
lines changed

8 files changed

+34
-20
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## v1.4.4
4+
5+
- Change connect() function to output the gateway firmware-version.
6+
37
## v1.4.3
48

59
- Clean up timeout-related, pass _request-function as an argument.

plugwise/__init__.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
import aiohttp
3333
from defusedxml import ElementTree as etree
34+
from packaging.version import Version, parse
3435

3536

3637
class Smile(SmileComm):
@@ -75,7 +76,7 @@ def __init__(
7576
self._target_smile: str = NONE
7677
self.gateway_id: str = NONE
7778
self.loc_data: dict[str, ThermoLoc] = {}
78-
self.smile_fw_version: str | None = None
79+
self.smile_fw_version: Version | None = None
7980
self.smile_hostname: str = NONE
8081
self.smile_hw_version: str | None = None
8182
self.smile_legacy = False
@@ -84,10 +85,10 @@ def __init__(
8485
self.smile_model_id: str | None = None
8586
self.smile_name: str = NONE
8687
self.smile_type: str = NONE
87-
self.smile_version: str = NONE
88+
self.smile_version: Version | None = None
8889
self.smile_zigbee_mac_address: str | None = None
8990

90-
async def connect(self) -> bool:
91+
async def connect(self) -> Version | None:
9192
"""Connect to Plugwise device and determine its name, type and version."""
9293
result = await self._request(DOMAIN_OBJECTS)
9394
# Work-around for Stretch fw 2.7.18
@@ -173,7 +174,7 @@ async def connect(self) -> bool:
173174
# Update all endpoints on first connect
174175
await self._smile_api.full_update_device()
175176

176-
return True
177+
return self.smile_version
177178

178179
async def _smile_detect(self, result: etree, dsmrmain: etree) -> None:
179180
"""Helper-function for connect().
@@ -184,7 +185,7 @@ async def _smile_detect(self, result: etree, dsmrmain: etree) -> None:
184185
if (gateway := result.find("./gateway")) is not None:
185186
if (v_model := gateway.find("vendor_model")) is not None:
186187
model = v_model.text
187-
self.smile_fw_version = gateway.find("firmware_version").text
188+
self.smile_fw_version = parse(gateway.find("firmware_version").text)
188189
self.smile_hw_version = gateway.find("hardware_version").text
189190
self.smile_hostname = gateway.find("hostname").text
190191
self.smile_mac_address = gateway.find("mac_address").text
@@ -200,7 +201,7 @@ async def _smile_detect(self, result: etree, dsmrmain: etree) -> None:
200201
)
201202
raise UnsupportedDeviceError
202203

203-
version_major: str = self.smile_fw_version.split(".", 1)[0]
204+
version_major= str(self.smile_fw_version.major)
204205
self._target_smile = f"{model}_v{version_major}"
205206
LOGGER.debug("Plugwise identified as %s", self._target_smile)
206207
if self._target_smile not in SMILES:
@@ -267,7 +268,7 @@ async def _smile_detect_legacy(
267268
or network is not None
268269
):
269270
system = await self._request(SYSTEM)
270-
self.smile_fw_version = system.find("./gateway/firmware").text
271+
self.smile_fw_version = parse(system.find("./gateway/firmware").text)
271272
return_model = system.find("./gateway/product").text
272273
self.smile_hostname = system.find("./gateway/hostname").text
273274
# If wlan0 contains data it's active, so eth0 should be checked last
@@ -278,7 +279,7 @@ async def _smile_detect_legacy(
278279
# P1 legacy:
279280
elif dsmrmain is not None:
280281
status = await self._request(STATUS)
281-
self.smile_fw_version = status.find("./system/version").text
282+
self.smile_fw_version = parse(status.find("./system/version").text)
282283
return_model = status.find("./system/product").text
283284
self.smile_hostname = status.find("./network/hostname").text
284285
self.smile_mac_address = status.find("./network/mac_address").text

plugwise/helper.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
from dateutil.parser import parse
6363
from defusedxml import ElementTree as etree
6464
from munch import Munch
65+
from packaging.version import Version
6566

6667

6768
class SmileComm:
@@ -250,7 +251,7 @@ def __init__(self) -> None:
250251
self.gw_data: GatewayData = {}
251252
self.gw_devices: dict[str, DeviceData] = {}
252253
self.loc_data: dict[str, ThermoLoc]
253-
self.smile_fw_version: str | None
254+
self.smile_fw_version: Version | None
254255
self.smile_hw_version: str | None
255256
self.smile_mac_address: str | None
256257
self.smile_model: str
@@ -425,7 +426,7 @@ def _energy_device_info_finder(self, appl: Munch, appliance: etree) -> Munch:
425426
def _appl_gateway_info(self, appl: Munch, appliance: etree) -> Munch:
426427
"""Helper-function for _appliance_info_finder()."""
427428
self.gateway_id = appliance.attrib["id"]
428-
appl.firmware = self.smile_fw_version
429+
appl.firmware = str(self.smile_fw_version)
429430
appl.hardware = self.smile_hw_version
430431
appl.mac = self.smile_mac_address
431432
appl.model = self.smile_model

plugwise/legacy/helper.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
# This way of importing aiohttp is because of patch/mocking in testing (aiohttp timeouts)
4545
from defusedxml import ElementTree as etree
4646
from munch import Munch
47+
from packaging.version import Version
4748

4849

4950
def etree_to_dict(element: etree) -> dict[str, str]:
@@ -81,7 +82,7 @@ def __init__(self) -> None:
8182
self.gw_data: GatewayData = {}
8283
self.gw_devices: dict[str, DeviceData] = {}
8384
self.loc_data: dict[str, ThermoLoc]
84-
self.smile_fw_version: str | None
85+
self.smile_fw_version: Version | None
8586
self.smile_hw_version: str | None
8687
self.smile_mac_address: str | None
8788
self.smile_model: str
@@ -194,7 +195,7 @@ def _create_legacy_gateway(self) -> None:
194195
self.gw_devices[self.gateway_id] = {"dev_class": "gateway"}
195196
self._count += 1
196197
for key, value in {
197-
"firmware": self.smile_fw_version,
198+
"firmware": str(self.smile_fw_version),
198199
"location": self._home_location,
199200
"mac_address": self.smile_mac_address,
200201
"model": self.smile_model,

plugwise/legacy/smile.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import aiohttp
3131
from munch import Munch
32+
from packaging.version import Version
3233

3334

3435
class SmileLegacyAPI(SmileLegacyData):
@@ -48,7 +49,7 @@ def __init__(
4849
_stretch_v2: bool,
4950
_target_smile: str,
5051
loc_data: dict[str, ThermoLoc],
51-
smile_fw_version: str | None,
52+
smile_fw_version: Version | None,
5253
smile_hostname: str,
5354
smile_hw_version: str | None,
5455
smile_mac_address: str | None,

plugwise/smile.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636
# Dict as class
3737
from munch import Munch
38+
from packaging.version import Version
3839

3940

4041
class SmileAPI(SmileData):
@@ -57,7 +58,7 @@ def __init__(
5758
_schedule_old_states: dict[str, dict[str, str]],
5859
gateway_id: str,
5960
loc_data: dict[str, ThermoLoc],
60-
smile_fw_version: str | None,
61+
smile_fw_version: Version | None,
6162
smile_hostname: str | None,
6263
smile_hw_version: str | None,
6364
smile_mac_address: str | None,

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "plugwise"
7-
version = "1.4.3"
7+
version = "1.4.4"
88
license = {file = "LICENSE"}
99
description = "Plugwise Smile (Adam/Anna/P1) and Stretch module for Python 3."
1010
readme = "README.md"

tests/test_init.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
# Testing
1818
import aiohttp
1919
from freezegun import freeze_time
20+
from packaging import version
2021

2122
pw_constants = importlib.import_module("plugwise.constants")
2223
pw_exceptions = importlib.import_module("plugwise.exceptions")
@@ -344,15 +345,17 @@ async def connect(
344345
assert smile._timeout == 10
345346

346347
# Connect to the smile
348+
version = None
347349
try:
348-
connection_state = await smile.connect()
349-
assert connection_state
350+
version = await smile.connect()
351+
assert version is not None
350352
return server, smile, client
351353
except (
352354
pw_exceptions.ConnectionFailedError,
353355
pw_exceptions.InvalidXMLError,
354356
pw_exceptions.InvalidAuthentication,
355357
) as exception:
358+
assert version is None
356359
await self.disconnect(server, client)
357360
raise exception
358361

@@ -427,15 +430,17 @@ async def connect_legacy(
427430
assert smile._timeout == 30
428431

429432
# Connect to the smile
433+
version = None
430434
try:
431-
connection_state = await smile.connect()
432-
assert connection_state
435+
version = await smile.connect()
436+
assert version is not None
433437
return server, smile, client
434438
except (
435439
pw_exceptions.ConnectionFailedError,
436440
pw_exceptions.InvalidXMLError,
437441
pw_exceptions.InvalidAuthentication,
438442
) as exception:
443+
assert version is None
439444
await self.disconnect(server, client)
440445
raise exception
441446

@@ -1004,7 +1009,7 @@ def validate_test_basics(
10041009
if smile_version:
10051010
log_msg = f" # Assert version matching '{smile_version}"
10061011
parent_logger.info(log_msg)
1007-
assert smile.smile_version == smile_version
1012+
assert smile.smile_version == version.parse(smile_version)
10081013
log_msg = f" # Assert legacy {smile_legacy}"
10091014
parent_logger.info(log_msg)
10101015
if smile_legacy:

0 commit comments

Comments
 (0)