Skip to content

Commit 034894a

Browse files
authored
feat: Add heating schedule setter for circuits (#701)
* Add setHeatingSchedule and getHeatingScheduleModes methods Adds ability to set heating circuit schedules via the API, complementing the existing getHeatingSchedule() method. Fixes #539 * test: add setHeatingSchedule test case
1 parent 447d647 commit 034894a

2 files changed

Lines changed: 35 additions & 0 deletions

File tree

PyViCare/PyViCareHeatingDevice.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,16 @@ def getHeatingSchedule(self):
699699
"sun": properties["entries"]["value"]["sun"]
700700
}
701701

702+
@handleAPICommandErrors
703+
def setHeatingSchedule(self, schedule: dict) -> None:
704+
self.service.setProperty(f"heating.circuits.{self.circuit}.heating.schedule",
705+
"setSchedule", {'newSchedule': schedule})
706+
707+
@handleNotSupported
708+
def getHeatingScheduleModes(self) -> list: # type: ignore[type-arg]
709+
return list(self.getProperty(f"heating.circuits.{self.circuit}.heating.schedule"
710+
)["commands"]["setSchedule"]["params"]["newSchedule"]["constraints"]["modes"])
711+
702712
# Calculates target supply temperature based on data from Viessmann
703713
# See: https://www.viessmann-community.com/t5/Gas/Mathematische-Formel-fuer-Vorlauftemperatur-aus-den-vier/m-p/68890#M27556
704714
def getTargetSupplyTemperature(self) -> Optional[float]:

tests/test_Vitocal300G.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,3 +262,28 @@ def test_coolingCircuit_getType(self):
262262
def test_coolingCircuit_getReverseActive(self):
263263
self.assertEqual(
264264
self.device.coolingCircuits[0].getReverseActive(), False)
265+
266+
def test_getHeatingScheduleModes(self):
267+
expected_modes = {'reduced', 'normal', 'fixed'}
268+
self.assertSetEqual(
269+
set(self.device.circuits[0].getHeatingScheduleModes()), expected_modes)
270+
271+
def test_setHeatingSchedule(self):
272+
schedule = {
273+
"mon": [{"start": "06:00", "end": "22:00", "mode": "normal", "position": 0}],
274+
"tue": [],
275+
"wed": [],
276+
"thu": [],
277+
"fri": [],
278+
"sat": [],
279+
"sun": [],
280+
}
281+
self.device.circuits[0].setHeatingSchedule(schedule)
282+
self.assertEqual(len(self.service.setPropertyData), 1)
283+
self.assertEqual(
284+
self.service.setPropertyData[0]['property_name'],
285+
f'heating.circuits.{self.device.circuits[0].circuit}.heating.schedule')
286+
self.assertEqual(
287+
self.service.setPropertyData[0]['action'], 'setSchedule')
288+
self.assertEqual(
289+
self.service.setPropertyData[0]['data'], {'newSchedule': schedule})

0 commit comments

Comments
 (0)