Skip to content

Commit 57e1206

Browse files
authored
Merge pull request #391 from plugwise/test-updated
Bug-fix and testing: make it possible to emulate binary_sensors, climates, numbers, sensors, switches, etc., updating.
2 parents 7719d7f + fa5efb2 commit 57e1206

File tree

14 files changed

+6625
-21
lines changed

14 files changed

+6625
-21
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ tmp
1616
.mypy_cache
1717
node_modules/
1818
package-lock.json
19+
fixtures/updated/*/

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Ongoing
44

5+
- Testing: make it possible to emulate binary_sensors, climates, numbers, sensors, switches, etc., updating.
6+
- Fix a bug which prevents the updating of the available-state of zigbee devices.
57
- Modify the added P1 Plugwise notification so that it does not impact the device-availability
68

79
## v0.32.2 Continuous improvements, bugfix

fixtures/updated/.exists

Whitespace-only changes.

plugwise/__init__.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ def __init__(
317317
SmileData.__init__(self)
318318

319319
self.smile_hostname: str | None = None
320+
self._target_smile: str | None = None
320321

321322
async def connect(self) -> bool:
322323
"""Connect to Plugwise device and determine its name, type and version."""
@@ -432,19 +433,19 @@ async def _smile_detect(self, result: etree, dsmrmain: etree) -> None:
432433
raise UnsupportedDeviceError
433434

434435
ver = semver.version.Version.parse(self.smile_fw_version)
435-
target_smile = f"{model}_v{ver.major}"
436-
LOGGER.debug("Plugwise identified as %s", target_smile)
437-
if target_smile not in SMILES:
436+
self._target_smile = f"{model}_v{ver.major}"
437+
LOGGER.debug("Plugwise identified as %s", self._target_smile)
438+
if self._target_smile not in SMILES:
438439
LOGGER.error(
439440
"Your version Smile identified as %s seems unsupported by our plugin, please"
440441
" create an issue on http://github.com/plugwise/python-plugwise",
441-
target_smile,
442+
self._target_smile,
442443
)
443444
raise UnsupportedDeviceError
444445

445446
self.smile_model = "Gateway"
446-
self.smile_name = SMILES[target_smile].smile_name
447-
self.smile_type = SMILES[target_smile].smile_type
447+
self.smile_name = SMILES[self._target_smile].smile_name
448+
self.smile_type = SMILES[self._target_smile].smile_type
448449
self.smile_version = (self.smile_fw_version, ver)
449450

450451
if self.smile_type == "stretch":
@@ -505,16 +506,20 @@ async def _update_domain_objects(self) -> None:
505506

506507
async def async_update(self) -> PlugwiseData:
507508
"""Perform an incremental update for updating the various device states."""
508-
if self.smile_type != "power":
509-
await self._update_domain_objects()
510-
elif not self._smile_legacy:
511-
self._locations = await self._request(LOCATIONS)
512-
else:
513-
self._modules = await self._request(MODULES)
514-
515-
# P1 legacy has no appliances
516-
if not (self.smile_type == "power" and self._smile_legacy):
517-
self._appliances = await self._request(APPLIANCES)
509+
match self._target_smile:
510+
case "smile_v2":
511+
self._modules = await self._request(MODULES)
512+
case "smile_v3" | "smile_v4":
513+
self._locations = await self._request(LOCATIONS)
514+
case "smile_thermo_v1" | "smile_thermo_v3" | "smile_thermo_v4":
515+
self._appliances = await self._request(APPLIANCES)
516+
await self._update_domain_objects()
517+
case "smile_open_therm_v2" | "smile_open_therm_v3":
518+
self._appliances = await self._request(APPLIANCES)
519+
await self._update_domain_objects()
520+
self._modules = await self._request(MODULES)
521+
case "stretch_v2" | "stretch_v3":
522+
self._appliances = await self._request(APPLIANCES)
518523

519524
self.gw_data["notifications"] = self._notifications
520525

tests/test_smile.py

Lines changed: 93 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -375,14 +375,17 @@ def show_setup(location_list, device_list):
375375
assert False
376376

377377
@pytest.mark.asyncio
378-
async def device_test(self, smile=pw_smile.Smile, testdata=None):
378+
async def device_test(self, smile=pw_smile.Smile, testdata=None, initialize=True):
379379
"""Perform basic device tests."""
380-
_LOGGER.info("Asserting testdata:")
381380
bsw_list = ["binary_sensors", "central", "climate", "sensors", "switches"]
382381
# Make sure to test with the day set to Sunday, needed for full testcoverage of schedules_temps()
383382
with freeze_time("2022-05-16 00:00:01"):
384-
await smile._full_update_device()
385-
smile.get_all_devices()
383+
if initialize:
384+
_LOGGER.info("Asserting testdata:")
385+
await smile._full_update_device()
386+
smile.get_all_devices()
387+
else:
388+
_LOGGER.info("Asserting updated testdata:")
386389
data = await smile.async_update()
387390

388391
if "heater_id" in data.gateway:
@@ -454,6 +457,7 @@ async def device_test(self, smile=pw_smile.Smile, testdata=None):
454457
asserts += 1
455458

456459
assert tests == asserts
460+
_LOGGER.debug("Number of test-assert: %s", asserts)
457461

458462
@pytest.mark.asyncio
459463
async def tinker_switch(
@@ -1065,6 +1069,50 @@ async def test_connect_anna_v4(self):
10651069
"sensors": {"outdoor_temperature": 7.44},
10661070
},
10671071
}
1072+
testdata_updated = {
1073+
"cd0e6156b1f04d5f952349ffbe397481": {
1074+
"maximum_boiler_temperature": {
1075+
"setpoint": 69.0,
1076+
"lower_bound": 0.0,
1077+
"upper_bound": 100.0,
1078+
"resolution": 1.0,
1079+
},
1080+
"max_dhw_temperature": {
1081+
"setpoint": 59.0,
1082+
"lower_bound": 30.0,
1083+
"upper_bound": 60.0,
1084+
"resolution": 0.01,
1085+
},
1086+
"binary_sensors": {
1087+
"dhw_state": False,
1088+
"heating_state": False,
1089+
"flame_state": False,
1090+
},
1091+
"sensors": {
1092+
"water_temperature": 51.0,
1093+
"intended_boiler_temperature": 0.0,
1094+
"modulation_level": 0.0,
1095+
"return_temperature": 41.0,
1096+
"water_pressure": 2.1,
1097+
},
1098+
"switches": {"dhw_cm_switch": True},
1099+
},
1100+
"01b85360fdd243d0aaad4d6ac2a5ba7e": {
1101+
"thermostat": {
1102+
"setpoint": 19.5,
1103+
"lower_bound": 4.0,
1104+
"upper_bound": 30.0,
1105+
"resolution": 0.1,
1106+
},
1107+
"active_preset": "away",
1108+
"select_schedule": "Standaard",
1109+
"mode": "auto",
1110+
"sensors": {"temperature": 19.5, "setpoint": 19.5, "illuminance": 39.5},
1111+
},
1112+
"0466eae8520144c78afb29628384edeb": {
1113+
"sensors": {"outdoor_temperature": 6.44},
1114+
},
1115+
}
10681116

10691117
self.smile_setup = "anna_v4"
10701118
server, smile, client = await self.connect_wrapper()
@@ -1102,10 +1150,18 @@ async def test_connect_anna_v4(self):
11021150
smile, "0466eae8520144c78afb29628384edeb"
11031151
)
11041152
assert not result
1153+
1154+
# Now change some data and change directory reading xml from
1155+
# emulating reading newer dataset after an update_interval
1156+
self.smile_setup = "updated/anna_v4"
1157+
await self.device_test(smile, testdata_updated, initialize=False)
1158+
11051159
await smile.close_connection()
11061160
await self.disconnect(server, client)
11071161

11081162
server, smile, client = await self.connect_wrapper(raise_timeout=True)
1163+
# Reset self.smile_setup
1164+
self.smile_setup = "anna_v4"
11091165
await self.device_test(smile, testdata)
11101166
result = await self.tinker_thermostat(
11111167
smile,
@@ -1831,6 +1887,34 @@ async def test_connect_adam_plus_anna_new(self):
18311887
"switches": {"relay": True},
18321888
},
18331889
}
1890+
testdata_updated = {
1891+
"67d73d0bd469422db25a618a5fb8eeb0": {
1892+
"switches": {"lock": True},
1893+
},
1894+
"29542b2b6a6a4169acecc15c72a599b8": {
1895+
"switches": {"relay": False, "lock": False},
1896+
},
1897+
"2568cc4b9c1e401495d4741a5f89bee1": {
1898+
"sensors": {
1899+
"electricity_consumed": 0.0,
1900+
"electricity_consumed_interval": 0.0,
1901+
},
1902+
"switches": {"relay": False, "lock": False},
1903+
},
1904+
"1772a4ea304041adb83f357b751341ff": {
1905+
"available": False,
1906+
},
1907+
"da224107914542988a88561b4452b0f6": {
1908+
"binary_sensors": {"plugwise_notification": True},
1909+
},
1910+
"e8ef2a01ed3b4139a53bf749204fe6b4": {
1911+
"members": [
1912+
"2568cc4b9c1e401495d4741a5f89bee1",
1913+
"29542b2b6a6a4169acecc15c72a599b8",
1914+
],
1915+
"switches": {"relay": False},
1916+
},
1917+
}
18341918

18351919
self.smile_setup = "adam_plus_anna_new"
18361920
server, smile, client = await self.connect_wrapper()
@@ -1905,6 +1989,11 @@ async def test_connect_adam_plus_anna_new(self):
19051989

19061990
await self.tinker_max_boiler_temp(smile)
19071991

1992+
# Now change some data and change directory reading xml from
1993+
# emulating reading newer dataset after an update_interval
1994+
self.smile_setup = "updated/adam_plus_anna_new"
1995+
await self.device_test(smile, testdata_updated, initialize=False)
1996+
19081997
await smile.close_connection()
19091998
await self.disconnect(server, client)
19101999

@@ -3557,7 +3646,6 @@ async def test_adam_plus_jip(self):
35573646
good_schedules=[None],
35583647
)
35593648
assert result
3560-
35613649
await smile.close_connection()
35623650
await self.disconnect(server, client)
35633651

0 commit comments

Comments
 (0)