Skip to content

Commit 620cb6d

Browse files
authored
Merge pull request #304 from plugwise/legacy_anna_system
Add system-xml data for legacy Anna and adapt
2 parents 621853b + f7da103 commit 620cb6d

File tree

7 files changed

+98
-44
lines changed

7 files changed

+98
-44
lines changed

CHANGELOG.md

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
# Changelog
22

3-
## Ongoing
3+
## v0.31.1: Legacy Anna - read and process system-xml data
44

5-
- CI/CD Improvements
5+
- Add support for reading the system-xml data from the legacy Smile T
6+
- Repo-generic: CI/CD Improvements
67

7-
## v0.31 refactoring (alpha only, effectively not to be released): Logic separation between USB and non-USB
8+
## v0.31.0: Split off the USB-related code: the Plugwise Stick related code has been moved into [#plugwise_usb](https://github.com/plugwise/python-plugwise-usb)
89

9-
- Smile component (suggested `python-plugwise-usb` for USB (or stick-standalone) route)
10-
11-
## v0.30 refactoring (alpha only, effectively unreleased)
12-
13-
- More formal Split between Networked and USB code
10+
--- Split between Smile/Stretch and USB-Stick related code ---
1411

1512
## v0.27.10: Anna + Elga: final fix for [#320](https://github.com/plugwise/plugwise-beta/issues/320)
1613

plugwise/__init__.py

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,9 @@ async def connect(self) -> bool:
380380

381381
return True
382382

383-
async def _smile_detect_legacy(self, result: etree, dsmrmain: etree) -> str:
383+
async def _smile_detect_legacy(
384+
self, result: etree, dsmrmain: etree, model: str
385+
) -> str:
384386
"""Helper-function for _smile_detect()."""
385387
# Stretch: find the MAC of the zigbee master_controller (= Stick)
386388
if network := result.find("./module/protocols/master_controller"):
@@ -392,33 +394,30 @@ async def _smile_detect_legacy(self, result: etree, dsmrmain: etree) -> str:
392394
network = zb_network.find("./master_controller")
393395
self.smile_zigbee_mac_address = network.find("mac_address").text
394396

395-
# Assume legacy
396397
self._smile_legacy = True
397-
# Try if it is a legacy Anna, assuming appliance thermostat,
398-
# fake insert version assuming Anna, couldn't find another way to identify as legacy Anna
399-
self.smile_fw_version = "1.8.0"
400-
model = "smile_thermo"
401-
if result.find('./appliance[type="thermostat"]') is None:
402-
# It's a P1 legacy:
398+
# Legacy Anna or Stretch:
399+
if (
400+
result.find('./appliance[type="thermostat"]') is not None
401+
or network is not None
402+
):
403+
self._system = await self._request(SYSTEM)
404+
self.smile_fw_version = self._system.find("./gateway/firmware").text
405+
model = self._system.find("./gateway/product").text
406+
self.smile_hostname = self._system.find("./gateway/hostname").text
407+
# If wlan0 contains data it's active, so eth0 should be checked last
408+
for network in ("wlan0", "eth0"):
409+
locator = f"./{network}/mac"
410+
if (net_locator := self._system.find(locator)) is not None:
411+
self.smile_mac_address = net_locator.text
412+
else:
413+
# P1 legacy:
403414
if dsmrmain is not None:
404415
self._status = await self._request(STATUS)
405416
self.smile_fw_version = self._status.find("./system/version").text
406417
model = self._status.find("./system/product").text
407418
self.smile_hostname = self._status.find("./network/hostname").text
408419
self.smile_mac_address = self._status.find("./network/mac_address").text
409420

410-
# Or a legacy Stretch:
411-
elif network is not None:
412-
self._system = await self._request(SYSTEM)
413-
self.smile_fw_version = self._system.find("./gateway/firmware").text
414-
model = self._system.find("./gateway/product").text
415-
self.smile_hostname = self._system.find("./gateway/hostname").text
416-
# If wlan0 contains data it's active, so eth0 should be checked last
417-
for network in ("wlan0", "eth0"):
418-
locator = f"./{network}/mac"
419-
if (net_locator := self._system.find(locator)) is not None:
420-
self.smile_mac_address = net_locator.text
421-
422421
else: # pragma: no cover
423422
# No cornercase, just end of the line
424423
LOGGER.error(
@@ -434,17 +433,18 @@ async def _smile_detect(self, result: etree, dsmrmain: etree) -> None:
434433
435434
Detect which type of Smile is connected.
436435
"""
437-
model: str | None = None
436+
model: str = "Unknown"
438437
if (gateway := result.find("./gateway")) is not None:
439-
model = gateway.find("vendor_model").text
438+
if (v_model := gateway.find("vendor_model")) is not None:
439+
model = v_model.text
440440
self.smile_fw_version = gateway.find("firmware_version").text
441441
self.smile_hw_version = gateway.find("hardware_version").text
442442
self.smile_hostname = gateway.find("hostname").text
443443
self.smile_mac_address = gateway.find("mac_address").text
444444
else:
445-
model = await self._smile_detect_legacy(result, dsmrmain)
445+
model = await self._smile_detect_legacy(result, dsmrmain, model)
446446

447-
if model is None or self.smile_fw_version is None: # pragma: no cover
447+
if model == "Unknown" or self.smile_fw_version is None: # pragma: no cover
448448
# Corner case check
449449
LOGGER.error(
450450
"Unable to find model or version information, please create \

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 = "0.31.0"
7+
version = "0.31.1"
88
license = {file = "LICENSE"}
99
description = "Plugwise Smile (Adam/Anna/P1) and Stretch module for Python 3."
1010
readme = "README.md"

tests/test_smile.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -655,8 +655,9 @@ async def test_connect_legacy_anna(self):
655655
testdata = {
656656
"0000aaaa0000aaaa0000aaaa0000aa00": {
657657
"dev_class": "gateway",
658-
"firmware": "1.8.0",
658+
"firmware": "1.8.22",
659659
"location": "0000aaaa0000aaaa0000aaaa0000aa00",
660+
"mac_address": "01:23:45:67:89:AB",
660661
"model": "Gateway",
661662
"name": "Smile Anna",
662663
"vendor": "Plugwise",
@@ -709,19 +710,19 @@ async def test_connect_legacy_anna(self):
709710

710711
self.smile_setup = "legacy_anna"
711712
server, smile, client = await self.connect_wrapper()
712-
assert smile.smile_hostname is None
713+
assert smile.smile_hostname == "smile000000"
713714

714715
_LOGGER.info("Basics:")
715716
_LOGGER.info(" # Assert type = thermostat")
716717
assert smile.smile_type == "thermostat"
717718
_LOGGER.info(" # Assert version")
718-
assert smile.smile_version[0] == "1.8.0"
719+
assert smile.smile_version[0] == "1.8.22"
719720
_LOGGER.info(" # Assert legacy")
720721
assert smile._smile_legacy
721722

722723
await self.device_test(smile, testdata)
723724
assert smile.gateway_id == "0000aaaa0000aaaa0000aaaa0000aa00"
724-
assert self.device_items == 44
725+
assert self.device_items == 45
725726
assert not self.notifications
726727

727728
result = await self.tinker_thermostat(
@@ -755,8 +756,9 @@ async def test_connect_legacy_anna_2(self):
755756
testdata = {
756757
"be81e3f8275b4129852c4d8d550ae2eb": {
757758
"dev_class": "gateway",
758-
"firmware": "1.8.0",
759+
"firmware": "1.8.22",
759760
"location": "be81e3f8275b4129852c4d8d550ae2eb",
761+
"mac_address": "01:23:45:67:89:AB",
760762
"model": "Gateway",
761763
"name": "Smile Anna",
762764
"vendor": "Plugwise",
@@ -809,20 +811,20 @@ async def test_connect_legacy_anna_2(self):
809811

810812
self.smile_setup = "legacy_anna_2"
811813
server, smile, client = await self.connect_wrapper()
812-
assert smile.smile_hostname is None
814+
assert smile.smile_hostname == "smile000000"
813815

814816
_LOGGER.info("Basics:")
815817
_LOGGER.info(" # Assert type = thermostat")
816818
assert smile.smile_type == "thermostat"
817819
_LOGGER.info(" # Assert version")
818-
assert smile.smile_version[0] == "1.8.0"
820+
assert smile.smile_version[0] == "1.8.22"
819821
_LOGGER.info(" # Assert legacy")
820822
assert smile._smile_legacy
821823

822824
await self.device_test(smile, testdata)
823825

824826
assert smile.gateway_id == "be81e3f8275b4129852c4d8d550ae2eb"
825-
assert self.device_items == 44
827+
assert self.device_items == 45
826828
assert not self.notifications
827829

828830
result = await self.tinker_thermostat(

userdata/legacy_anna/system.xml

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<system>
3+
<gateway>
4+
<product>smile_thermo</product>
5+
<hostname>smile000000</hostname>
6+
<firmware>1.8.22</firmware>
7+
<upgrade/>
8+
</gateway>
9+
<wlan0>
10+
<mac>01:23:45:67:89:AB</mac>
11+
<ip>127.0.0.1</ip>
12+
<bcast>127.0.0.1</bcast>
13+
<mask>127.0.0.1</mask>
14+
<encryption><![CDATA[psk2]]></encryption>
15+
<proto>static</proto>
16+
<gateway>127.0.0.1</gateway>
17+
<dns>127.0.0.1</dns>
18+
<ieee>802.11bgn</ieee>
19+
<ssid><![CDATA[accespoint name]]></ssid>
20+
<mode>Client</mode>
21+
<frequency unit="GHz">2.437</frequency>
22+
<access_point_mac>01:23:45:67:89:AB</access_point_mac>
23+
<link_quality>47/70</link_quality>
24+
<signal_strength unit="dBm">-63</signal_strength>
25+
</wlan0>
26+
<eth0/>
27+
<time>2022-10-17T14:50:00.511+02:00</time>
28+
<timezone><![CDATA[Europe/Amsterdam]]></timezone>
29+
<remote_control origin='any'>not initialized</remote_control></system>
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<system>
3+
<gateway>
4+
<product>smile_thermo</product>
5+
<hostname>smile000000</hostname>
6+
<firmware>1.8.22</firmware>
7+
<upgrade/>
8+
</gateway>
9+
<wlan0>
10+
<mac>01:23:45:67:89:AB</mac>
11+
<ip>127.0.0.1</ip>
12+
<bcast>127.0.0.1</bcast>
13+
<mask>127.0.0.1</mask>
14+
<encryption><![CDATA[psk2]]></encryption>
15+
<proto>static</proto>
16+
<gateway>127.0.0.1</gateway>
17+
<dns>127.0.0.1</dns>
18+
<ieee>802.11bgn</ieee>
19+
<ssid><![CDATA[accespoint name]]></ssid>
20+
<mode>Client</mode>
21+
<frequency unit="GHz">2.437</frequency>
22+
<access_point_mac>01:23:45:67:89:AB</access_point_mac>
23+
<link_quality>47/70</link_quality>
24+
<signal_strength unit="dBm">-63</signal_strength>
25+
</wlan0>
26+
<eth0/>
27+
<time>2022-10-17T14:50:00.511+02:00</time>
28+
<timezone><![CDATA[Europe/Amsterdam]]></timezone>
29+
<remote_control origin='any'>not initialized</remote_control></system>

0 commit comments

Comments
 (0)