Skip to content

Commit f5709da

Browse files
authored
Merge pull request #64 from plugwise/dhw_mode
Implement support for the dhw_comform_mode switch
2 parents e5ad7e0 + 8c7f8ce commit f5709da

File tree

5 files changed

+41
-29
lines changed

5 files changed

+41
-29
lines changed

.github/workflows/verify.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
name: Latest commit
55

66
env:
7-
CACHE_VERSION: 2
7+
CACHE_VERSION: 3
88
DEFAULT_PYTHON: 3.9
99
PRE_COMMIT_HOME: ~/.cache/pre-commit
1010

plugwise/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Plugwise module."""
22

3-
__version__ = "0.9.0"
3+
__version__ = "0.9.1"
44

55
from plugwise.smile import Smile
66
from plugwise.stick import stick

plugwise/constants.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,10 @@
383383
ATTR_NAME: "water_temperature",
384384
ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
385385
},
386+
"domestic_hot_water_comfort_mode": {
387+
ATTR_NAME: "dhw_comf_mode",
388+
ATTR_UNIT_OF_MEASUREMENT: None,
389+
},
386390
"domestic_hot_water_state": {
387391
ATTR_NAME: "dhw_state",
388392
ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,

plugwise/smile.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1207,35 +1207,39 @@ def __get_temperature_uri(self, loc_id):
12071207

12081208
return f"{LOCATIONS};id={loc_id}/thermostat;id={thermostat_functionality_id}"
12091209

1210-
async def set_relay_state(self, appl_id, members, state):
1211-
"""Switch the Plug off/on."""
1210+
async def set_switch_state(self, appl_id, members, model, state):
1211+
"""Switch the Switch off/on."""
12121212
actuator = "actuator_functionalities"
1213-
relay = "relay_functionality"
1213+
func_type = "relay_functionality"
1214+
device = "relay"
1215+
if model == "dhw_cm_switch":
1216+
func_type = "toggle_functionality"
1217+
device = "toggle"
12141218
stretch_v2 = self.smile_type == "stretch" and self.smile_version[1].major == 2
12151219
if stretch_v2:
12161220
actuator = "actuators"
1217-
relay = "relay"
1221+
func_type = "relay"
12181222

12191223
if members is not None:
12201224
for member in members:
1221-
locator = f'appliance[@id="{member}"]/{actuator}/{relay}'
1222-
relay_functionality_id = self._appliances.find(locator).attrib["id"]
1223-
uri = f"{APPLIANCES};id={member}/relay;id={relay_functionality_id}"
1225+
locator = f'appliance[@id="{member}"]/{actuator}/{func_type}'
1226+
switch_id = self._appliances.find(locator).attrib["id"]
1227+
uri = f"{APPLIANCES};id={member}/{device};id={switch_id}"
12241228
if stretch_v2:
1225-
uri = f"{APPLIANCES};id={member}/relay"
1229+
uri = f"{APPLIANCES};id={member}/{device}"
12261230
state = str(state)
1227-
data = f"<{relay}><state>{state}</state></{relay}>"
1231+
data = f"<{func_type}><state>{state}</state></{func_type}>"
12281232

12291233
await self.request(uri, method="put", data=data)
12301234
return True
12311235

1232-
locator = f'appliance[@id="{appl_id}"]/{actuator}/{relay}'
1233-
relay_functionality_id = self._appliances.find(locator).attrib["id"]
1234-
uri = f"{APPLIANCES};id={appl_id}/relay;id={relay_functionality_id}"
1236+
locator = f'appliance[@id="{appl_id}"]/{actuator}/{func_type}'
1237+
switch_id = self._appliances.find(locator).attrib["id"]
1238+
uri = f"{APPLIANCES};id={appl_id}/{device};id={switch_id}"
12351239
if stretch_v2:
1236-
uri = f"{APPLIANCES};id={appl_id}/relay"
1240+
uri = f"{APPLIANCES};id={appl_id}/{device}"
12371241
state = str(state)
1238-
data = f"<{relay}><state>{state}</state></{relay}>"
1242+
data = f"<{func_type}><state>{state}</state></{func_type}>"
12391243

12401244
await self.request(uri, method="put", data=data)
12411245
return True

tests/test_smile.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -329,18 +329,20 @@ async def device_test(self, smile=pw_smile.Smile, testdata=None):
329329
assert data[measure_key] == measure_assert
330330

331331
@pytest.mark.asyncio
332-
async def tinker_relay(self, smile, dev_ids=None, members=None, unhappy=False):
333-
"""Switch a relay on and off to test functionality."""
334-
_LOGGER.info("Asserting modifying settings for relay devices:")
332+
async def tinker_switch(
333+
self, smile, dev_ids=None, members=None, model=None, unhappy=False
334+
):
335+
"""Turn a Switch on and off to test functionality."""
336+
_LOGGER.info("Asserting modifying settings for switch devices:")
335337
for dev_id in dev_ids:
336338
_LOGGER.info("- Devices (%s):", dev_id)
337339
for new_state in [False, True, False]:
338340
_LOGGER.info("- Switching %s", new_state)
339341
try:
340-
relay_change = await smile.set_relay_state(
341-
dev_id, members, new_state
342+
switch_change = await smile.set_switch_state(
343+
dev_id, members, model, new_state
342344
)
343-
assert relay_change
345+
assert switch_change
344346
_LOGGER.info(" + worked as intended")
345347
except (
346348
pw_exceptions.ErrorSendingCommandError,
@@ -878,7 +880,7 @@ async def test_connect_adam_plus_anna(self):
878880
await self.tinker_thermostat(
879881
smile, "009490cc2f674ce6b576863fbb64f867", good_schemas=["Weekschema"]
880882
)
881-
await self.tinker_relay(smile, ["aa6b0002df0a46e1b1eb94beb61eddfe"])
883+
await self.tinker_switch(smile, ["aa6b0002df0a46e1b1eb94beb61eddfe"])
882884
await smile.close_connection()
883885
await self.disconnect(server, client)
884886

@@ -889,7 +891,7 @@ async def test_connect_adam_plus_anna(self):
889891
good_schemas=["Weekschema"],
890892
unhappy=True,
891893
)
892-
await self.tinker_relay(
894+
await self.tinker_switch(
893895
smile, ["aa6b0002df0a46e1b1eb94beb61eddfe"], unhappy=True
894896
)
895897
await smile.close_connection()
@@ -913,12 +915,14 @@ async def test_connect_adam_plus_anna_new(self):
913915
_LOGGER.info(" # Assert version")
914916
assert smile.smile_version[0] == "3.2.4"
915917

916-
await self.tinker_relay(
918+
await self.tinker_switch(
917919
smile,
918920
["b83f9f9758064c0fab4af6578cba4c6d"],
919921
["aa6b0002df0a46e1b1eb94beb61eddfe", "f2be121e4a9345ac83c6e99ed89a98be"],
920922
)
921-
923+
await self.tinker_switch(
924+
smile, ["2743216f626f43948deec1f7ab3b3d70"], model="dhw_cm_switch"
925+
)
922926
await self.device_test(smile, testdata)
923927
await smile.close_connection()
924928
await self.disconnect(server, client)
@@ -986,7 +990,7 @@ async def test_connect_adam_zone_per_device(self):
986990
await self.tinker_thermostat(
987991
smile, "82fa13f017d240daa0d0ea1775420f24", good_schemas=["CV Jessie"]
988992
)
989-
await self.tinker_relay(smile, ["675416a629f343c495449970e2ca37b5"])
993+
await self.tinker_switch(smile, ["675416a629f343c495449970e2ca37b5"])
990994
await smile.close_connection()
991995
await self.disconnect(server, client)
992996

@@ -1069,7 +1073,7 @@ async def test_connect_adam_multiple_devices_per_zone(self):
10691073
await self.tinker_thermostat(
10701074
smile, "82fa13f017d240daa0d0ea1775420f24", good_schemas=["CV Jessie"]
10711075
)
1072-
await self.tinker_relay(smile, ["675416a629f343c495449970e2ca37b5"])
1076+
await self.tinker_switch(smile, ["675416a629f343c495449970e2ca37b5"])
10731077
await smile.close_connection()
10741078
await self.disconnect(server, client)
10751079

@@ -1360,7 +1364,7 @@ async def test_connect_stretch_v23(self):
13601364
_LOGGER.info(" # Assert legacy")
13611365
assert smile._smile_legacy # pylint: disable=protected-access
13621366

1363-
await self.tinker_relay(smile, ["2587a7fcdd7e482dab03fda256076b4b"])
1367+
await self.tinker_switch(smile, ["2587a7fcdd7e482dab03fda256076b4b"])
13641368

13651369
await self.device_test(smile, testdata)
13661370

0 commit comments

Comments
 (0)