From 95fe94a88d74c609f8fe6e433c8aaf758ddaca95 Mon Sep 17 00:00:00 2001 From: Mart van Male Date: Sun, 25 Oct 2026 14:19:46 +0100 Subject: [PATCH 1/7] Read each zone's own preset rule _presets() now reads only the preset rule attached to the zone, so each zone on an Adam with several zones gets its own preset setpoints. When no rule or several rules are attached to a zone, it reads all preset rules, so gateways without per-zone rules keep their preset list. --- CHANGELOG.md | 1 + fixtures/adam_heatpump_cooling/data.json | 24 +++++++++---------- fixtures/adam_jip/data.json | 18 +++++++------- .../adam_multiple_devices_per_zone/data.json | 20 ++++++++-------- fixtures/adam_plus_anna_new/data.json | 2 +- .../data.json | 4 ++-- fixtures/adam_zone_per_device/data.json | 20 ++++++++-------- fixtures/m_adam_cooling/data.json | 2 +- fixtures/m_adam_heating/data.json | 2 +- .../m_adam_heating_off_schedule/data.json | 2 +- fixtures/m_adam_jip/data.json | 18 +++++++------- .../data.json | 20 ++++++++-------- plugwise/helper.py | 23 ++++++++++++++---- tests/data/adam/adam_heatpump_cooling.json | 24 +++++++++---------- tests/data/adam/adam_jip.json | 18 +++++++------- .../adam/adam_multiple_devices_per_zone.json | 20 ++++++++-------- tests/data/adam/adam_plus_anna_new.json | 2 +- .../adam_plus_anna_new_regulation_off.json | 4 ++-- tests/data/adam/adam_zone_per_device.json | 20 ++++++++-------- tests/test_adam.py | 7 ++++++ 20 files changed, 136 insertions(+), 115 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 215e2e8a7..1df825cbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Ongoing +- Each Adam zone now takes its presets from its own preset rule, not from the last preset rule on the gateway. - Fix setting changes after a timeout or a 504 error. The retry sent a read instead of the change, so the change was reported as done even when the gateway never got it. ## v1.14.8 diff --git a/fixtures/adam_heatpump_cooling/data.json b/fixtures/adam_heatpump_cooling/data.json index 615f4d28d..38b11ef6d 100644 --- a/fixtures/adam_heatpump_cooling/data.json +++ b/fixtures/adam_heatpump_cooling/data.json @@ -16,8 +16,8 @@ "no_frost", "vacation", "away", - "home", - "asleep" + "asleep", + "home" ], "select_schedule": "off", "select_zone_profile": "passive", @@ -282,9 +282,9 @@ "preset_modes": [ "no_frost", "vacation", - "away", "home", - "asleep" + "asleep", + "away" ], "select_schedule": "Werkdag schema", "select_zone_profile": "passive", @@ -442,9 +442,9 @@ "preset_modes": [ "no_frost", "vacation", - "away", "home", - "asleep" + "asleep", + "away" ], "select_schedule": "Werkdag schema", "select_zone_profile": "passive", @@ -489,8 +489,8 @@ "no_frost", "vacation", "away", - "home", - "asleep" + "asleep", + "home" ], "select_schedule": "off", "select_zone_profile": "passive", @@ -553,8 +553,8 @@ "preset_modes": [ "no_frost", "vacation", - "away", "home", + "away", "asleep" ], "select_schedule": "off", @@ -665,9 +665,9 @@ "preset_modes": [ "no_frost", "vacation", + "asleep", "away", - "home", - "asleep" + "home" ], "select_schedule": "off", "select_zone_profile": "active", @@ -809,8 +809,8 @@ "preset_modes": [ "no_frost", "vacation", - "away", "home", + "away", "asleep" ], "select_schedule": "off", diff --git a/fixtures/adam_jip/data.json b/fixtures/adam_jip/data.json index 04a2d5ede..c45312421 100644 --- a/fixtures/adam_jip/data.json +++ b/fixtures/adam_jip/data.json @@ -10,11 +10,11 @@ "model": "ThermoZone", "name": "Slaapkamer", "preset_modes": [ + "vacation", + "no_frost", "home", - "asleep", "away", - "vacation", - "no_frost" + "asleep" ], "select_schedule": "off", "select_zone_profile": "active", @@ -295,11 +295,11 @@ "model": "ThermoZone", "name": "Kinderkamer", "preset_modes": [ + "vacation", + "no_frost", "home", - "asleep", "away", - "vacation", - "no_frost" + "asleep" ], "select_schedule": "off", "select_zone_profile": "active", @@ -362,11 +362,11 @@ "model": "ThermoZone", "name": "Logeerkamer", "preset_modes": [ + "vacation", + "no_frost", "home", - "asleep", "away", - "vacation", - "no_frost" + "asleep" ], "select_schedule": "off", "select_zone_profile": "active", diff --git a/fixtures/adam_multiple_devices_per_zone/data.json b/fixtures/adam_multiple_devices_per_zone/data.json index 697796878..c57f3da41 100644 --- a/fixtures/adam_multiple_devices_per_zone/data.json +++ b/fixtures/adam_multiple_devices_per_zone/data.json @@ -36,11 +36,11 @@ "model": "ThermoZone", "name": "Badkamer", "preset_modes": [ - "home", "asleep", + "no_frost", "away", - "vacation", - "no_frost" + "home", + "vacation" ], "select_schedule": "Badkamer Schema", "sensors": { @@ -78,10 +78,10 @@ "name": "Bios", "preset_modes": [ "home", - "asleep", "away", "vacation", - "no_frost" + "no_frost", + "asleep" ], "select_schedule": "off", "sensors": { @@ -299,10 +299,10 @@ "name": "Jessie", "preset_modes": [ "home", - "asleep", + "no_frost", "away", "vacation", - "no_frost" + "asleep" ], "select_schedule": "CV Jessie", "sensors": { @@ -453,11 +453,11 @@ "model": "ThermoZone", "name": "Woonkamer", "preset_modes": [ - "home", + "vacation", "asleep", + "no_frost", "away", - "vacation", - "no_frost" + "home" ], "select_schedule": "GF7 Woonkamer", "sensors": { diff --git a/fixtures/adam_plus_anna_new/data.json b/fixtures/adam_plus_anna_new/data.json index 6b4350c15..655985bd0 100644 --- a/fixtures/adam_plus_anna_new/data.json +++ b/fixtures/adam_plus_anna_new/data.json @@ -364,9 +364,9 @@ "model": "ThermoZone", "name": "Bathroom", "preset_modes": [ - "vacation", "no_frost", "asleep", + "vacation", "home", "away" ], diff --git a/fixtures/adam_plus_anna_new_regulation_off/data.json b/fixtures/adam_plus_anna_new_regulation_off/data.json index fcfef409b..4bac4658e 100644 --- a/fixtures/adam_plus_anna_new_regulation_off/data.json +++ b/fixtures/adam_plus_anna_new_regulation_off/data.json @@ -267,10 +267,10 @@ "model": "ThermoZone", "name": "Living room", "preset_modes": [ - "no_frost", - "asleep", "vacation", + "no_frost", "home", + "asleep", "away" ], "select_schedule": "off", diff --git a/fixtures/adam_zone_per_device/data.json b/fixtures/adam_zone_per_device/data.json index e9771f0d7..aa6a5476d 100644 --- a/fixtures/adam_zone_per_device/data.json +++ b/fixtures/adam_zone_per_device/data.json @@ -36,11 +36,11 @@ "model": "ThermoZone", "name": "Badkamer", "preset_modes": [ - "home", "asleep", + "no_frost", "away", - "vacation", - "no_frost" + "home", + "vacation" ], "select_schedule": "Badkamer Schema", "sensors": { @@ -79,10 +79,10 @@ "name": "Bios", "preset_modes": [ "home", - "asleep", "away", "vacation", - "no_frost" + "no_frost", + "asleep" ], "select_schedule": "off", "sensors": { @@ -300,10 +300,10 @@ "name": "Jessie", "preset_modes": [ "home", - "asleep", + "no_frost", "away", "vacation", - "no_frost" + "asleep" ], "select_schedule": "CV Jessie", "sensors": { @@ -454,11 +454,11 @@ "model": "ThermoZone", "name": "Woonkamer", "preset_modes": [ - "home", + "vacation", "asleep", + "no_frost", "away", - "vacation", - "no_frost" + "home" ], "select_schedule": "GF7 Woonkamer", "sensors": { diff --git a/fixtures/m_adam_cooling/data.json b/fixtures/m_adam_cooling/data.json index f33fb1533..7baccf71d 100644 --- a/fixtures/m_adam_cooling/data.json +++ b/fixtures/m_adam_cooling/data.json @@ -275,9 +275,9 @@ "model": "ThermoZone", "name": "Bathroom", "preset_modes": [ - "vacation", "no_frost", "asleep", + "vacation", "home", "away" ], diff --git a/fixtures/m_adam_heating/data.json b/fixtures/m_adam_heating/data.json index 9c15aa068..a193884f1 100644 --- a/fixtures/m_adam_heating/data.json +++ b/fixtures/m_adam_heating/data.json @@ -280,9 +280,9 @@ "model": "ThermoZone", "name": "Bathroom", "preset_modes": [ - "vacation", "no_frost", "asleep", + "vacation", "home", "away" ], diff --git a/fixtures/m_adam_heating_off_schedule/data.json b/fixtures/m_adam_heating_off_schedule/data.json index ad489df47..6c5a7f319 100644 --- a/fixtures/m_adam_heating_off_schedule/data.json +++ b/fixtures/m_adam_heating_off_schedule/data.json @@ -280,9 +280,9 @@ "model": "ThermoZone", "name": "Bathroom", "preset_modes": [ - "vacation", "no_frost", "asleep", + "vacation", "home", "away" ], diff --git a/fixtures/m_adam_jip/data.json b/fixtures/m_adam_jip/data.json index dd73cb9ce..cb3c2021c 100644 --- a/fixtures/m_adam_jip/data.json +++ b/fixtures/m_adam_jip/data.json @@ -9,11 +9,11 @@ "model": "ThermoZone", "name": "Slaapkamer", "preset_modes": [ + "vacation", + "no_frost", "home", - "asleep", "away", - "vacation", - "no_frost" + "asleep" ], "select_schedule": "off", "select_zone_profile": "active", @@ -294,11 +294,11 @@ "model": "ThermoZone", "name": "Kinderkamer", "preset_modes": [ + "vacation", + "no_frost", "home", - "asleep", "away", - "vacation", - "no_frost" + "asleep" ], "select_schedule": "off", "select_zone_profile": "active", @@ -361,11 +361,11 @@ "model": "ThermoZone", "name": "Logeerkamer", "preset_modes": [ + "vacation", + "no_frost", "home", - "asleep", "away", - "vacation", - "no_frost" + "asleep" ], "select_schedule": "off", "select_zone_profile": "active", diff --git a/fixtures/m_adam_multiple_devices_per_zone/data.json b/fixtures/m_adam_multiple_devices_per_zone/data.json index 2c7881426..842f63cff 100644 --- a/fixtures/m_adam_multiple_devices_per_zone/data.json +++ b/fixtures/m_adam_multiple_devices_per_zone/data.json @@ -36,11 +36,11 @@ "model": "ThermoZone", "name": "Badkamer", "preset_modes": [ - "home", "asleep", + "no_frost", "away", - "vacation", - "no_frost" + "home", + "vacation" ], "select_schedule": "Badkamer Schema", "sensors": { @@ -78,10 +78,10 @@ "name": "Bios", "preset_modes": [ "home", - "asleep", "away", "vacation", - "no_frost" + "no_frost", + "asleep" ], "select_schedule": "off", "sensors": { @@ -294,10 +294,10 @@ "name": "Jessie", "preset_modes": [ "home", - "asleep", + "no_frost", "away", "vacation", - "no_frost" + "asleep" ], "select_schedule": "CV Jessie", "sensors": { @@ -448,11 +448,11 @@ "model": "ThermoZone", "name": "Woonkamer", "preset_modes": [ - "home", + "vacation", "asleep", + "no_frost", "away", - "vacation", - "no_frost" + "home" ], "select_schedule": "GF7 Woonkamer", "sensors": { diff --git a/plugwise/helper.py b/plugwise/helper.py index ee361e63b..2b81b877e 100644 --- a/plugwise/helper.py +++ b/plugwise/helper.py @@ -918,11 +918,8 @@ def _preset(self, loc_id: str) -> str | None: def _presets(self, loc_id: str) -> dict[str, list[float]]: """Collect Presets for a Thermostat based on location_id.""" presets: dict[str, list[float]] = {} - tag_1 = "zone_setpoint_and_state_based_on_preset" - tag_2 = "Thermostat presets" - if not (rule_ids := self._rule_ids_by_tag(tag_1, loc_id)): - if not (rule_ids := self._rule_ids_by_name(tag_2, loc_id)): - return presets # pragma: no cover + if not (rule_ids := self._preset_rule_ids(loc_id)): + return presets # pragma: no cover for rule_id in rule_ids: directives = self._domain_objects.find(f'rule[@id="{rule_id}"]/directives') @@ -935,6 +932,22 @@ def _presets(self, loc_id: str) -> dict[str, list[float]]: return presets + def _preset_rule_ids(self, loc_id: str) -> list[str]: + """Helper-function for _presets(). + + Read only the preset rule attached to loc_id, so each zone gets its own presets. + Fall back to all preset rules when none or several are attached. + """ + tag_1 = "zone_setpoint_and_state_based_on_preset" + tag_2 = "Thermostat presets" + if not (rule_ids := self._rule_ids_by_tag(tag_1, loc_id)): + rule_ids = self._rule_ids_by_name(tag_2, loc_id) + + own = [ + rule_id for rule_id, data in rule_ids.items() if data["location"] == loc_id + ] + return own if len(own) == 1 else list(rule_ids) + def _rule_ids_by_name(self, name: str, loc_id: str) -> dict[str, dict[str, str]]: """Helper-function for _presets(). diff --git a/tests/data/adam/adam_heatpump_cooling.json b/tests/data/adam/adam_heatpump_cooling.json index af25e6f25..9e4cdda6b 100644 --- a/tests/data/adam/adam_heatpump_cooling.json +++ b/tests/data/adam/adam_heatpump_cooling.json @@ -16,8 +16,8 @@ "no_frost", "vacation", "away", - "home", - "asleep" + "asleep", + "home" ], "select_schedule": "off", "select_zone_profile": "passive", @@ -282,9 +282,9 @@ "preset_modes": [ "no_frost", "vacation", - "away", "home", - "asleep" + "asleep", + "away" ], "select_schedule": "Werkdag schema", "select_zone_profile": "passive", @@ -442,9 +442,9 @@ "preset_modes": [ "no_frost", "vacation", - "away", "home", - "asleep" + "asleep", + "away" ], "select_schedule": "Werkdag schema", "select_zone_profile": "passive", @@ -489,8 +489,8 @@ "no_frost", "vacation", "away", - "home", - "asleep" + "asleep", + "home" ], "select_schedule": "off", "select_zone_profile": "passive", @@ -553,8 +553,8 @@ "preset_modes": [ "no_frost", "vacation", - "away", "home", + "away", "asleep" ], "select_schedule": "off", @@ -665,9 +665,9 @@ "preset_modes": [ "no_frost", "vacation", + "asleep", "away", - "home", - "asleep" + "home" ], "select_schedule": "off", "select_zone_profile": "active", @@ -809,8 +809,8 @@ "preset_modes": [ "no_frost", "vacation", - "away", "home", + "away", "asleep" ], "select_schedule": "off", diff --git a/tests/data/adam/adam_jip.json b/tests/data/adam/adam_jip.json index 1e1dfc36a..af46dd452 100644 --- a/tests/data/adam/adam_jip.json +++ b/tests/data/adam/adam_jip.json @@ -10,11 +10,11 @@ "model": "ThermoZone", "name": "Slaapkamer", "preset_modes": [ + "vacation", + "no_frost", "home", - "asleep", "away", - "vacation", - "no_frost" + "asleep" ], "select_schedule": "off", "select_zone_profile": "active", @@ -295,11 +295,11 @@ "model": "ThermoZone", "name": "Kinderkamer", "preset_modes": [ + "vacation", + "no_frost", "home", - "asleep", "away", - "vacation", - "no_frost" + "asleep" ], "select_schedule": "off", "select_zone_profile": "active", @@ -362,11 +362,11 @@ "model": "ThermoZone", "name": "Logeerkamer", "preset_modes": [ + "vacation", + "no_frost", "home", - "asleep", "away", - "vacation", - "no_frost" + "asleep" ], "select_schedule": "off", "select_zone_profile": "active", diff --git a/tests/data/adam/adam_multiple_devices_per_zone.json b/tests/data/adam/adam_multiple_devices_per_zone.json index 697796878..c57f3da41 100644 --- a/tests/data/adam/adam_multiple_devices_per_zone.json +++ b/tests/data/adam/adam_multiple_devices_per_zone.json @@ -36,11 +36,11 @@ "model": "ThermoZone", "name": "Badkamer", "preset_modes": [ - "home", "asleep", + "no_frost", "away", - "vacation", - "no_frost" + "home", + "vacation" ], "select_schedule": "Badkamer Schema", "sensors": { @@ -78,10 +78,10 @@ "name": "Bios", "preset_modes": [ "home", - "asleep", "away", "vacation", - "no_frost" + "no_frost", + "asleep" ], "select_schedule": "off", "sensors": { @@ -299,10 +299,10 @@ "name": "Jessie", "preset_modes": [ "home", - "asleep", + "no_frost", "away", "vacation", - "no_frost" + "asleep" ], "select_schedule": "CV Jessie", "sensors": { @@ -453,11 +453,11 @@ "model": "ThermoZone", "name": "Woonkamer", "preset_modes": [ - "home", + "vacation", "asleep", + "no_frost", "away", - "vacation", - "no_frost" + "home" ], "select_schedule": "GF7 Woonkamer", "sensors": { diff --git a/tests/data/adam/adam_plus_anna_new.json b/tests/data/adam/adam_plus_anna_new.json index 19f350021..11b151c6d 100644 --- a/tests/data/adam/adam_plus_anna_new.json +++ b/tests/data/adam/adam_plus_anna_new.json @@ -364,9 +364,9 @@ "model": "ThermoZone", "name": "Bathroom", "preset_modes": [ - "vacation", "no_frost", "asleep", + "vacation", "home", "away" ], diff --git a/tests/data/adam/adam_plus_anna_new_regulation_off.json b/tests/data/adam/adam_plus_anna_new_regulation_off.json index 25c0c695c..d6712ed4f 100644 --- a/tests/data/adam/adam_plus_anna_new_regulation_off.json +++ b/tests/data/adam/adam_plus_anna_new_regulation_off.json @@ -267,10 +267,10 @@ "model": "ThermoZone", "name": "Living room", "preset_modes": [ - "no_frost", - "asleep", "vacation", + "no_frost", "home", + "asleep", "away" ], "select_schedule": "off", diff --git a/tests/data/adam/adam_zone_per_device.json b/tests/data/adam/adam_zone_per_device.json index e9771f0d7..aa6a5476d 100644 --- a/tests/data/adam/adam_zone_per_device.json +++ b/tests/data/adam/adam_zone_per_device.json @@ -36,11 +36,11 @@ "model": "ThermoZone", "name": "Badkamer", "preset_modes": [ - "home", "asleep", + "no_frost", "away", - "vacation", - "no_frost" + "home", + "vacation" ], "select_schedule": "Badkamer Schema", "sensors": { @@ -79,10 +79,10 @@ "name": "Bios", "preset_modes": [ "home", - "asleep", "away", "vacation", - "no_frost" + "no_frost", + "asleep" ], "select_schedule": "off", "sensors": { @@ -300,10 +300,10 @@ "name": "Jessie", "preset_modes": [ "home", - "asleep", + "no_frost", "away", "vacation", - "no_frost" + "asleep" ], "select_schedule": "CV Jessie", "sensors": { @@ -454,11 +454,11 @@ "model": "ThermoZone", "name": "Woonkamer", "preset_modes": [ - "home", + "vacation", "asleep", + "no_frost", "away", - "vacation", - "no_frost" + "home" ], "select_schedule": "GF7 Woonkamer", "sensors": { diff --git a/tests/test_adam.py b/tests/test_adam.py index 34c680026..908e65e44 100644 --- a/tests/test_adam.py +++ b/tests/test_adam.py @@ -68,6 +68,13 @@ async def test_connect_adam_plus_anna_new(self): "f871b8c4d63549319221e294e4f88074", ] assert api.reboot + # Each zone reads its own preset rule, not the last one in the document + # pylint: disable-next=protected-access + living_room = api._smile_api._presets("f2bf9048bef64cc5b6d5110154e33c81") + # pylint: disable-next=protected-access + bathroom = api._smile_api._presets("f871b8c4d63549319221e294e4f88074") + assert living_room["home"] == [19.0, 22.0] + assert bathroom["home"] == [18.0, 22.0] result = await self.tinker_thermostat( api, From e0cdc6e5ba4828bd29647f0c8196cb6b3be7acbb Mon Sep 17 00:00:00 2001 From: Mart van Male Date: Sun, 25 Oct 2026 14:32:46 +0100 Subject: [PATCH 2/7] Add preset temperatures as adjustable values set_number() sends all five presets on every write and changes only the target heating setpoint. The gateway replaces a rule's whole directive set on each write. --- CHANGELOG.md | 1 + fixtures/adam_bad_thermostat/data.json | 30 ++ fixtures/adam_heatpump_cooling/data.json | 300 ++++++++++++++++++ fixtures/adam_jip/data.json | 120 +++++++ .../adam_multiple_devices_per_zone/data.json | 150 +++++++++ .../data.json | 30 ++ fixtures/adam_plus_anna/data.json | 30 ++ fixtures/adam_plus_anna_new/data.json | 60 ++++ .../data.json | 60 ++++ fixtures/adam_zone_per_device/data.json | 150 +++++++++ fixtures/anna_elga_2/data.json | 30 ++ fixtures/anna_elga_2_cooling/data.json | 30 ++ fixtures/anna_elga_2_schedule_off/data.json | 30 ++ fixtures/anna_elga_no_cooling/data.json | 30 ++ fixtures/anna_heatpump_cooling/data.json | 30 ++ .../data.json | 30 ++ fixtures/anna_heatpump_heating/data.json | 30 ++ fixtures/anna_loria_cooling_active/data.json | 30 ++ fixtures/anna_loria_driessens/data.json | 30 ++ fixtures/anna_loria_heating_idle/data.json | 30 ++ fixtures/anna_p1/data.json | 30 ++ fixtures/anna_v4/data.json | 30 ++ fixtures/anna_v4_dhw/data.json | 30 ++ fixtures/anna_v4_no_tag/data.json | 30 ++ fixtures/anna_without_boiler_fw441/data.json | 30 ++ fixtures/m_adam_cooling/data.json | 60 ++++ fixtures/m_adam_heating/data.json | 60 ++++ .../m_adam_heating_off_schedule/data.json | 60 ++++ fixtures/m_adam_jip/data.json | 120 +++++++ .../data.json | 150 +++++++++ fixtures/m_anna_heatpump_cooling/data.json | 30 ++ fixtures/m_anna_heatpump_idle/data.json | 30 ++ plugwise/constants.py | 21 ++ plugwise/data.py | 22 ++ plugwise/helper.py | 21 +- plugwise/smile.py | 54 +++- tests/data/adam/adam_bad_thermostat.json | 30 ++ tests/data/adam/adam_heatpump_cooling.json | 300 ++++++++++++++++++ tests/data/adam/adam_jip.json | 120 +++++++ .../adam/adam_multiple_devices_per_zone.json | 150 +++++++++ .../adam_onoff_cooling_fake_firmware.json | 30 ++ tests/data/adam/adam_plus_anna.json | 30 ++ tests/data/adam/adam_plus_anna_new.json | 60 ++++ .../adam_plus_anna_new_regulation_off.json | 60 ++++ tests/data/adam/adam_zone_per_device.json | 150 +++++++++ tests/data/anna/anna_elga_2.json | 30 ++ tests/data/anna/anna_elga_2_cooling.json | 30 ++ tests/data/anna/anna_elga_2_schedule_off.json | 30 ++ tests/data/anna/anna_elga_no_cooling.json | 30 ++ tests/data/anna/anna_heatpump_cooling.json | 30 ++ .../anna_heatpump_cooling_fake_firmware.json | 30 ++ tests/data/anna/anna_heatpump_heating.json | 30 ++ .../data/anna/anna_loria_cooling_active.json | 30 ++ tests/data/anna/anna_loria_driessens.json | 30 ++ tests/data/anna/anna_loria_heating_idle.json | 30 ++ tests/data/anna/anna_p1.json | 30 ++ tests/data/anna/anna_v4.json | 30 ++ tests/data/anna/anna_v4_dhw.json | 30 ++ tests/data/anna/anna_v4_no_tag.json | 30 ++ .../data/anna/anna_without_boiler_fw441.json | 30 ++ tests/test_adam.py | 45 ++- tests/test_anna.py | 32 +- tests/test_init.py | 35 ++ 63 files changed, 3473 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1df825cbc..2dffde73f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Ongoing +- Add the heating setpoint of each preset as an adjustable value for every zone with its own preset rule. Changing one resets a manual setpoint on that zone to its active preset. - Each Adam zone now takes its presets from its own preset rule, not from the last preset rule on the gateway. - Fix setting changes after a timeout or a 504 error. The retry sent a read instead of the change, so the change was reported as done even when the gateway never got it. diff --git a/fixtures/adam_bad_thermostat/data.json b/fixtures/adam_bad_thermostat/data.json index 8944b3a61..3b801e109 100644 --- a/fixtures/adam_bad_thermostat/data.json +++ b/fixtures/adam_bad_thermostat/data.json @@ -45,14 +45,38 @@ }, "3ee6b9486cb04c258a3130fff2b144a4": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Overloop", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "asleep", @@ -70,6 +94,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "8edf4c8b659342e8ae9809a6f9734532": { diff --git a/fixtures/adam_heatpump_cooling/data.json b/fixtures/adam_heatpump_cooling/data.json index 38b11ef6d..8a01e0f80 100644 --- a/fixtures/adam_heatpump_cooling/data.json +++ b/fixtures/adam_heatpump_cooling/data.json @@ -1,17 +1,41 @@ { "04b15f6e884448288f811d29fb7b1b30": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Opstaan weekdag", "Werkdag schema", "Weekend" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, "climate_mode": "cool", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Slaapkamer SJ", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "vacation", @@ -38,6 +62,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -140,17 +170,41 @@ }, "20e735858f8146cead98b873177a4f99": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Opstaan weekdag", "Werkdag schema", "Weekend" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, "climate_mode": "cool", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Slaapkamer DB", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "vacation", @@ -177,6 +231,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -268,17 +328,41 @@ }, "5cc21042f87f4b4c94ccb5537c47a53f": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Opstaan weekdag", "Werkdag schema", "Weekend" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Badkamer 2", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "vacation", @@ -304,6 +388,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -428,17 +518,41 @@ }, "8cf650a4c10c44819e426bed406aec34": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Opstaan weekdag", "Werkdag schema", "Weekend" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Badkamer 1", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "vacation", @@ -465,6 +579,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -474,17 +594,41 @@ }, "93ac3f7bf25342f58cbb77c4a99ac0b3": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Opstaan weekdag", "Werkdag schema", "Weekend" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, "climate_mode": "cool", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Slaapkamer RB", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "vacation", @@ -510,6 +654,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -539,17 +689,41 @@ }, "9a27714b970547ee9a6bdadc2b815ad5": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Opstaan weekdag", "Werkdag schema", "Weekend" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, "climate_mode": "cool", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Slaapkamer SQ", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "vacation", @@ -576,6 +750,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -605,17 +785,41 @@ }, "a562019b0b1f47a4bde8ebe3dbe3e8a9": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Opstaan weekdag", "Werkdag schema", "Weekend" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Keuken", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "vacation", @@ -642,6 +846,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -651,17 +861,41 @@ }, "b52908550469425b812c87f766fe5303": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Opstaan weekdag", "Werkdag schema", "Weekend" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "climate_mode": "cool", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Bijkeuken", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "vacation", @@ -688,6 +922,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -795,17 +1035,41 @@ }, "e39529c79ab54fda9bed26cfc0447546": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Opstaan weekdag", "Werkdag schema", "Weekend" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, "climate_mode": "cool", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Slaapkamer JM", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "vacation", @@ -832,6 +1096,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -911,17 +1181,41 @@ }, "fa5fa6b34f6b40a0972988b20e888ed4": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Opstaan weekdag", "Werkdag schema", "Weekend" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Woonkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "vacation", @@ -948,6 +1242,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", diff --git a/fixtures/adam_jip/data.json b/fixtures/adam_jip/data.json index c45312421..3ec32adf8 100644 --- a/fixtures/adam_jip/data.json +++ b/fixtures/adam_jip/data.json @@ -1,14 +1,38 @@ { "06aecb3d00354375924f50c47af36bd2": { "active_preset": "no_frost", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Slaapkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 9.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -35,6 +59,12 @@ "356b65335e274d769c338223e7af9c33" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -44,14 +74,38 @@ }, "13228dab8ce04617af318a2888b3c548": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Woonkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "asleep", @@ -78,6 +132,12 @@ "833de10f269c4deab58fb9df69901b4e" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -286,14 +346,38 @@ }, "d27aede973b54be484f6842d1b2802ad": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Kinderkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 9.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -320,6 +404,12 @@ "d4496250d0e942cfa7aea3476e9070d5" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -353,14 +443,38 @@ }, "d58fec52899f4f1c92e4f8fad6d8c48c": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Logeerkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 9.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -387,6 +501,12 @@ "1da4d325838e4ad8aac12177214505c9" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", diff --git a/fixtures/adam_multiple_devices_per_zone/data.json b/fixtures/adam_multiple_devices_per_zone/data.json index c57f3da41..44d307e86 100644 --- a/fixtures/adam_multiple_devices_per_zone/data.json +++ b/fixtures/adam_multiple_devices_per_zone/data.json @@ -22,6 +22,12 @@ }, "08963fec7c53423ca5680aa4cb502c63": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -30,11 +36,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 14.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Badkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "asleep", "no_frost", @@ -59,10 +83,22 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "12493538af164a409c6a1c79e38afe1c": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -71,11 +107,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Bios", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 8.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "away", @@ -103,6 +157,12 @@ "a2c3583e0a6349358998b760cea82d2a" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "21f2b542c49845e6bb416884c55778d6": { @@ -128,6 +188,12 @@ }, "446ac08dd04d4eff8ac57489757b7314": { "active_preset": "no_frost", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -136,11 +202,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Garage", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "asleep", @@ -164,6 +248,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "4a810418d5394b3f82727340b91ba740": { @@ -284,6 +374,12 @@ }, "82fa13f017d240daa0d0ea1775420f24": { "active_preset": "asleep", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -292,11 +388,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Jessie", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "no_frost", @@ -322,6 +436,12 @@ "d3da73bde12a47d5a6b8f9dad971f2ec" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 11.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "90986d591dcd426cae3ec3e8111ff730": { @@ -439,6 +559,12 @@ }, "c50f167537524366a5af7aa3942feb1e": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -447,11 +573,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "heating", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Woonkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "asleep", @@ -479,6 +623,12 @@ "b310b72a0e354bfab43089919b9a88bf" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "cd0ddb54ef694e11ac18ed1cbce5dbbd": { diff --git a/fixtures/adam_onoff_cooling_fake_firmware/data.json b/fixtures/adam_onoff_cooling_fake_firmware/data.json index a24e27d98..3a39b6550 100644 --- a/fixtures/adam_onoff_cooling_fake_firmware/data.json +++ b/fixtures/adam_onoff_cooling_fake_firmware/data.json @@ -90,17 +90,41 @@ }, "fa5fa6b34f6b40a0972988b20e888ed4": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Opstaan weekdag", "Werkdag schema", "Weekend" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Woonkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "vacation", @@ -127,6 +151,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", diff --git a/fixtures/adam_plus_anna/data.json b/fixtures/adam_plus_anna/data.json index 936cdb711..4123a2830 100644 --- a/fixtures/adam_plus_anna/data.json +++ b/fixtures/adam_plus_anna/data.json @@ -1,15 +1,39 @@ { "009490cc2f674ce6b576863fbb64f867": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Weekschema" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Living room", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "asleep", @@ -35,6 +59,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "2743216f626f43948deec1f7ab3b3d70": { diff --git a/fixtures/adam_plus_anna_new/data.json b/fixtures/adam_plus_anna_new/data.json index 655985bd0..4f8af21d3 100644 --- a/fixtures/adam_plus_anna_new/data.json +++ b/fixtures/adam_plus_anna_new/data.json @@ -302,6 +302,12 @@ }, "f2bf9048bef64cc5b6d5110154e33c81": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Badkamer", @@ -309,11 +315,29 @@ "Weekschema", "Test" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "heating", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Living room", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -342,6 +366,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -351,6 +381,12 @@ }, "f871b8c4d63549319221e294e4f88074": { "active_preset": "vacation", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Badkamer", @@ -358,11 +394,29 @@ "Weekschema", "Test" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Bathroom", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "asleep", @@ -391,6 +445,12 @@ "1772a4ea304041adb83f357b751341ff" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", diff --git a/fixtures/adam_plus_anna_new_regulation_off/data.json b/fixtures/adam_plus_anna_new_regulation_off/data.json index 4bac4658e..8ec048bdd 100644 --- a/fixtures/adam_plus_anna_new_regulation_off/data.json +++ b/fixtures/adam_plus_anna_new_regulation_off/data.json @@ -254,6 +254,12 @@ }, "f2bf9048bef64cc5b6d5110154e33c81": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Badkamer", @@ -261,11 +267,29 @@ "Vakantie", "Weekschema" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, "climate_mode": "off", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Living room", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -292,6 +316,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -301,6 +331,12 @@ }, "f871b8c4d63549319221e294e4f88074": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Badkamer", @@ -308,11 +344,29 @@ "Vakantie", "Weekschema" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "off", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Bathroom", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "asleep", @@ -341,6 +395,12 @@ "1772a4ea304041adb83f357b751341ff" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", diff --git a/fixtures/adam_zone_per_device/data.json b/fixtures/adam_zone_per_device/data.json index aa6a5476d..40fad1963 100644 --- a/fixtures/adam_zone_per_device/data.json +++ b/fixtures/adam_zone_per_device/data.json @@ -22,6 +22,12 @@ }, "08963fec7c53423ca5680aa4cb502c63": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -30,11 +36,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 14.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Badkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "asleep", "no_frost", @@ -60,10 +84,22 @@ "680423ff840043738f42cc7f1ff97a36" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "12493538af164a409c6a1c79e38afe1c": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -72,11 +108,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Bios", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 8.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "away", @@ -104,6 +158,12 @@ "a2c3583e0a6349358998b760cea82d2a" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "21f2b542c49845e6bb416884c55778d6": { @@ -129,6 +189,12 @@ }, "446ac08dd04d4eff8ac57489757b7314": { "active_preset": "no_frost", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -137,11 +203,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Garage", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "asleep", @@ -165,6 +249,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "4a810418d5394b3f82727340b91ba740": { @@ -285,6 +375,12 @@ }, "82fa13f017d240daa0d0ea1775420f24": { "active_preset": "asleep", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -293,11 +389,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Jessie", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "no_frost", @@ -323,6 +437,12 @@ "d3da73bde12a47d5a6b8f9dad971f2ec" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 11.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "90986d591dcd426cae3ec3e8111ff730": { @@ -440,6 +560,12 @@ }, "c50f167537524366a5af7aa3942feb1e": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -448,11 +574,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "heating", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Woonkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "asleep", @@ -480,6 +624,12 @@ "b310b72a0e354bfab43089919b9a88bf" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "cd0ddb54ef694e11ac18ed1cbce5dbbd": { diff --git a/fixtures/anna_elga_2/data.json b/fixtures/anna_elga_2/data.json index a2a591f4d..70a75ea33 100644 --- a/fixtures/anna_elga_2/data.json +++ b/fixtures/anna_elga_2/data.json @@ -35,18 +35,42 @@ }, "ebd90df1ab334565b5895f37590ccff4": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Thermostat schedule" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "heating", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, "location": "d3ce834534114348be628b61b26d9220", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "away", "no_frost", @@ -76,6 +100,12 @@ "setpoint_low": 19.5, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "fb49af122f6e4b0f91267e1cf7666d6f": { diff --git a/fixtures/anna_elga_2_cooling/data.json b/fixtures/anna_elga_2_cooling/data.json index 4c9b08154..f3d4c6877 100644 --- a/fixtures/anna_elga_2_cooling/data.json +++ b/fixtures/anna_elga_2_cooling/data.json @@ -42,18 +42,42 @@ }, "ebd90df1ab334565b5895f37590ccff4": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Thermostat schedule" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "cooling", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.5, + "upper_bound": 30.0 + }, "location": "d3ce834534114348be628b61b26d9220", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "away", "no_frost", @@ -83,6 +107,12 @@ "setpoint_low": 4.0, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "fb49af122f6e4b0f91267e1cf7666d6f": { diff --git a/fixtures/anna_elga_2_schedule_off/data.json b/fixtures/anna_elga_2_schedule_off/data.json index f77cd2383..e3640ab4b 100644 --- a/fixtures/anna_elga_2_schedule_off/data.json +++ b/fixtures/anna_elga_2_schedule_off/data.json @@ -42,18 +42,42 @@ }, "ebd90df1ab334565b5895f37590ccff4": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Thermostat schedule" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "heat_cool", "control_state": "idle", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.5, + "upper_bound": 30.0 + }, "location": "d3ce834534114348be628b61b26d9220", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "away", "no_frost", @@ -83,6 +107,12 @@ "setpoint_low": 19.5, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "fb49af122f6e4b0f91267e1cf7666d6f": { diff --git a/fixtures/anna_elga_no_cooling/data.json b/fixtures/anna_elga_no_cooling/data.json index 47fe95417..ef57ecfda 100644 --- a/fixtures/anna_elga_no_cooling/data.json +++ b/fixtures/anna_elga_no_cooling/data.json @@ -65,18 +65,42 @@ }, "3cb70739631c4d17a86b8b12e8a5161b": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "standaard" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "heating", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, "location": "c784ee9fdab44e1395b8dee7d7a497d5", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "home", @@ -104,6 +128,12 @@ "setpoint": 20.5, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" } } diff --git a/fixtures/anna_heatpump_cooling/data.json b/fixtures/anna_heatpump_cooling/data.json index 08e3a61ef..80501dc81 100644 --- a/fixtures/anna_heatpump_cooling/data.json +++ b/fixtures/anna_heatpump_cooling/data.json @@ -61,18 +61,42 @@ }, "3cb70739631c4d17a86b8b12e8a5161b": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "standaard" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "climate_mode": "heat_cool", "control_state": "cooling", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, "location": "c784ee9fdab44e1395b8dee7d7a497d5", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "home", @@ -102,6 +126,12 @@ "setpoint_low": 4.0, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" } } diff --git a/fixtures/anna_heatpump_cooling_fake_firmware/data.json b/fixtures/anna_heatpump_cooling_fake_firmware/data.json index b486ef51e..b14cce672 100644 --- a/fixtures/anna_heatpump_cooling_fake_firmware/data.json +++ b/fixtures/anna_heatpump_cooling_fake_firmware/data.json @@ -61,18 +61,42 @@ }, "3cb70739631c4d17a86b8b12e8a5161b": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "standaard" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "climate_mode": "heat_cool", "control_state": "cooling", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, "location": "c784ee9fdab44e1395b8dee7d7a497d5", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "home", @@ -102,6 +126,12 @@ "setpoint_low": 4.0, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" } } diff --git a/fixtures/anna_heatpump_heating/data.json b/fixtures/anna_heatpump_heating/data.json index c63972711..6ba9d7b06 100644 --- a/fixtures/anna_heatpump_heating/data.json +++ b/fixtures/anna_heatpump_heating/data.json @@ -67,18 +67,42 @@ }, "3cb70739631c4d17a86b8b12e8a5161b": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "standaard" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "heating", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, "location": "c784ee9fdab44e1395b8dee7d7a497d5", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "home", @@ -108,6 +132,12 @@ "setpoint_low": 20.5, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" } } diff --git a/fixtures/anna_loria_cooling_active/data.json b/fixtures/anna_loria_cooling_active/data.json index 1dadad338..931491ea8 100644 --- a/fixtures/anna_loria_cooling_active/data.json +++ b/fixtures/anna_loria_cooling_active/data.json @@ -1,19 +1,43 @@ { "582dfbdace4d4aeb832923ce7d1ddda0": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Winter", "Test " ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "cooling", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "location": "15da035090b847e7a21f93e08c015ebc", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "away", "vacation", @@ -41,6 +65,12 @@ "setpoint_low": 4.0, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "9ff0569b4984459fb243af64c0901894": { diff --git a/fixtures/anna_loria_driessens/data.json b/fixtures/anna_loria_driessens/data.json index ccac7bddf..a1a8920f6 100644 --- a/fixtures/anna_loria_driessens/data.json +++ b/fixtures/anna_loria_driessens/data.json @@ -20,6 +20,12 @@ }, "9fb768d699e44c7fb5cc50309dc4e7d4": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Verwarmen@9-23u", @@ -27,14 +33,32 @@ "VERWARMEN", "KOELEN" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "location": "fa70e08550c94de3a34feb27ecf31421", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "asleep", @@ -62,6 +86,12 @@ "setpoint_low": 20.0, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "a449cbc334ae4a5bb7f89064984b2906": { diff --git a/fixtures/anna_loria_heating_idle/data.json b/fixtures/anna_loria_heating_idle/data.json index 682cdc878..d2490f578 100644 --- a/fixtures/anna_loria_heating_idle/data.json +++ b/fixtures/anna_loria_heating_idle/data.json @@ -1,19 +1,43 @@ { "582dfbdace4d4aeb832923ce7d1ddda0": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Winter", "Test " ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "location": "15da035090b847e7a21f93e08c015ebc", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "away", "vacation", @@ -41,6 +65,12 @@ "setpoint_low": 20.5, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "9ff0569b4984459fb243af64c0901894": { diff --git a/fixtures/anna_p1/data.json b/fixtures/anna_p1/data.json index 5f4df3f00..0a15747c5 100644 --- a/fixtures/anna_p1/data.json +++ b/fixtures/anna_p1/data.json @@ -1,18 +1,42 @@ { "1e5e55b958ac445583602f767cb45942": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Thermostat schedule" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-500", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "location": "5b13651d79c4454684fd268850b1bff8", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "asleep", @@ -38,6 +62,12 @@ "setpoint": 19.0, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "36b937e44ad145bab165fa0fe99d742d": { diff --git a/fixtures/anna_v4/data.json b/fixtures/anna_v4/data.json index 742fad881..c18484a03 100644 --- a/fixtures/anna_v4/data.json +++ b/fixtures/anna_v4/data.json @@ -1,19 +1,43 @@ { "01b85360fdd243d0aaad4d6ac2a5ba7e": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Standaard", "Thuiswerken" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "heating", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "location": "eb5309212bf5407bb143e5bfa3b18aee", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -39,6 +63,12 @@ "setpoint": 20.5, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "0466eae8520144c78afb29628384edeb": { diff --git a/fixtures/anna_v4_dhw/data.json b/fixtures/anna_v4_dhw/data.json index b373166ba..a1fee82a7 100644 --- a/fixtures/anna_v4_dhw/data.json +++ b/fixtures/anna_v4_dhw/data.json @@ -1,19 +1,43 @@ { "01b85360fdd243d0aaad4d6ac2a5ba7e": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Standaard", "Thuiswerken" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "location": "eb5309212bf5407bb143e5bfa3b18aee", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -39,6 +63,12 @@ "setpoint": 20.5, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "0466eae8520144c78afb29628384edeb": { diff --git a/fixtures/anna_v4_no_tag/data.json b/fixtures/anna_v4_no_tag/data.json index 2c9a40c8c..c3d9fd07b 100644 --- a/fixtures/anna_v4_no_tag/data.json +++ b/fixtures/anna_v4_no_tag/data.json @@ -1,19 +1,43 @@ { "01b85360fdd243d0aaad4d6ac2a5ba7e": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Standaard", "Thuiswerken" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "heating", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "location": "eb5309212bf5407bb143e5bfa3b18aee", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -39,6 +63,12 @@ "setpoint": 20.5, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "0466eae8520144c78afb29628384edeb": { diff --git a/fixtures/anna_without_boiler_fw441/data.json b/fixtures/anna_without_boiler_fw441/data.json index 5dbecb4dd..b774a7700 100644 --- a/fixtures/anna_without_boiler_fw441/data.json +++ b/fixtures/anna_without_boiler_fw441/data.json @@ -1,19 +1,43 @@ { "7ffbb3ab4b6c4ab2915d7510f7bf8fe9": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Test", "Normaal" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, "location": "c34c6864216446528e95d88985e714cc", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "asleep", @@ -39,6 +63,12 @@ "setpoint": 19.0, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "a270735e4ccd45239424badc0578a2b1": { diff --git a/fixtures/m_adam_cooling/data.json b/fixtures/m_adam_cooling/data.json index 7baccf71d..79e21d828 100644 --- a/fixtures/m_adam_cooling/data.json +++ b/fixtures/m_adam_cooling/data.json @@ -213,6 +213,12 @@ }, "f2bf9048bef64cc5b6d5110154e33c81": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Badkamer", @@ -220,11 +226,29 @@ "Weekschema", "Test" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "climate_mode": "cool", "control_state": "cooling", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Living room", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -253,6 +277,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -262,6 +292,12 @@ }, "f871b8c4d63549319221e294e4f88074": { "active_preset": "vacation", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Badkamer", @@ -269,11 +305,29 @@ "Weekschema", "Test" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "cooling", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Bathroom", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "asleep", @@ -302,6 +356,12 @@ "1772a4ea304041adb83f357b751341ff" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", diff --git a/fixtures/m_adam_heating/data.json b/fixtures/m_adam_heating/data.json index a193884f1..7fcbc3ed4 100644 --- a/fixtures/m_adam_heating/data.json +++ b/fixtures/m_adam_heating/data.json @@ -218,6 +218,12 @@ }, "f2bf9048bef64cc5b6d5110154e33c81": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Badkamer", @@ -225,11 +231,29 @@ "Weekschema", "Test" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "preheating", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Living room", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -258,6 +282,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -267,6 +297,12 @@ }, "f871b8c4d63549319221e294e4f88074": { "active_preset": "vacation", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Badkamer", @@ -274,11 +310,29 @@ "Weekschema", "Test" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Bathroom", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "asleep", @@ -307,6 +361,12 @@ "1772a4ea304041adb83f357b751341ff" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", diff --git a/fixtures/m_adam_heating_off_schedule/data.json b/fixtures/m_adam_heating_off_schedule/data.json index 6c5a7f319..3af382e4e 100644 --- a/fixtures/m_adam_heating_off_schedule/data.json +++ b/fixtures/m_adam_heating_off_schedule/data.json @@ -218,6 +218,12 @@ }, "f2bf9048bef64cc5b6d5110154e33c81": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Badkamer", @@ -225,11 +231,29 @@ "Weekschema", "Test" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "climate_mode": "off", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Living room", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -258,6 +282,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -267,6 +297,12 @@ }, "f871b8c4d63549319221e294e4f88074": { "active_preset": "vacation", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "Badkamer", @@ -274,11 +310,29 @@ "Weekschema", "Test" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "off", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Bathroom", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "asleep", @@ -307,6 +361,12 @@ "1772a4ea304041adb83f357b751341ff" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", diff --git a/fixtures/m_adam_jip/data.json b/fixtures/m_adam_jip/data.json index cb3c2021c..a65d9ceb7 100644 --- a/fixtures/m_adam_jip/data.json +++ b/fixtures/m_adam_jip/data.json @@ -1,13 +1,37 @@ { "06aecb3d00354375924f50c47af36bd2": { "active_preset": "no_frost", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "climate_mode": "off", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Slaapkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 9.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -34,6 +58,12 @@ "356b65335e274d769c338223e7af9c33" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -43,14 +73,38 @@ }, "13228dab8ce04617af318a2888b3c548": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Woonkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "asleep", @@ -77,6 +131,12 @@ "833de10f269c4deab58fb9df69901b4e" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -285,14 +345,38 @@ }, "d27aede973b54be484f6842d1b2802ad": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Kinderkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 9.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -319,6 +403,12 @@ "d4496250d0e942cfa7aea3476e9070d5" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", @@ -352,14 +442,38 @@ }, "d58fec52899f4f1c92e4f8fad6d8c48c": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Logeerkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 9.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "no_frost", @@ -386,6 +500,12 @@ "1da4d325838e4ad8aac12177214505c9" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise", "zone_profiles": [ "active", diff --git a/fixtures/m_adam_multiple_devices_per_zone/data.json b/fixtures/m_adam_multiple_devices_per_zone/data.json index 842f63cff..0d9b61939 100644 --- a/fixtures/m_adam_multiple_devices_per_zone/data.json +++ b/fixtures/m_adam_multiple_devices_per_zone/data.json @@ -22,6 +22,12 @@ }, "08963fec7c53423ca5680aa4cb502c63": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -30,11 +36,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 14.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Badkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "asleep", "no_frost", @@ -59,10 +83,22 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "12493538af164a409c6a1c79e38afe1c": { "active_preset": "away", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -71,11 +107,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Bios", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 8.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "away", @@ -103,6 +157,12 @@ "a2c3583e0a6349358998b760cea82d2a" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "21f2b542c49845e6bb416884c55778d6": { @@ -128,14 +188,38 @@ }, "446ac08dd04d4eff8ac57489757b7314": { "active_preset": "no_frost", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "climate_mode": "heat", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Garage", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "asleep", @@ -159,6 +243,12 @@ ], "secondary": [] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "4a810418d5394b3f82727340b91ba740": { @@ -279,6 +369,12 @@ }, "82fa13f017d240daa0d0ea1775420f24": { "active_preset": "asleep", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -287,11 +383,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Jessie", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "home", "no_frost", @@ -317,6 +431,12 @@ "d3da73bde12a47d5a6b8f9dad971f2ec" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 11.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "90986d591dcd426cae3ec3e8111ff730": { @@ -434,6 +554,12 @@ }, "c50f167537524366a5af7aa3942feb1e": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "CV Roan", @@ -442,11 +568,29 @@ "Badkamer Schema", "CV Jessie" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "heating", "dev_class": "climate", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, "model": "ThermoZone", "name": "Woonkamer", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "preset_modes": [ "vacation", "asleep", @@ -474,6 +618,12 @@ "b310b72a0e354bfab43089919b9a88bf" ] }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" }, "cd0ddb54ef694e11ac18ed1cbce5dbbd": { diff --git a/fixtures/m_anna_heatpump_cooling/data.json b/fixtures/m_anna_heatpump_cooling/data.json index 9b421f792..721c8e72b 100644 --- a/fixtures/m_anna_heatpump_cooling/data.json +++ b/fixtures/m_anna_heatpump_cooling/data.json @@ -67,18 +67,42 @@ }, "3cb70739631c4d17a86b8b12e8a5161b": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "standaard" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "cooling", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, "location": "c784ee9fdab44e1395b8dee7d7a497d5", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "home", @@ -108,6 +132,12 @@ "setpoint_low": 20.5, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" } } diff --git a/fixtures/m_anna_heatpump_idle/data.json b/fixtures/m_anna_heatpump_idle/data.json index 4ba2db676..2cbac7cb1 100644 --- a/fixtures/m_anna_heatpump_idle/data.json +++ b/fixtures/m_anna_heatpump_idle/data.json @@ -67,18 +67,42 @@ }, "3cb70739631c4d17a86b8b12e8a5161b": { "active_preset": "home", + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, "available_schedules": [ "off", "standaard" ], + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, "climate_mode": "auto", "control_state": "idle", "dev_class": "thermostat", "firmware": "2018-02-08T11:15:53+01:00", "hardware": "6539-1301-5002", + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, "location": "c784ee9fdab44e1395b8dee7d7a497d5", "model": "ThermoTouch", "name": "Anna", + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "preset_modes": [ "no_frost", "home", @@ -108,6 +132,12 @@ "setpoint_low": 20.5, "upper_bound": 30.0 }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "vendor": "Plugwise" } } diff --git a/plugwise/constants.py b/plugwise/constants.py index d251f76ba..28d3df7d2 100644 --- a/plugwise/constants.py +++ b/plugwise/constants.py @@ -265,6 +265,22 @@ ] ACTIVE_ACTUATORS: Final[tuple[str, ...]] = get_args(ActuatorType) +PresetTemperatureType = Literal[ + "home_preset_temperature", + "asleep_preset_temperature", + "away_preset_temperature", + "vacation_preset_temperature", + "no_frost_preset_temperature", +] +PRESET_TEMPERATURES: Final[dict[PresetTemperatureType, str]] = { + "home_preset_temperature": "home", + "asleep_preset_temperature": "asleep", + "away_preset_temperature": "away", + "vacation_preset_temperature": "vacation", + "no_frost_preset_temperature": "no_frost", +} +PRESET_TEMPERATURE_RESOLUTION: Final[float] = 0.5 + ACTIVE_KEYS: Final[tuple[str, ...]] = ( "control_state", "lower_bound", @@ -584,6 +600,11 @@ class GwEntityData(TypedDict, total=False): # Presets: active_preset: str | None preset_modes: list[str] | None + home_preset_temperature: ActuatorData + asleep_preset_temperature: ActuatorData + away_preset_temperature: ActuatorData + vacation_preset_temperature: ActuatorData + no_frost_preset_temperature: ActuatorData # Schedules: available_schedules: list[str] select_schedule: str diff --git a/plugwise/data.py b/plugwise/data.py index dd03b8624..da4235fe2 100644 --- a/plugwise/data.py +++ b/plugwise/data.py @@ -13,6 +13,8 @@ MAX_SETPOINT, MIN_SETPOINT, OFF, + PRESET_TEMPERATURE_RESOLUTION, + PRESET_TEMPERATURES, ActuatorData, GwEntityData, ) @@ -273,6 +275,9 @@ def _climate_data(self, location_id: str, entity: GwEntityData) -> None: if presets := self._presets(loc_id): entity["preset_modes"] = list(presets) entity["active_preset"] = self._preset(loc_id) + # Only a zone's own rule can be edited without touching other zones + if self._preset_rule_id(loc_id) is not None: + self._preset_temperatures(presets, entity) # Schedule entity["available_schedules"] = [OFF] @@ -300,6 +305,23 @@ def _climate_data(self, location_id: str, entity: GwEntityData) -> None: loc_id, avail_schedules, sel_schedule, entity ) + def _preset_temperatures( + self, presets: dict[str, list[float]], entity: GwEntityData + ) -> None: + """Helper-function for _climate_data(). + + Add the heating setpoint of each preset as an adjustable value. + """ + for key, preset in PRESET_TEMPERATURES.items(): + if preset in presets: + entity[key] = ActuatorData( + lower_bound=MIN_SETPOINT, + resolution=PRESET_TEMPERATURE_RESOLUTION, + setpoint=presets[preset][0], + upper_bound=MAX_SETPOINT, + ) + self._count += 4 + def check_reg_mode(self, mode: str) -> bool: """Helper-function for device_data_climate().""" gateway = self.gw_entities[self._gateway_id] diff --git a/plugwise/helper.py b/plugwise/helper.py index 2b81b877e..e51f67ee7 100644 --- a/plugwise/helper.py +++ b/plugwise/helper.py @@ -938,15 +938,28 @@ def _preset_rule_ids(self, loc_id: str) -> list[str]: Read only the preset rule attached to loc_id, so each zone gets its own presets. Fall back to all preset rules when none or several are attached. """ + if (rule_id := self._preset_rule_id(loc_id)) is not None: + return [rule_id] + + return list(self._all_preset_rules(loc_id)) + + def _preset_rule_id(self, loc_id: str) -> str | None: + """Return the id of the one preset rule attached to loc_id, or None.""" + own = [ + rule_id + for rule_id, data in self._all_preset_rules(loc_id).items() + if data["location"] == loc_id + ] + return own[0] if len(own) == 1 else None + + def _all_preset_rules(self, loc_id: str) -> dict[str, dict[str, str]]: + """Collect all preset rules, by template tag or else by name.""" tag_1 = "zone_setpoint_and_state_based_on_preset" tag_2 = "Thermostat presets" if not (rule_ids := self._rule_ids_by_tag(tag_1, loc_id)): rule_ids = self._rule_ids_by_name(tag_2, loc_id) - own = [ - rule_id for rule_id, data in rule_ids.items() if data["location"] == loc_id - ] - return own if len(own) == 1 else list(rule_ids) + return rule_ids def _rule_ids_by_name(self, name: str, loc_id: str) -> dict[str, dict[str, str]]: """Helper-function for _presets(). diff --git a/plugwise/smile.py b/plugwise/smile.py index 0aea89a58..2a71dc603 100644 --- a/plugwise/smile.py +++ b/plugwise/smile.py @@ -21,6 +21,7 @@ NONE, NOTIFICATIONS, OFF, + PRESET_TEMPERATURES, RULES, STATE_OFF, STATE_ON, @@ -170,7 +171,16 @@ async def set_number( key: str, temperature: float, ) -> None: - """Set the boiler- or DHW-setpoint on the Central Heating boiler or the temperature-offset on a Thermostat.""" + """Set the boiler- or DHW-setpoint on the Central Heating boiler, the temperature-offset on a Thermostat or a preset temperature.""" + if key in PRESET_TEMPERATURES: + # Anna keeps its climate data on the thermostat, Adam on the zone + loc_id = dev_id + if (entity := self.gw_entities.get(dev_id)) is not None: + loc_id = entity.get("location", dev_id) + preset = PRESET_TEMPERATURES[key] + await self.set_preset_temperature(loc_id, preset, temperature) + return + match key: case "temperature_offset": await self.set_offset(dev_id, temperature) @@ -211,6 +221,48 @@ async def set_offset(self, dev_id: str, offset: float) -> None: uri = f"{APPLIANCES};id={dev_id}/offset;type=temperature_offset" await self.call_request(uri, method="put", data=data) + async def set_preset_temperature( + self, loc_id: str, preset: str, temperature: float + ) -> None: + """Set the heating setpoint of one preset in the zone's preset rule. + + The gateway re-applies the zone's active preset, which resets a manual setpoint. + """ + if (rule_id := self._preset_rule_id(loc_id)) is None: + raise PlugwiseError("Plugwise: this zone has no preset rule of its own") + + locator = f'rule[@id="{rule_id}"]/directives/when[@preset="{preset}"]/then' + if (then := self._domain_objects.find(locator)) is None: + raise PlugwiseError(f"Plugwise: invalid preset {preset}") + if not MIN_SETPOINT <= temperature <= MAX_SETPOINT: + raise PlugwiseError( + f"Plugwise: preset temperature must be between {MIN_SETPOINT} and {MAX_SETPOINT}" + ) + + # The gateway replaces the whole directive set, so every preset is sent. + heating = str(temperature) + directives = "" + for when in self._domain_objects.findall( + f'rule[@id="{rule_id}"]/directives/when' + ): + attrs = dict(when.find("then").attrib) + if when.get("preset") == preset: + attrs["heating_setpoint"] = heating + then_attrs = " ".join(f'{key}="{value}"' for key, value in attrs.items()) + directives += ( + f'' + ) + + data = ( + "" + f"" + f"{directives}" + "" + "" + ) + await self.call_request(f"{RULES};id={rule_id}", method="put", data=data) + then.set("heating_setpoint", heating) + async def set_preset(self, loc_id: str, preset: str) -> None: """Set the given Preset on the relevant Thermostat - from LOCATIONS.""" if (presets := self._presets(loc_id)) is None: diff --git a/tests/data/adam/adam_bad_thermostat.json b/tests/data/adam/adam_bad_thermostat.json index 2ef25b842..eb4b593de 100644 --- a/tests/data/adam/adam_bad_thermostat.json +++ b/tests/data/adam/adam_bad_thermostat.json @@ -60,6 +60,36 @@ "vacation", "no_frost" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "sensors": { "temperature": 20.3 diff --git a/tests/data/adam/adam_heatpump_cooling.json b/tests/data/adam/adam_heatpump_cooling.json index 9e4cdda6b..9ccd48c2e 100644 --- a/tests/data/adam/adam_heatpump_cooling.json +++ b/tests/data/adam/adam_heatpump_cooling.json @@ -19,6 +19,36 @@ "asleep", "home" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "select_zone_profile": "passive", "sensors": { @@ -158,6 +188,36 @@ "home", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "select_zone_profile": "passive", "sensors": { @@ -286,6 +346,36 @@ "asleep", "away" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Werkdag schema", "select_zone_profile": "passive", "sensors": { @@ -446,6 +536,36 @@ "asleep", "away" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Werkdag schema", "select_zone_profile": "passive", "sensors": { @@ -492,6 +612,36 @@ "asleep", "home" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "select_zone_profile": "passive", "sensors": { @@ -557,6 +707,36 @@ "away", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "select_zone_profile": "passive", "sensors": { @@ -623,6 +803,36 @@ "home", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Werkdag schema", "select_zone_profile": "active", "sensors": { @@ -669,6 +879,36 @@ "away", "home" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "select_zone_profile": "active", "sensors": { @@ -813,6 +1053,36 @@ "away", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "select_zone_profile": "passive", "sensors": { @@ -929,6 +1199,36 @@ "home", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Werkdag schema", "select_zone_profile": "active", "sensors": { diff --git a/tests/data/adam/adam_jip.json b/tests/data/adam/adam_jip.json index af46dd452..cc893b932 100644 --- a/tests/data/adam/adam_jip.json +++ b/tests/data/adam/adam_jip.json @@ -16,6 +16,36 @@ "away", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 9.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "select_zone_profile": "active", "sensors": { @@ -59,6 +89,36 @@ "vacation", "no_frost" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "select_zone_profile": "active", "sensors": { @@ -301,6 +361,36 @@ "away", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 9.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "select_zone_profile": "active", "sensors": { @@ -368,6 +458,36 @@ "away", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 13.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 9.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "select_zone_profile": "active", "sensors": { diff --git a/tests/data/adam/adam_multiple_devices_per_zone.json b/tests/data/adam/adam_multiple_devices_per_zone.json index c57f3da41..ec7f3008a 100644 --- a/tests/data/adam/adam_multiple_devices_per_zone.json +++ b/tests/data/adam/adam_multiple_devices_per_zone.json @@ -42,6 +42,36 @@ "home", "vacation" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 14.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Badkamer Schema", "sensors": { "temperature": 18.9 @@ -83,6 +113,36 @@ "no_frost", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 8.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "sensors": { "electricity_consumed": 0.0, @@ -148,6 +208,36 @@ "vacation", "no_frost" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "sensors": { "temperature": 15.6 @@ -304,6 +394,36 @@ "vacation", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 11.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "CV Jessie", "sensors": { "temperature": 17.2 @@ -459,6 +579,36 @@ "away", "home" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "select_schedule": "GF7 Woonkamer", "sensors": { "electricity_consumed": 35.6, diff --git a/tests/data/adam/adam_onoff_cooling_fake_firmware.json b/tests/data/adam/adam_onoff_cooling_fake_firmware.json index bf2f95f33..3aefe342a 100644 --- a/tests/data/adam/adam_onoff_cooling_fake_firmware.json +++ b/tests/data/adam/adam_onoff_cooling_fake_firmware.json @@ -108,6 +108,36 @@ "home", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Werkdag schema", "select_zone_profile": "active", "sensors": { diff --git a/tests/data/adam/adam_plus_anna.json b/tests/data/adam/adam_plus_anna.json index b561eb69c..c88313808 100644 --- a/tests/data/adam/adam_plus_anna.json +++ b/tests/data/adam/adam_plus_anna.json @@ -17,6 +17,36 @@ "vacation", "no_frost" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Weekschema", "sensors": { "electricity_consumed": 74.2, diff --git a/tests/data/adam/adam_plus_anna_new.json b/tests/data/adam/adam_plus_anna_new.json index 11b151c6d..b68b4b42e 100644 --- a/tests/data/adam/adam_plus_anna_new.json +++ b/tests/data/adam/adam_plus_anna_new.json @@ -321,6 +321,36 @@ "home", "away" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Weekschema", "select_zone_profile": "active", "sensors": { @@ -370,6 +400,36 @@ "home", "away" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "select_zone_profile": "passive", "sensors": { diff --git a/tests/data/adam/adam_plus_anna_new_regulation_off.json b/tests/data/adam/adam_plus_anna_new_regulation_off.json index d6712ed4f..d83116c60 100644 --- a/tests/data/adam/adam_plus_anna_new_regulation_off.json +++ b/tests/data/adam/adam_plus_anna_new_regulation_off.json @@ -273,6 +273,36 @@ "asleep", "away" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "select_zone_profile": "active", "sensors": { @@ -320,6 +350,36 @@ "home", "away" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "select_zone_profile": "passive", "sensors": { diff --git a/tests/data/adam/adam_zone_per_device.json b/tests/data/adam/adam_zone_per_device.json index aa6a5476d..aa1e69c03 100644 --- a/tests/data/adam/adam_zone_per_device.json +++ b/tests/data/adam/adam_zone_per_device.json @@ -42,6 +42,36 @@ "home", "vacation" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 14.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Badkamer Schema", "sensors": { "temperature": 18.8 @@ -84,6 +114,36 @@ "no_frost", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 8.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "sensors": { "electricity_consumed": 0.0, @@ -149,6 +209,36 @@ "vacation", "no_frost" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "sensors": { "temperature": 15.6 @@ -305,6 +395,36 @@ "vacation", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 11.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "CV Jessie", "sensors": { "temperature": 17.1 @@ -460,6 +580,36 @@ "away", "home" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 12.0, + "upper_bound": 30.0 + }, "select_schedule": "GF7 Woonkamer", "sensors": { "electricity_consumed": 35.8, diff --git a/tests/data/anna/anna_elga_2.json b/tests/data/anna/anna_elga_2.json index a2a591f4d..3a223a728 100644 --- a/tests/data/anna/anna_elga_2.json +++ b/tests/data/anna/anna_elga_2.json @@ -54,6 +54,36 @@ "home", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Thermostat schedule", "sensors": { "cooling_activation_outdoor_temperature": 24.0, diff --git a/tests/data/anna/anna_elga_2_cooling.json b/tests/data/anna/anna_elga_2_cooling.json index 4417929a1..162ed5ad1 100644 --- a/tests/data/anna/anna_elga_2_cooling.json +++ b/tests/data/anna/anna_elga_2_cooling.json @@ -61,6 +61,36 @@ "home", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Thermostat schedule", "sensors": { "cooling_activation_outdoor_temperature": 26.0, diff --git a/tests/data/anna/anna_elga_2_schedule_off.json b/tests/data/anna/anna_elga_2_schedule_off.json index 19622a983..bd7cf1057 100644 --- a/tests/data/anna/anna_elga_2_schedule_off.json +++ b/tests/data/anna/anna_elga_2_schedule_off.json @@ -61,6 +61,36 @@ "home", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "sensors": { "cooling_activation_outdoor_temperature": 26.0, diff --git a/tests/data/anna/anna_elga_no_cooling.json b/tests/data/anna/anna_elga_no_cooling.json index ffc9aa126..a9abd244d 100644 --- a/tests/data/anna/anna_elga_no_cooling.json +++ b/tests/data/anna/anna_elga_no_cooling.json @@ -84,6 +84,36 @@ "asleep", "vacation" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "standaard", "sensors": { "cooling_activation_outdoor_temperature": 21.0, diff --git a/tests/data/anna/anna_heatpump_cooling.json b/tests/data/anna/anna_heatpump_cooling.json index ba7456870..f7689bfe9 100644 --- a/tests/data/anna/anna_heatpump_cooling.json +++ b/tests/data/anna/anna_heatpump_cooling.json @@ -80,6 +80,36 @@ "asleep", "vacation" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "sensors": { "cooling_activation_outdoor_temperature": 21.0, diff --git a/tests/data/anna/anna_heatpump_cooling_fake_firmware.json b/tests/data/anna/anna_heatpump_cooling_fake_firmware.json index 799f50295..afd7587a3 100644 --- a/tests/data/anna/anna_heatpump_cooling_fake_firmware.json +++ b/tests/data/anna/anna_heatpump_cooling_fake_firmware.json @@ -80,6 +80,36 @@ "asleep", "vacation" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "sensors": { "cooling_activation_outdoor_temperature": 21.0, diff --git a/tests/data/anna/anna_heatpump_heating.json b/tests/data/anna/anna_heatpump_heating.json index a54846d1d..6b21abfd9 100644 --- a/tests/data/anna/anna_heatpump_heating.json +++ b/tests/data/anna/anna_heatpump_heating.json @@ -86,6 +86,36 @@ "asleep", "vacation" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 21.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "standaard", "sensors": { "cooling_activation_outdoor_temperature": 21.0, diff --git a/tests/data/anna/anna_loria_cooling_active.json b/tests/data/anna/anna_loria_cooling_active.json index 69084fbb4..29555a61d 100644 --- a/tests/data/anna/anna_loria_cooling_active.json +++ b/tests/data/anna/anna_loria_cooling_active.json @@ -21,6 +21,36 @@ "home", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.5, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Winter", "sensors": { "illuminance": 45.0, diff --git a/tests/data/anna/anna_loria_driessens.json b/tests/data/anna/anna_loria_driessens.json index cbf087e31..d98e4a806 100644 --- a/tests/data/anna/anna_loria_driessens.json +++ b/tests/data/anna/anna_loria_driessens.json @@ -42,6 +42,36 @@ "away", "home" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, "select_schedule": "Verwarmen@9-23u", "sensors": { "illuminance": 5.5, diff --git a/tests/data/anna/anna_loria_heating_idle.json b/tests/data/anna/anna_loria_heating_idle.json index 9938c2694..06e56a82e 100644 --- a/tests/data/anna/anna_loria_heating_idle.json +++ b/tests/data/anna/anna_loria_heating_idle.json @@ -21,6 +21,36 @@ "home", "asleep" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.5, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Winter", "sensors": { "illuminance": 45.0, diff --git a/tests/data/anna/anna_p1.json b/tests/data/anna/anna_p1.json index b146f8a07..5b3b8a1fe 100644 --- a/tests/data/anna/anna_p1.json +++ b/tests/data/anna/anna_p1.json @@ -20,6 +20,36 @@ "vacation", "no_frost" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Thermostat schedule", "sensors": { "illuminance": 2.0, diff --git a/tests/data/anna/anna_v4.json b/tests/data/anna/anna_v4.json index 8f8ae8d59..5e9b6ce2c 100644 --- a/tests/data/anna/anna_v4.json +++ b/tests/data/anna/anna_v4.json @@ -21,6 +21,36 @@ "asleep", "home" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "sensors": { "illuminance": 60.0, diff --git a/tests/data/anna/anna_v4_dhw.json b/tests/data/anna/anna_v4_dhw.json index 724811234..efe242bb3 100644 --- a/tests/data/anna/anna_v4_dhw.json +++ b/tests/data/anna/anna_v4_dhw.json @@ -21,6 +21,36 @@ "asleep", "home" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "off", "sensors": { "illuminance": 60.0, diff --git a/tests/data/anna/anna_v4_no_tag.json b/tests/data/anna/anna_v4_no_tag.json index f215f24a7..ae7962e21 100644 --- a/tests/data/anna/anna_v4_no_tag.json +++ b/tests/data/anna/anna_v4_no_tag.json @@ -21,6 +21,36 @@ "asleep", "home" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 20.5, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 17.5, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 15.0, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Thuiswerken", "sensors": { "illuminance": 60.0, diff --git a/tests/data/anna/anna_without_boiler_fw441.json b/tests/data/anna/anna_without_boiler_fw441.json index 5dbecb4dd..291df63f1 100644 --- a/tests/data/anna/anna_without_boiler_fw441.json +++ b/tests/data/anna/anna_without_boiler_fw441.json @@ -21,6 +21,36 @@ "vacation", "home" ], + "home_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 19.0, + "upper_bound": 30.0 + }, + "asleep_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "away_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 16.0, + "upper_bound": 30.0 + }, + "vacation_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 18.5, + "upper_bound": 30.0 + }, + "no_frost_preset_temperature": { + "lower_bound": 4.0, + "resolution": 0.5, + "setpoint": 10.0, + "upper_bound": 30.0 + }, "select_schedule": "Normaal", "sensors": { "illuminance": 0.25, diff --git a/tests/test_adam.py b/tests/test_adam.py index 908e65e44..85d06a43e 100644 --- a/tests/test_adam.py +++ b/tests/test_adam.py @@ -1,5 +1,7 @@ """Test Plugwise module Adam related functionality.""" +from unittest.mock import patch + import pytest from .test_init import _LOGGER, TestPlugwise, pw_exceptions @@ -47,7 +49,7 @@ async def test_connect_adam_plus_anna_new(self): test_items = await self.device_test(api, "2025-10-12 00:00:01", testdata) assert api.gateway_id == "da224107914542988a88561b4452b0f6" - assert self.entity_items == 235 + assert self.entity_items == 275 assert test_items == self.entity_items assert self.entity_list == [ "da224107914542988a88561b4452b0f6", @@ -75,6 +77,31 @@ async def test_connect_adam_plus_anna_new(self): bathroom = api._smile_api._presets("f871b8c4d63549319221e294e4f88074") assert living_room["home"] == [19.0, 22.0] assert bathroom["home"] == [18.0, 22.0] + # pylint: disable-next=protected-access + assert len(api._smile_api._preset_rule_ids("no_such_zone")) == 2 + + assert await self.tinker_preset_temperature( + api, "f2bf9048bef64cc5b6d5110154e33c81" + ) + # pylint: disable-next=protected-access + living_room = api._smile_api._presets("f2bf9048bef64cc5b6d5110154e33c81") + assert living_room["home"] == [20.5, 22.0] + # The gateway replaces the whole directive set, so all presets must be sent + with patch.object( + # pylint: disable-next=protected-access + api._smile_api, + "call_request", + # pylint: disable-next=protected-access + wraps=api._smile_api.call_request, + ) as spy: + await api.set_number( + "f2bf9048bef64cc5b6d5110154e33c81", "away_preset_temperature", 16.0 + ) + sent = spy.call_args.kwargs["data"] + assert sent.count(" Date: Mon, 26 Oct 2026 16:41:12 +0100 Subject: [PATCH 3/7] Validate and escape preset rule writes - set_preset_temperature() raises PlugwiseError when a preset rule has a without a , and writes nothing. - Preset writes keep every attribute of the rule and escape the values. --- plugwise/smile.py | 18 ++++++++++++++---- tests/test_adam.py | 25 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/plugwise/smile.py b/plugwise/smile.py index 2a71dc603..42d6c79e7 100644 --- a/plugwise/smile.py +++ b/plugwise/smile.py @@ -8,6 +8,7 @@ from collections.abc import Awaitable, Callable import datetime as dt from typing import Any, cast +from xml.sax.saxutils import quoteattr from plugwise.constants import ( ALLOWED_ZONE_PROFILES, @@ -38,6 +39,11 @@ from munch import Munch +def _xml_attrs(attrs: dict[str, str]) -> str: + """Return XML attributes, with escaped values.""" + return " ".join(f"{key}={quoteattr(value)}" for key, value in attrs.items()) + + def model_to_switch_items(model: str, state: str, switch: Munch) -> tuple[str, Munch]: """Translate state and switch attributes based on model name. @@ -245,12 +251,16 @@ async def set_preset_temperature( for when in self._domain_objects.findall( f'rule[@id="{rule_id}"]/directives/when' ): - attrs = dict(when.find("then").attrib) + if (when_then := when.find("then")) is None: + raise PlugwiseError( + f"Plugwise: preset rule {rule_id} has a switch point without settings" + ) + then_attrs = dict(when_then.attrib) if when.get("preset") == preset: - attrs["heating_setpoint"] = heating - then_attrs = " ".join(f'{key}="{value}"' for key, value in attrs.items()) + then_attrs["heating_setpoint"] = heating directives += ( - f'' + f"" + f"" ) data = ( diff --git a/tests/test_adam.py b/tests/test_adam.py index 85d06a43e..364db0a98 100644 --- a/tests/test_adam.py +++ b/tests/test_adam.py @@ -103,6 +103,31 @@ async def test_connect_adam_plus_anna_new(self): assert 'heating_setpoint="16.0"' in sent assert not await self.tinker_preset_temperature(api, "no_such_zone") + # A preset write keeps every attribute and escapes the values + # pylint: disable-next=protected-access + tree = api._smile_api._domain_objects + living_rule = 'rule[@id="021e3f453589448e891d29f195fbcaf0"]/directives/when' + tree.find(living_rule).set("presence", "a&b") + with patch.object( + # pylint: disable-next=protected-access + api._smile_api, + "call_request", + # pylint: disable-next=protected-access + wraps=api._smile_api.call_request, + ) as spy: + await api.set_number( + "f2bf9048bef64cc5b6d5110154e33c81", "away_preset_temperature", 16.0 + ) + assert 'presence="a&b"' in spy.call_args.kwargs["data"] + + # A preset rule with an incomplete switch point is not written + bathroom_rule = 'rule[@id="91946f89120a44139959d6739b914679"]/directives/when' + tree.find(bathroom_rule).remove(tree.find(f"{bathroom_rule}/then")) + with pytest.raises(pw_exceptions.PlugwiseError): + await api.set_number( + "f871b8c4d63549319221e294e4f88074", "home_preset_temperature", 19.0 + ) + result = await self.tinker_thermostat( api, "f2bf9048bef64cc5b6d5110154e33c81", From 404b610e303ed71a7394d7b49ea3b589f4960310 Mon Sep 17 00:00:00 2001 From: Mart van Male Date: Mon, 26 Oct 2026 17:22:59 +0100 Subject: [PATCH 4/7] Serialize preset temperature writes --- plugwise/smile.py | 52 +++++++++++++++++++++++++--------------------- tests/test_adam.py | 21 +++++++++++++++++++ 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/plugwise/smile.py b/plugwise/smile.py index 42d6c79e7..3564bdb83 100644 --- a/plugwise/smile.py +++ b/plugwise/smile.py @@ -5,6 +5,7 @@ from __future__ import annotations +import asyncio from collections.abc import Awaitable, Callable import datetime as dt from typing import Any, cast @@ -93,6 +94,7 @@ def __init__( self._schedule_old_states = _schedule_old_states self.smile = smile self.therms_with_offset_func: list[str] = [] + self._preset_lock = asyncio.Lock() @property def cooling_present(self) -> bool: @@ -246,32 +248,34 @@ async def set_preset_temperature( ) # The gateway replaces the whole directive set, so every preset is sent. - heating = str(temperature) - directives = "" - for when in self._domain_objects.findall( - f'rule[@id="{rule_id}"]/directives/when' - ): - if (when_then := when.find("then")) is None: - raise PlugwiseError( - f"Plugwise: preset rule {rule_id} has a switch point without settings" + # The lock keeps a concurrent write from resending a stale value for another preset. + async with self._preset_lock: + heating = str(temperature) + directives = "" + for when in self._domain_objects.findall( + f'rule[@id="{rule_id}"]/directives/when' + ): + if (when_then := when.find("then")) is None: + raise PlugwiseError( + f"Plugwise: preset rule {rule_id} has a switch point without settings" + ) + then_attrs = dict(when_then.attrib) + if when.get("preset") == preset: + then_attrs["heating_setpoint"] = heating + directives += ( + f"" + f"" ) - then_attrs = dict(when_then.attrib) - if when.get("preset") == preset: - then_attrs["heating_setpoint"] = heating - directives += ( - f"" - f"" - ) - data = ( - "" - f"" - f"{directives}" - "" - "" - ) - await self.call_request(f"{RULES};id={rule_id}", method="put", data=data) - then.set("heating_setpoint", heating) + data = ( + "" + f"" + f"{directives}" + "" + "" + ) + await self.call_request(f"{RULES};id={rule_id}", method="put", data=data) + then.set("heating_setpoint", heating) async def set_preset(self, loc_id: str, preset: str) -> None: """Set the given Preset on the relevant Thermostat - from LOCATIONS.""" diff --git a/tests/test_adam.py b/tests/test_adam.py index 364db0a98..e8b14bae7 100644 --- a/tests/test_adam.py +++ b/tests/test_adam.py @@ -1,5 +1,6 @@ """Test Plugwise module Adam related functionality.""" +import asyncio from unittest.mock import patch import pytest @@ -120,6 +121,26 @@ async def test_connect_adam_plus_anna_new(self): ) assert 'presence="a&b"' in spy.call_args.kwargs["data"] + # Simultaneous preset writes on one zone keep both changes + with patch.object( + # pylint: disable-next=protected-access + api._smile_api, + "call_request", + # pylint: disable-next=protected-access + wraps=api._smile_api.call_request, + ) as spy: + await asyncio.gather( + api.set_number( + "f2bf9048bef64cc5b6d5110154e33c81", "home_preset_temperature", 21.0 + ), + api.set_number( + "f2bf9048bef64cc5b6d5110154e33c81", "away_preset_temperature", 15.5 + ), + ) + sent = spy.call_args.kwargs["data"] + assert 'heating_setpoint="21.0"' in sent + assert 'heating_setpoint="15.5"' in sent + # A preset rule with an incomplete switch point is not written bathroom_rule = 'rule[@id="91946f89120a44139959d6739b914679"]/directives/when' tree.find(bathroom_rule).remove(tree.find(f"{bathroom_rule}/then")) From 56fd2a25c430f9053bc0aa88894204164f62cf97 Mon Sep 17 00:00:00 2001 From: Mart van Male Date: Mon, 26 Oct 2026 18:34:53 +0100 Subject: [PATCH 5/7] Add preset cooling setpoints --- CHANGELOG.md | 2 +- fixtures/adam_heatpump_cooling/data.json | 150 ++++++++++++------ .../data.json | 15 +- fixtures/anna_elga_2/data.json | 15 +- fixtures/anna_elga_2_cooling/data.json | 15 +- fixtures/anna_elga_2_schedule_off/data.json | 15 +- fixtures/anna_heatpump_cooling/data.json | 15 +- .../data.json | 15 +- fixtures/anna_heatpump_heating/data.json | 15 +- fixtures/anna_loria_cooling_active/data.json | 15 +- fixtures/anna_loria_driessens/data.json | 15 +- fixtures/anna_loria_heating_idle/data.json | 15 +- fixtures/m_adam_cooling/data.json | 30 ++-- fixtures/m_anna_heatpump_cooling/data.json | 15 +- fixtures/m_anna_heatpump_idle/data.json | 15 +- plugwise/__init__.py | 5 +- plugwise/constants.py | 5 + plugwise/data.py | 28 +++- plugwise/legacy/smile.py | 1 + plugwise/smile.py | 34 ++-- scripts/manual_fixtures.py | 77 +++++++-- tests/data/adam/adam_heatpump_cooling.json | 150 ++++++++++++------ .../adam_onoff_cooling_fake_firmware.json | 15 +- tests/data/anna/anna_elga_2.json | 15 +- tests/data/anna/anna_elga_2_cooling.json | 15 +- tests/data/anna/anna_elga_2_schedule_off.json | 15 +- tests/data/anna/anna_heatpump_cooling.json | 15 +- .../anna_heatpump_cooling_fake_firmware.json | 15 +- tests/data/anna/anna_heatpump_heating.json | 15 +- .../data/anna/anna_loria_cooling_active.json | 15 +- tests/data/anna/anna_loria_driessens.json | 15 +- tests/data/anna/anna_loria_heating_idle.json | 15 +- tests/test_adam.py | 22 ++- tests/test_anna.py | 43 +++-- tests/test_init.py | 17 +- 35 files changed, 613 insertions(+), 281 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dffde73f..94f3bd809 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## Ongoing -- Add the heating setpoint of each preset as an adjustable value for every zone with its own preset rule. Changing one resets a manual setpoint on that zone to its active preset. +- Add the heating setpoint of each preset as an adjustable value for every zone with its own preset rule, and the cooling setpoint when the gateway has cooling. Changing one resets a manual setpoint on that zone to its active preset. - Each Adam zone now takes its presets from its own preset rule, not from the last preset rule on the gateway. - Fix setting changes after a timeout or a 504 error. The retry sent a read instead of the change, so the change was reported as done even when the gateway never got it. diff --git a/fixtures/adam_heatpump_cooling/data.json b/fixtures/adam_heatpump_cooling/data.json index 8a01e0f80..005e19dca 100644 --- a/fixtures/adam_heatpump_cooling/data.json +++ b/fixtures/adam_heatpump_cooling/data.json @@ -4,7 +4,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "available_schedules": [ @@ -16,7 +17,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.5, + "setpoint_high": 25.0, + "setpoint_low": 18.5, "upper_bound": 30.0 }, "climate_mode": "cool", @@ -25,7 +27,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.0, + "setpoint_high": 22.0, + "setpoint_low": 19.0, "upper_bound": 30.0 }, "model": "ThermoZone", @@ -33,7 +36,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -65,7 +69,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "vendor": "Plugwise", @@ -173,7 +178,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "available_schedules": [ @@ -185,7 +191,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.5, + "setpoint_high": 25.0, + "setpoint_low": 18.5, "upper_bound": 30.0 }, "climate_mode": "cool", @@ -194,7 +201,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "model": "ThermoZone", @@ -202,7 +210,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -234,7 +243,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "vendor": "Plugwise", @@ -331,7 +341,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 23.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -343,7 +354,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 25.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -352,7 +364,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 22.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "model": "ThermoZone", @@ -360,7 +373,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -391,7 +405,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "vendor": "Plugwise", @@ -521,7 +536,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 23.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -533,7 +549,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 25.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -542,7 +559,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 22.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "model": "ThermoZone", @@ -550,7 +568,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -582,7 +601,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "vendor": "Plugwise", @@ -597,7 +617,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "available_schedules": [ @@ -609,7 +630,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.5, + "setpoint_high": 25.0, + "setpoint_low": 18.5, "upper_bound": 30.0 }, "climate_mode": "cool", @@ -618,7 +640,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.0, + "setpoint_high": 22.0, + "setpoint_low": 20.0, "upper_bound": 30.0 }, "model": "ThermoZone", @@ -626,7 +649,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -657,7 +681,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "vendor": "Plugwise", @@ -692,7 +717,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "available_schedules": [ @@ -704,7 +730,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.5, + "setpoint_high": 25.0, + "setpoint_low": 18.5, "upper_bound": 30.0 }, "climate_mode": "cool", @@ -713,7 +740,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "model": "ThermoZone", @@ -721,7 +749,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -753,7 +782,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "vendor": "Plugwise", @@ -788,7 +818,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 22.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -800,7 +831,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 25.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -809,7 +841,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 22.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "model": "ThermoZone", @@ -817,7 +850,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -849,7 +883,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "vendor": "Plugwise", @@ -864,7 +899,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.5, + "setpoint_high": 22.0, + "setpoint_low": 17.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -876,7 +912,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 25.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "climate_mode": "cool", @@ -885,7 +922,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "model": "ThermoZone", @@ -893,7 +931,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -925,7 +964,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "vendor": "Plugwise", @@ -1038,7 +1078,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.5, + "setpoint_high": 21.5, + "setpoint_low": 17.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -1050,7 +1091,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.5, + "setpoint_high": 25.0, + "setpoint_low": 17.5, "upper_bound": 30.0 }, "climate_mode": "cool", @@ -1059,7 +1101,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.5, + "setpoint_high": 22.0, + "setpoint_low": 17.5, "upper_bound": 30.0 }, "model": "ThermoZone", @@ -1067,7 +1110,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -1099,7 +1143,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "vendor": "Plugwise", @@ -1184,7 +1229,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 22.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -1196,7 +1242,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 25.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -1205,7 +1252,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 22.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "model": "ThermoZone", @@ -1213,7 +1261,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -1245,7 +1294,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "vendor": "Plugwise", diff --git a/fixtures/adam_onoff_cooling_fake_firmware/data.json b/fixtures/adam_onoff_cooling_fake_firmware/data.json index 3a39b6550..a81284da4 100644 --- a/fixtures/adam_onoff_cooling_fake_firmware/data.json +++ b/fixtures/adam_onoff_cooling_fake_firmware/data.json @@ -93,7 +93,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 22.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -105,7 +106,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 25.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -114,7 +116,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 22.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "model": "ThermoZone", @@ -122,7 +125,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -154,7 +158,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "vendor": "Plugwise", diff --git a/fixtures/anna_elga_2/data.json b/fixtures/anna_elga_2/data.json index 70a75ea33..0aaeb5ab7 100644 --- a/fixtures/anna_elga_2/data.json +++ b/fixtures/anna_elga_2/data.json @@ -38,7 +38,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 23.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "available_schedules": [ @@ -48,7 +49,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 25.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -59,7 +61,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.5, + "setpoint_high": 23.0, + "setpoint_low": 18.5, "upper_bound": 30.0 }, "location": "d3ce834534114348be628b61b26d9220", @@ -68,7 +71,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -103,7 +107,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 27.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "vendor": "Plugwise" diff --git a/fixtures/anna_elga_2_cooling/data.json b/fixtures/anna_elga_2_cooling/data.json index f3d4c6877..f1a401941 100644 --- a/fixtures/anna_elga_2_cooling/data.json +++ b/fixtures/anna_elga_2_cooling/data.json @@ -45,7 +45,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.0, + "setpoint_high": 23.0, + "setpoint_low": 19.0, "upper_bound": 30.0 }, "available_schedules": [ @@ -55,7 +56,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 25.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -66,7 +68,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.5, + "setpoint_high": 23.0, + "setpoint_low": 19.5, "upper_bound": 30.0 }, "location": "d3ce834534114348be628b61b26d9220", @@ -75,7 +78,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -110,7 +114,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 27.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "vendor": "Plugwise" diff --git a/fixtures/anna_elga_2_schedule_off/data.json b/fixtures/anna_elga_2_schedule_off/data.json index e3640ab4b..ffe061a6f 100644 --- a/fixtures/anna_elga_2_schedule_off/data.json +++ b/fixtures/anna_elga_2_schedule_off/data.json @@ -45,7 +45,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.0, + "setpoint_high": 23.0, + "setpoint_low": 19.0, "upper_bound": 30.0 }, "available_schedules": [ @@ -55,7 +56,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 25.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "climate_mode": "heat_cool", @@ -66,7 +68,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.5, + "setpoint_high": 23.0, + "setpoint_low": 19.5, "upper_bound": 30.0 }, "location": "d3ce834534114348be628b61b26d9220", @@ -75,7 +78,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -110,7 +114,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 27.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "vendor": "Plugwise" diff --git a/fixtures/anna_heatpump_cooling/data.json b/fixtures/anna_heatpump_cooling/data.json index 80501dc81..ab6f2c7e7 100644 --- a/fixtures/anna_heatpump_cooling/data.json +++ b/fixtures/anna_heatpump_cooling/data.json @@ -64,7 +64,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 24.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -74,7 +75,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.0, + "setpoint_high": 25.0, + "setpoint_low": 20.0, "upper_bound": 30.0 }, "climate_mode": "heat_cool", @@ -85,7 +87,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.0, + "setpoint_high": 22.0, + "setpoint_low": 21.0, "upper_bound": 30.0 }, "location": "c784ee9fdab44e1395b8dee7d7a497d5", @@ -94,7 +97,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -129,7 +133,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 28.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "vendor": "Plugwise" diff --git a/fixtures/anna_heatpump_cooling_fake_firmware/data.json b/fixtures/anna_heatpump_cooling_fake_firmware/data.json index b14cce672..9d9f3d84e 100644 --- a/fixtures/anna_heatpump_cooling_fake_firmware/data.json +++ b/fixtures/anna_heatpump_cooling_fake_firmware/data.json @@ -64,7 +64,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 24.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -74,7 +75,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.0, + "setpoint_high": 25.0, + "setpoint_low": 20.0, "upper_bound": 30.0 }, "climate_mode": "heat_cool", @@ -85,7 +87,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.0, + "setpoint_high": 22.0, + "setpoint_low": 21.0, "upper_bound": 30.0 }, "location": "c784ee9fdab44e1395b8dee7d7a497d5", @@ -94,7 +97,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -129,7 +133,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 28.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "vendor": "Plugwise" diff --git a/fixtures/anna_heatpump_heating/data.json b/fixtures/anna_heatpump_heating/data.json index 6ba9d7b06..8deef46d8 100644 --- a/fixtures/anna_heatpump_heating/data.json +++ b/fixtures/anna_heatpump_heating/data.json @@ -70,7 +70,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 24.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -80,7 +81,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.0, + "setpoint_high": 25.0, + "setpoint_low": 20.0, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -91,7 +93,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.0, + "setpoint_high": 22.0, + "setpoint_low": 21.0, "upper_bound": 30.0 }, "location": "c784ee9fdab44e1395b8dee7d7a497d5", @@ -100,7 +103,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -135,7 +139,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 28.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "vendor": "Plugwise" diff --git a/fixtures/anna_loria_cooling_active/data.json b/fixtures/anna_loria_cooling_active/data.json index 931491ea8..dbb5c9f7e 100644 --- a/fixtures/anna_loria_cooling_active/data.json +++ b/fixtures/anna_loria_cooling_active/data.json @@ -4,7 +4,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.5, + "setpoint_high": 25.5, + "setpoint_low": 19.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -15,7 +16,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 25.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -26,7 +28,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 20.5, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "location": "15da035090b847e7a21f93e08c015ebc", @@ -35,7 +38,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -68,7 +72,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 28.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "vendor": "Plugwise" diff --git a/fixtures/anna_loria_driessens/data.json b/fixtures/anna_loria_driessens/data.json index a1a8920f6..4fd7a56a8 100644 --- a/fixtures/anna_loria_driessens/data.json +++ b/fixtures/anna_loria_driessens/data.json @@ -23,7 +23,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.0, + "setpoint_high": 25.0, + "setpoint_low": 19.0, "upper_bound": 30.0 }, "available_schedules": [ @@ -36,7 +37,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 26.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -47,7 +49,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.0, + "setpoint_high": 21.0, + "setpoint_low": 20.0, "upper_bound": 30.0 }, "location": "fa70e08550c94de3a34feb27ecf31421", @@ -56,7 +59,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 30.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -89,7 +93,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 28.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "vendor": "Plugwise" diff --git a/fixtures/anna_loria_heating_idle/data.json b/fixtures/anna_loria_heating_idle/data.json index d2490f578..532006bda 100644 --- a/fixtures/anna_loria_heating_idle/data.json +++ b/fixtures/anna_loria_heating_idle/data.json @@ -4,7 +4,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.5, + "setpoint_high": 25.5, + "setpoint_low": 19.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -15,7 +16,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 25.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -26,7 +28,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 20.5, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "location": "15da035090b847e7a21f93e08c015ebc", @@ -35,7 +38,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -68,7 +72,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 28.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "vendor": "Plugwise" diff --git a/fixtures/m_adam_cooling/data.json b/fixtures/m_adam_cooling/data.json index 79e21d828..ba13d7634 100644 --- a/fixtures/m_adam_cooling/data.json +++ b/fixtures/m_adam_cooling/data.json @@ -216,7 +216,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 24.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "available_schedules": [ @@ -229,7 +230,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 25.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "climate_mode": "cool", @@ -238,7 +240,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.0, + "setpoint_high": 22.0, + "setpoint_low": 19.0, "upper_bound": 30.0 }, "model": "ThermoZone", @@ -246,7 +249,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -280,7 +284,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 28.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "vendor": "Plugwise", @@ -295,7 +300,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 12.0, + "setpoint_high": 24.0, + "setpoint_low": 12.0, "upper_bound": 30.0 }, "available_schedules": [ @@ -308,7 +314,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 25.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -317,7 +324,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "model": "ThermoZone", @@ -325,7 +333,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -359,7 +368,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 12.0, + "setpoint_high": 28.0, + "setpoint_low": 12.0, "upper_bound": 30.0 }, "vendor": "Plugwise", diff --git a/fixtures/m_anna_heatpump_cooling/data.json b/fixtures/m_anna_heatpump_cooling/data.json index 721c8e72b..a4f23c17b 100644 --- a/fixtures/m_anna_heatpump_cooling/data.json +++ b/fixtures/m_anna_heatpump_cooling/data.json @@ -70,7 +70,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 24.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -80,7 +81,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.0, + "setpoint_high": 25.0, + "setpoint_low": 20.0, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -91,7 +93,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.0, + "setpoint_high": 22.0, + "setpoint_low": 21.0, "upper_bound": 30.0 }, "location": "c784ee9fdab44e1395b8dee7d7a497d5", @@ -100,7 +103,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -135,7 +139,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 28.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "vendor": "Plugwise" diff --git a/fixtures/m_anna_heatpump_idle/data.json b/fixtures/m_anna_heatpump_idle/data.json index 2cbac7cb1..6cd2a5524 100644 --- a/fixtures/m_anna_heatpump_idle/data.json +++ b/fixtures/m_anna_heatpump_idle/data.json @@ -70,7 +70,8 @@ "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 24.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "available_schedules": [ @@ -80,7 +81,8 @@ "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.0, + "setpoint_high": 25.0, + "setpoint_low": 20.0, "upper_bound": 30.0 }, "climate_mode": "auto", @@ -91,7 +93,8 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.0, + "setpoint_high": 22.0, + "setpoint_low": 21.0, "upper_bound": 30.0 }, "location": "c784ee9fdab44e1395b8dee7d7a497d5", @@ -100,7 +103,8 @@ "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "preset_modes": [ @@ -135,7 +139,8 @@ "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 28.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "vendor": "Plugwise" diff --git a/plugwise/__init__.py b/plugwise/__init__.py index 7110fdf09..feb0b39d2 100644 --- a/plugwise/__init__.py +++ b/plugwise/__init__.py @@ -411,10 +411,11 @@ async def set_number( dev_id: str, key: str, temperature: float, + setpoint: str = "setpoint", ) -> None: - """Set the maximum boiler- or DHW-setpoint on the Central Heating boiler or the temperature-offset on a Thermostat.""" + """Set the maximum boiler- or DHW-setpoint on the Central Heating boiler, the temperature-offset on a Thermostat or a preset temperature.""" try: - await self._smile_api.set_number(dev_id, key, temperature) + await self._smile_api.set_number(dev_id, key, temperature, setpoint) except ConnectionFailedError as exc: raise ConnectionFailedError( f"Failed to set number '{key}': {str(exc)}" diff --git a/plugwise/constants.py b/plugwise/constants.py index 28d3df7d2..12c54b698 100644 --- a/plugwise/constants.py +++ b/plugwise/constants.py @@ -280,6 +280,11 @@ "no_frost_preset_temperature": "no_frost", } PRESET_TEMPERATURE_RESOLUTION: Final[float] = 0.5 +PRESET_SETPOINT_ATTRIBUTES: Final[dict[str, str]] = { + "setpoint": "heating_setpoint", + "setpoint_low": "heating_setpoint", + "setpoint_high": "cooling_setpoint", +} ACTIVE_KEYS: Final[tuple[str, ...]] = ( "control_state", diff --git a/plugwise/data.py b/plugwise/data.py index da4235fe2..e5989d2ae 100644 --- a/plugwise/data.py +++ b/plugwise/data.py @@ -310,17 +310,29 @@ def _preset_temperatures( ) -> None: """Helper-function for _climate_data(). - Add the heating setpoint of each preset as an adjustable value. + Add the setpoints of each preset as an adjustable value: the heating setpoint, + or with cooling present the heating (low) and cooling (high) setpoints. """ for key, preset in PRESET_TEMPERATURES.items(): if preset in presets: - entity[key] = ActuatorData( - lower_bound=MIN_SETPOINT, - resolution=PRESET_TEMPERATURE_RESOLUTION, - setpoint=presets[preset][0], - upper_bound=MAX_SETPOINT, - ) - self._count += 4 + heating, cooling = presets[preset] + if self._cooling_present: + entity[key] = ActuatorData( + lower_bound=MIN_SETPOINT, + resolution=PRESET_TEMPERATURE_RESOLUTION, + setpoint_high=cooling, + setpoint_low=heating, + upper_bound=MAX_SETPOINT, + ) + self._count += 5 + else: + entity[key] = ActuatorData( + lower_bound=MIN_SETPOINT, + resolution=PRESET_TEMPERATURE_RESOLUTION, + setpoint=heating, + upper_bound=MAX_SETPOINT, + ) + self._count += 4 def check_reg_mode(self, mode: str) -> bool: """Helper-function for device_data_climate().""" diff --git a/plugwise/legacy/smile.py b/plugwise/legacy/smile.py index 9118ff02b..841d95fb9 100644 --- a/plugwise/legacy/smile.py +++ b/plugwise/legacy/smile.py @@ -148,6 +148,7 @@ async def set_number( dev_id: str, key: str, temperature: float, + setpoint: str = "setpoint", ) -> None: """Set-function placeholder for legacy devices.""" diff --git a/plugwise/smile.py b/plugwise/smile.py index 3564bdb83..10bfffd0a 100644 --- a/plugwise/smile.py +++ b/plugwise/smile.py @@ -23,6 +23,7 @@ NONE, NOTIFICATIONS, OFF, + PRESET_SETPOINT_ATTRIBUTES, PRESET_TEMPERATURES, RULES, STATE_OFF, @@ -178,15 +179,19 @@ async def set_number( dev_id: str, key: str, temperature: float, + setpoint: str = "setpoint", ) -> None: - """Set the boiler- or DHW-setpoint on the Central Heating boiler, the temperature-offset on a Thermostat or a preset temperature.""" + """Set the boiler- or DHW-setpoint on the Central Heating boiler, the temperature-offset on a Thermostat or a preset temperature. + + For a preset temperature, setpoint picks the heating (setpoint, setpoint_low) or cooling (setpoint_high) value. + """ if key in PRESET_TEMPERATURES: - # Anna keeps its climate data on the thermostat, Adam on the zone - loc_id = dev_id - if (entity := self.gw_entities.get(dev_id)) is not None: - loc_id = entity.get("location", dev_id) + if (attribute := PRESET_SETPOINT_ATTRIBUTES.get(setpoint)) is None: + raise PlugwiseError(f"Plugwise: invalid preset setpoint {setpoint}") + # An Adam zone is its own location, an Anna thermostat has one + loc_id = self.gw_entities[dev_id].get("location", dev_id) preset = PRESET_TEMPERATURES[key] - await self.set_preset_temperature(loc_id, preset, temperature) + await self.set_preset_temperature(loc_id, preset, temperature, attribute) return match key: @@ -230,9 +235,13 @@ async def set_offset(self, dev_id: str, offset: float) -> None: await self.call_request(uri, method="put", data=data) async def set_preset_temperature( - self, loc_id: str, preset: str, temperature: float + self, + loc_id: str, + preset: str, + temperature: float, + attribute: str = "heating_setpoint", ) -> None: - """Set the heating setpoint of one preset in the zone's preset rule. + """Set the heating or cooling setpoint of one preset in the zone's preset rule. The gateway re-applies the zone's active preset, which resets a manual setpoint. """ @@ -240,7 +249,7 @@ async def set_preset_temperature( raise PlugwiseError("Plugwise: this zone has no preset rule of its own") locator = f'rule[@id="{rule_id}"]/directives/when[@preset="{preset}"]/then' - if (then := self._domain_objects.find(locator)) is None: + if self._domain_objects.find(locator) is None: raise PlugwiseError(f"Plugwise: invalid preset {preset}") if not MIN_SETPOINT <= temperature <= MAX_SETPOINT: raise PlugwiseError( @@ -250,7 +259,7 @@ async def set_preset_temperature( # The gateway replaces the whole directive set, so every preset is sent. # The lock keeps a concurrent write from resending a stale value for another preset. async with self._preset_lock: - heating = str(temperature) + value = str(temperature) directives = "" for when in self._domain_objects.findall( f'rule[@id="{rule_id}"]/directives/when' @@ -261,7 +270,7 @@ async def set_preset_temperature( ) then_attrs = dict(when_then.attrib) if when.get("preset") == preset: - then_attrs["heating_setpoint"] = heating + then_attrs[attribute] = value directives += ( f"" f"" @@ -275,7 +284,8 @@ async def set_preset_temperature( "" ) await self.call_request(f"{RULES};id={rule_id}", method="put", data=data) - then.set("heating_setpoint", heating) + for then in self._domain_objects.findall(locator): + then.set(attribute, value) async def set_preset(self, loc_id: str, preset: str) -> None: """Set the given Preset on the relevant Thermostat - from LOCATIONS.""" diff --git a/scripts/manual_fixtures.py b/scripts/manual_fixtures.py index 7d28cc01b..509d7dded 100755 --- a/scripts/manual_fixtures.py +++ b/scripts/manual_fixtures.py @@ -109,6 +109,20 @@ def json_writer(manual_name: str, output: dict) -> None: m_adam_cooling["f871b8c4d63549319221e294e4f88074"]["control_state"] = "cooling" m_adam_cooling["f871b8c4d63549319221e294e4f88074"]["climate_mode"] = "auto" +# With cooling present, each preset carries a heating (low) and cooling (high) setpoint +cooling_setpoints = { + "home_preset_temperature": 22.0, + "asleep_preset_temperature": 24.0, + "away_preset_temperature": 25.0, + "vacation_preset_temperature": 28.0, + "no_frost_preset_temperature": 30.0, +} +for zone in ("f2bf9048bef64cc5b6d5110154e33c81", "f871b8c4d63549319221e294e4f88074"): + for key, cooling in cooling_setpoints.items(): + preset = m_adam_cooling[zone][key] + preset["setpoint_low"] = preset.pop("setpoint") + preset["setpoint_high"] = cooling + # Go for da22 m_adam_cooling["da224107914542988a88561b4452b0f6"]["select_regulation_mode"] = "cooling" @@ -127,13 +141,15 @@ def json_writer(manual_name: str, output: dict) -> None: m_adam_cooling["056ee145a816487eaa69243c3280f8bf"]["binary_sensors"]["flame_state"] = ( False ) -m_adam_cooling["056ee145a816487eaa69243c3280f8bf"]["boiler_temperature"]["current"] = 19.0 +m_adam_cooling["056ee145a816487eaa69243c3280f8bf"]["boiler_temperature"]["current"] = ( + 19.0 +) m_adam_cooling["056ee145a816487eaa69243c3280f8bf"]["sensors"][ "intended_boiler_temperature" ] = 17.5 -m_adam_cooling["056ee145a816487eaa69243c3280f8bf"]["sensors"][ - "water_temperature" -] = 19.0 +m_adam_cooling["056ee145a816487eaa69243c3280f8bf"]["sensors"]["water_temperature"] = ( + 19.0 +) json_writer("m_adam_cooling", m_adam_cooling) @@ -141,6 +157,15 @@ def json_writer(manual_name: str, output: dict) -> None: m_adam_heating = m_adam_cooling.copy() +# Without cooling, each preset carries only the heating setpoint +for zone_id in ("f2bf9048bef64cc5b6d5110154e33c81", "f871b8c4d63549319221e294e4f88074"): + zone = m_adam_heating[zone_id] = dict(m_adam_heating[zone_id]) + for key in cooling_setpoints: + preset = dict(zone[key]) + preset["setpoint"] = preset.pop("setpoint_low") + preset.pop("setpoint_high") + zone[key] = preset + # Correct setpoint for "ad4838d7d35c4d6ea796ee12ae5aedf8" m_adam_heating["f2bf9048bef64cc5b6d5110154e33c81"]["thermostat"]["setpoint"] = 20.0 m_adam_heating["ad4838d7d35c4d6ea796ee12ae5aedf8"]["sensors"]["setpoint"] = 20.0 @@ -185,13 +210,15 @@ def json_writer(manual_name: str, output: dict) -> None: m_adam_heating["056ee145a816487eaa69243c3280f8bf"]["binary_sensors"]["flame_state"] = ( False ) -m_adam_heating["056ee145a816487eaa69243c3280f8bf"]["boiler_temperature"]["current"] = 37.0 +m_adam_heating["056ee145a816487eaa69243c3280f8bf"]["boiler_temperature"]["current"] = ( + 37.0 +) m_adam_heating["056ee145a816487eaa69243c3280f8bf"]["sensors"][ "intended_boiler_temperature" ] = 38.1 -m_adam_heating["056ee145a816487eaa69243c3280f8bf"]["sensors"][ - "water_temperature" -] = 37.0 +m_adam_heating["056ee145a816487eaa69243c3280f8bf"]["sensors"]["water_temperature"] = ( + 37.0 +) m_adam_heating["056ee145a816487eaa69243c3280f8bf"]["dhw_temperature"] = { "current": 37.0, "setpoint": 60.0, @@ -208,17 +235,25 @@ def json_writer(manual_name: str, output: dict) -> None: # Version with select_regulation = off and an active schedule m_adam_heating_off_schedule = m_adam_heating.copy() -# Updates for f2bf9048bef64cc5b6d5110154e33c81" +# Updates for f2bf9048bef64cc5b6d5110154e33c81" m_adam_heating_off_schedule["f2bf9048bef64cc5b6d5110154e33c81"]["climate_mode"] = "off" -m_adam_heating_off_schedule["f2bf9048bef64cc5b6d5110154e33c81"]["control_state"] = "idle" +m_adam_heating_off_schedule["f2bf9048bef64cc5b6d5110154e33c81"]["control_state"] = ( + "idle" +) # Go for e2f4 m_adam_heating_off_schedule["f871b8c4d63549319221e294e4f88074"]["climate_mode"] = "off" -m_adam_heating_off_schedule["f871b8c4d63549319221e294e4f88074"]["control_state"] = "idle" -m_adam_heating_off_schedule["f871b8c4d63549319221e294e4f88074"]["select_schedule"] = "Badkamer" +m_adam_heating_off_schedule["f871b8c4d63549319221e294e4f88074"]["control_state"] = ( + "idle" +) +m_adam_heating_off_schedule["f871b8c4d63549319221e294e4f88074"]["select_schedule"] = ( + "Badkamer" +) # Go for da22 -m_adam_heating_off_schedule["da224107914542988a88561b4452b0f6"]["select_regulation_mode"] = "off" +m_adam_heating_off_schedule["da224107914542988a88561b4452b0f6"][ + "select_regulation_mode" +] = "off" # Go for 056e m_adam_heating_off_schedule["056ee145a816487eaa69243c3280f8bf"]["binary_sensors"][ @@ -253,8 +288,12 @@ def json_writer(manual_name: str, output: dict) -> None: "cooling_state" ] = True -m_anna_heatpump_cooling["1cbf783bb11e4a7c8a6843dee3a86927"]["boiler_temperature"]["current"] = 22.7 -m_anna_heatpump_cooling["1cbf783bb11e4a7c8a6843dee3a86927"]["dhw_temperature"]["current"] = 41.5 +m_anna_heatpump_cooling["1cbf783bb11e4a7c8a6843dee3a86927"]["boiler_temperature"][ + "current" +] = 22.7 +m_anna_heatpump_cooling["1cbf783bb11e4a7c8a6843dee3a86927"]["dhw_temperature"][ + "current" +] = 41.5 m_anna_heatpump_cooling["1cbf783bb11e4a7c8a6843dee3a86927"]["sensors"][ "dhw_temperature" ] = 41.5 @@ -312,8 +351,12 @@ def json_writer(manual_name: str, output: dict) -> None: "cooling_state" ] = False -m_anna_heatpump_idle["1cbf783bb11e4a7c8a6843dee3a86927"]["boiler_temperature"]["current"] = 19.1 -m_anna_heatpump_idle["1cbf783bb11e4a7c8a6843dee3a86927"]["dhw_temperature"]["current"] = 46.3 +m_anna_heatpump_idle["1cbf783bb11e4a7c8a6843dee3a86927"]["boiler_temperature"][ + "current" +] = 19.1 +m_anna_heatpump_idle["1cbf783bb11e4a7c8a6843dee3a86927"]["dhw_temperature"][ + "current" +] = 46.3 m_anna_heatpump_idle["1cbf783bb11e4a7c8a6843dee3a86927"]["sensors"][ "intended_boiler_temperature" ] = 18.0 diff --git a/tests/data/adam/adam_heatpump_cooling.json b/tests/data/adam/adam_heatpump_cooling.json index 9ccd48c2e..01313001e 100644 --- a/tests/data/adam/adam_heatpump_cooling.json +++ b/tests/data/adam/adam_heatpump_cooling.json @@ -22,31 +22,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.0, + "setpoint_high": 22.0, + "setpoint_low": 19.0, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.5, + "setpoint_high": 25.0, + "setpoint_low": 18.5, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "off", @@ -191,31 +196,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.5, + "setpoint_high": 25.0, + "setpoint_low": 18.5, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "off", @@ -349,31 +359,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 22.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 23.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 25.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "Werkdag schema", @@ -539,31 +554,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 22.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 23.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 25.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "Werkdag schema", @@ -615,31 +635,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.0, + "setpoint_high": 22.0, + "setpoint_low": 20.0, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.5, + "setpoint_high": 25.0, + "setpoint_low": 18.5, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "off", @@ -710,31 +735,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.5, + "setpoint_high": 25.0, + "setpoint_low": 18.5, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "off", @@ -806,31 +836,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 22.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 22.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 25.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "Werkdag schema", @@ -882,31 +917,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 22.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.5, + "setpoint_high": 22.0, + "setpoint_low": 17.5, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 25.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "off", @@ -1056,31 +1096,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.5, + "setpoint_high": 22.0, + "setpoint_low": 17.5, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.5, + "setpoint_high": 21.5, + "setpoint_low": 17.5, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.5, + "setpoint_high": 25.0, + "setpoint_low": 17.5, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "off", @@ -1202,31 +1247,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 22.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 22.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 25.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "Werkdag schema", diff --git a/tests/data/adam/adam_onoff_cooling_fake_firmware.json b/tests/data/adam/adam_onoff_cooling_fake_firmware.json index 3aefe342a..6c26ff90b 100644 --- a/tests/data/adam/adam_onoff_cooling_fake_firmware.json +++ b/tests/data/adam/adam_onoff_cooling_fake_firmware.json @@ -111,31 +111,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 22.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 22.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.5, + "setpoint_high": 25.0, + "setpoint_low": 21.5, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 16.0, + "setpoint_high": 28.0, + "setpoint_low": 16.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "Werkdag schema", diff --git a/tests/data/anna/anna_elga_2.json b/tests/data/anna/anna_elga_2.json index 3a223a728..1b992d85a 100644 --- a/tests/data/anna/anna_elga_2.json +++ b/tests/data/anna/anna_elga_2.json @@ -57,31 +57,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.5, + "setpoint_high": 23.0, + "setpoint_low": 18.5, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 18.0, + "setpoint_high": 23.0, + "setpoint_low": 18.0, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 25.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 27.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "Thermostat schedule", diff --git a/tests/data/anna/anna_elga_2_cooling.json b/tests/data/anna/anna_elga_2_cooling.json index 162ed5ad1..5036b7aa2 100644 --- a/tests/data/anna/anna_elga_2_cooling.json +++ b/tests/data/anna/anna_elga_2_cooling.json @@ -64,31 +64,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.5, + "setpoint_high": 23.0, + "setpoint_low": 19.5, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.0, + "setpoint_high": 23.0, + "setpoint_low": 19.0, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 25.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 27.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "Thermostat schedule", diff --git a/tests/data/anna/anna_elga_2_schedule_off.json b/tests/data/anna/anna_elga_2_schedule_off.json index bd7cf1057..9b09e10f0 100644 --- a/tests/data/anna/anna_elga_2_schedule_off.json +++ b/tests/data/anna/anna_elga_2_schedule_off.json @@ -64,31 +64,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.5, + "setpoint_high": 23.0, + "setpoint_low": 19.5, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.0, + "setpoint_high": 23.0, + "setpoint_low": 19.0, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 25.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 27.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "off", diff --git a/tests/data/anna/anna_heatpump_cooling.json b/tests/data/anna/anna_heatpump_cooling.json index f7689bfe9..590fb176f 100644 --- a/tests/data/anna/anna_heatpump_cooling.json +++ b/tests/data/anna/anna_heatpump_cooling.json @@ -83,31 +83,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.0, + "setpoint_high": 22.0, + "setpoint_low": 21.0, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 24.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.0, + "setpoint_high": 25.0, + "setpoint_low": 20.0, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 28.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "off", diff --git a/tests/data/anna/anna_heatpump_cooling_fake_firmware.json b/tests/data/anna/anna_heatpump_cooling_fake_firmware.json index afd7587a3..0f9b9cdb8 100644 --- a/tests/data/anna/anna_heatpump_cooling_fake_firmware.json +++ b/tests/data/anna/anna_heatpump_cooling_fake_firmware.json @@ -83,31 +83,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.0, + "setpoint_high": 22.0, + "setpoint_low": 21.0, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 24.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.0, + "setpoint_high": 25.0, + "setpoint_low": 20.0, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 28.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "off", diff --git a/tests/data/anna/anna_heatpump_heating.json b/tests/data/anna/anna_heatpump_heating.json index 6b21abfd9..e0d969f2c 100644 --- a/tests/data/anna/anna_heatpump_heating.json +++ b/tests/data/anna/anna_heatpump_heating.json @@ -89,31 +89,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 21.0, + "setpoint_high": 22.0, + "setpoint_low": 21.0, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 24.0, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.0, + "setpoint_high": 25.0, + "setpoint_low": 20.0, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 28.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "standaard", diff --git a/tests/data/anna/anna_loria_cooling_active.json b/tests/data/anna/anna_loria_cooling_active.json index 29555a61d..1e67057bf 100644 --- a/tests/data/anna/anna_loria_cooling_active.json +++ b/tests/data/anna/anna_loria_cooling_active.json @@ -24,31 +24,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 20.5, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.5, + "setpoint_high": 25.5, + "setpoint_low": 19.5, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 25.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 28.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "Winter", diff --git a/tests/data/anna/anna_loria_driessens.json b/tests/data/anna/anna_loria_driessens.json index d98e4a806..3ffbf60de 100644 --- a/tests/data/anna/anna_loria_driessens.json +++ b/tests/data/anna/anna_loria_driessens.json @@ -45,31 +45,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.0, + "setpoint_high": 21.0, + "setpoint_low": 20.0, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.0, + "setpoint_high": 25.0, + "setpoint_low": 19.0, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 26.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 28.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 17.0, + "setpoint_high": 30.0, + "setpoint_low": 17.0, "upper_bound": 30.0 }, "select_schedule": "Verwarmen@9-23u", diff --git a/tests/data/anna/anna_loria_heating_idle.json b/tests/data/anna/anna_loria_heating_idle.json index 06e56a82e..de5d5451d 100644 --- a/tests/data/anna/anna_loria_heating_idle.json +++ b/tests/data/anna/anna_loria_heating_idle.json @@ -24,31 +24,36 @@ "home_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 20.5, + "setpoint_high": 20.5, + "setpoint_low": 20.5, "upper_bound": 30.0 }, "asleep_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 19.5, + "setpoint_high": 25.5, + "setpoint_low": 19.5, "upper_bound": 30.0 }, "away_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 25.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "vacation_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 15.0, + "setpoint_high": 28.0, + "setpoint_low": 15.0, "upper_bound": 30.0 }, "no_frost_preset_temperature": { "lower_bound": 4.0, "resolution": 0.5, - "setpoint": 10.0, + "setpoint_high": 30.0, + "setpoint_low": 10.0, "upper_bound": 30.0 }, "select_schedule": "Winter", diff --git a/tests/test_adam.py b/tests/test_adam.py index e8b14bae7..11e23bc7a 100644 --- a/tests/test_adam.py +++ b/tests/test_adam.py @@ -102,7 +102,17 @@ async def test_connect_adam_plus_anna_new(self): assert sent.count(" Date: Mon, 26 Oct 2026 19:00:06 +0100 Subject: [PATCH 6/7] Find a zone's own preset rule by name when it has no tag --- plugwise/helper.py | 28 +++++++++++++++++++--------- tests/test_adam.py | 15 +++++++++++++++ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/plugwise/helper.py b/plugwise/helper.py index e51f67ee7..4a2645fa2 100644 --- a/plugwise/helper.py +++ b/plugwise/helper.py @@ -78,6 +78,11 @@ def search_actuator_functionalities( return None +def _own_rule_ids(rules: dict[str, dict[str, str]], loc_id: str) -> list[str]: + """Return the ids of the rules attached to loc_id.""" + return [rule_id for rule_id, data in rules.items() if data["location"] == loc_id] + + class SmileHelper(SmileCommon): """The SmileHelper class.""" @@ -945,21 +950,26 @@ def _preset_rule_ids(self, loc_id: str) -> list[str]: def _preset_rule_id(self, loc_id: str) -> str | None: """Return the id of the one preset rule attached to loc_id, or None.""" - own = [ - rule_id - for rule_id, data in self._all_preset_rules(loc_id).items() - if data["location"] == loc_id - ] + own = _own_rule_ids(self._all_preset_rules(loc_id), loc_id) return own[0] if len(own) == 1 else None def _all_preset_rules(self, loc_id: str) -> dict[str, dict[str, str]]: - """Collect all preset rules, by template tag or else by name.""" + """Collect all preset rules, choosing tagged or named rules per zone. + + Use the rules found by name when loc_id has no tagged rule of its own but does + have a rule by name, or when there are no tagged rules at all. + """ tag_1 = "zone_setpoint_and_state_based_on_preset" tag_2 = "Thermostat presets" - if not (rule_ids := self._rule_ids_by_tag(tag_1, loc_id)): - rule_ids = self._rule_ids_by_name(tag_2, loc_id) + tagged = self._rule_ids_by_tag(tag_1, loc_id) + if _own_rule_ids(tagged, loc_id): + return tagged + + named = self._rule_ids_by_name(tag_2, loc_id) + if _own_rule_ids(named, loc_id) or not tagged: + return named - return rule_ids + return tagged def _rule_ids_by_name(self, name: str, loc_id: str) -> dict[str, dict[str, str]]: """Helper-function for _presets(). diff --git a/tests/test_adam.py b/tests/test_adam.py index 11e23bc7a..f95846c5b 100644 --- a/tests/test_adam.py +++ b/tests/test_adam.py @@ -80,6 +80,21 @@ async def test_connect_adam_plus_anna_new(self): assert bathroom["home"] == [18.0, 22.0] # pylint: disable-next=protected-access assert len(api._smile_api._preset_rule_ids("no_such_zone")) == 2 + # A zone whose own rule has no template tag still finds that rule by name + # pylint: disable-next=protected-access + bathroom_rule = api._smile_api._domain_objects.find( + 'rule[@id="91946f89120a44139959d6739b914679"]' + ) + template = bathroom_rule.find("template") + bathroom_rule.remove(template) + # pylint: disable-next=protected-access + assert api._smile_api._preset_rule_id("f871b8c4d63549319221e294e4f88074") == ( + "91946f89120a44139959d6739b914679" + ) + # pylint: disable-next=protected-access + bathroom = api._smile_api._presets("f871b8c4d63549319221e294e4f88074") + assert bathroom["home"] == [18.0, 22.0] + bathroom_rule.append(template) assert await self.tinker_preset_temperature( api, "f2bf9048bef64cc5b6d5110154e33c81" From d7dfdf777755f3555cbc27f51c569804049958b5 Mon Sep 17 00:00:00 2001 From: Mart van Male Date: Mon, 26 Oct 2026 21:42:45 +0100 Subject: [PATCH 7/7] Refuse a preset heating setpoint above its cooling setpoint --- plugwise/smile.py | 14 +++++++++++++- tests/test_adam.py | 4 ++++ tests/test_anna.py | 18 ++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/plugwise/smile.py b/plugwise/smile.py index 10bfffd0a..5e44d86b6 100644 --- a/plugwise/smile.py +++ b/plugwise/smile.py @@ -249,7 +249,7 @@ async def set_preset_temperature( raise PlugwiseError("Plugwise: this zone has no preset rule of its own") locator = f'rule[@id="{rule_id}"]/directives/when[@preset="{preset}"]/then' - if self._domain_objects.find(locator) is None: + if (then := self._domain_objects.find(locator)) is None: raise PlugwiseError(f"Plugwise: invalid preset {preset}") if not MIN_SETPOINT <= temperature <= MAX_SETPOINT: raise PlugwiseError( @@ -259,6 +259,18 @@ async def set_preset_temperature( # The gateway replaces the whole directive set, so every preset is sent. # The lock keeps a concurrent write from resending a stale value for another preset. async with self._preset_lock: + heating = float(then.get("heating_setpoint")) + cooling = float(then.get("cooling_setpoint")) + if attribute == "heating_setpoint": + heating = temperature + else: + cooling = temperature + # Without cooling the stored cooling setpoint is a default nobody can change + if self._cooling_present and heating > cooling: + raise PlugwiseError( + f"Plugwise: the {preset} heating setpoint {heating} is above its cooling setpoint {cooling}. Lower the heating setpoint or raise the cooling setpoint." + ) + value = str(temperature) directives = "" for when in self._domain_objects.findall( diff --git a/tests/test_adam.py b/tests/test_adam.py index f95846c5b..d6f972e4c 100644 --- a/tests/test_adam.py +++ b/tests/test_adam.py @@ -117,6 +117,10 @@ async def test_connect_adam_plus_anna_new(self): assert sent.count("