From 37852b6abbc93785acde76628848b69c017baa82 Mon Sep 17 00:00:00 2001 From: Christian Lackas Date: Tue, 3 Feb 2026 09:45:01 +0100 Subject: [PATCH 1/2] Add setHeatingSchedule and getHeatingScheduleModes methods Adds ability to set heating circuit schedules via the API, complementing the existing getHeatingSchedule() method. Fixes #539 --- PyViCare/PyViCareHeatingDevice.py | 10 ++++++++++ tests/test_Vitocal300G.py | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/PyViCare/PyViCareHeatingDevice.py b/PyViCare/PyViCareHeatingDevice.py index de31df05..660ac5ae 100644 --- a/PyViCare/PyViCareHeatingDevice.py +++ b/PyViCare/PyViCareHeatingDevice.py @@ -699,6 +699,16 @@ def getHeatingSchedule(self): "sun": properties["entries"]["value"]["sun"] } + @handleAPICommandErrors + def setHeatingSchedule(self, schedule: dict) -> None: + self.service.setProperty(f"heating.circuits.{self.circuit}.heating.schedule", + "setSchedule", {'newSchedule': schedule}) + + @handleNotSupported + def getHeatingScheduleModes(self) -> list: # type: ignore[type-arg] + return list(self.getProperty(f"heating.circuits.{self.circuit}.heating.schedule" + )["commands"]["setSchedule"]["params"]["newSchedule"]["constraints"]["modes"]) + # Calculates target supply temperature based on data from Viessmann # See: https://www.viessmann-community.com/t5/Gas/Mathematische-Formel-fuer-Vorlauftemperatur-aus-den-vier/m-p/68890#M27556 def getTargetSupplyTemperature(self) -> Optional[float]: diff --git a/tests/test_Vitocal300G.py b/tests/test_Vitocal300G.py index e603e6a5..e7277d97 100644 --- a/tests/test_Vitocal300G.py +++ b/tests/test_Vitocal300G.py @@ -262,3 +262,8 @@ def test_coolingCircuit_getType(self): def test_coolingCircuit_getReverseActive(self): self.assertEqual( self.device.coolingCircuits[0].getReverseActive(), False) + + def test_getHeatingScheduleModes(self): + expected_modes = {'reduced', 'normal', 'fixed'} + self.assertSetEqual( + set(self.device.circuits[0].getHeatingScheduleModes()), expected_modes) From b7239fc60bdd2a02436a4ba6a7afc4aa6a930934 Mon Sep 17 00:00:00 2001 From: Christian Lackas Date: Mon, 4 May 2026 13:09:05 +0200 Subject: [PATCH 2/2] test: add setHeatingSchedule test case --- tests/test_Vitocal300G.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/test_Vitocal300G.py b/tests/test_Vitocal300G.py index e7277d97..049badff 100644 --- a/tests/test_Vitocal300G.py +++ b/tests/test_Vitocal300G.py @@ -267,3 +267,23 @@ def test_getHeatingScheduleModes(self): expected_modes = {'reduced', 'normal', 'fixed'} self.assertSetEqual( set(self.device.circuits[0].getHeatingScheduleModes()), expected_modes) + + def test_setHeatingSchedule(self): + schedule = { + "mon": [{"start": "06:00", "end": "22:00", "mode": "normal", "position": 0}], + "tue": [], + "wed": [], + "thu": [], + "fri": [], + "sat": [], + "sun": [], + } + self.device.circuits[0].setHeatingSchedule(schedule) + self.assertEqual(len(self.service.setPropertyData), 1) + self.assertEqual( + self.service.setPropertyData[0]['property_name'], + f'heating.circuits.{self.device.circuits[0].circuit}.heating.schedule') + self.assertEqual( + self.service.setPropertyData[0]['action'], 'setSchedule') + self.assertEqual( + self.service.setPropertyData[0]['data'], {'newSchedule': schedule})