From ad079c3f7426f10edb0be96d5ec05ec4323cf03b Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 17 May 2019 19:10:52 +0100 Subject: [PATCH 1/2] Add support to get/set a schedule for a zone --- AUTHORS | 3 ++- PyTado/interface.py | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 23aa474..1b17eac 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,3 +1,4 @@ Author: Chris Jewell Modified: Gareth Jeanne - Wolfgang Malgadey \ No newline at end of file + Wolfgang Malgadey + Matt Clayton diff --git a/PyTado/interface.py b/PyTado/interface.py index 33b7d69..2a2562d 100644 --- a/PyTado/interface.py +++ b/PyTado/interface.py @@ -213,6 +213,28 @@ def getClimate(self, zone): return {'temperature' : data['insideTemperature']['celsius'], 'humidity' : data['humidity']['percentage']} + def getSchedule(self, zone, day=None): + """Get the JSON representation of the schedule for a zone""" + # pylint: disable=C0103 + + if day: + cmd = 'zones/%i/schedule/timetables/1/blocks/%s' % (zone,day) + else: + cmd = 'zones/%i/schedule/timetables/1/blocks' % zone + + data = self._apiCall(cmd, "GET", {}, True) + return data + + def setSchedule(self, zone, day, data): + """Set the schedule for a zone, day is required""" + # pylint: disable=C0103 + + cmd = 'zones/%i/schedule/timetables/1/blocks/%s' % (zone,day) + + data = self._apiCall(cmd, "PUT", data, True) + return data + + def getWeather(self): """Gets outside weather data""" # pylint: disable=C0103 From f0b1b6740e6f48092dc8d5725ebd5e8bf5a8cf35 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 18 May 2019 13:17:24 +0100 Subject: [PATCH 2/2] Added support for get/set Timetable (i.e THREE_DAY, ONE_DAY..) --- PyTado/interface.py | 60 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/PyTado/interface.py b/PyTado/interface.py index 2a2562d..88838e4 100644 --- a/PyTado/interface.py +++ b/PyTado/interface.py @@ -9,6 +9,7 @@ import urllib.parse import urllib.error +from enum import IntEnum from http.cookiejar import CookieJar @@ -21,6 +22,12 @@ class Tado: t.getClimate(1) # Get climate, zone 1. """ + """Constants needed for get/set Schedule and Timetable""" + class Timetable(IntEnum): + ONE_DAY = 0 + THREE_DAY = 1 + SEVEN_DAY = 2 + _debugCalls = False # Instance-wide constant info @@ -213,28 +220,67 @@ def getClimate(self, zone): return {'temperature' : data['insideTemperature']['celsius'], 'humidity' : data['humidity']['percentage']} - def getSchedule(self, zone, day=None): - """Get the JSON representation of the schedule for a zone""" + def getTimetable(self, zone): + """Get the Timetable type currently active""" + # pylint: disable=C0103 + + cmd = 'zones/%i/schedule/activeTimetable' % (zone) + + data = self._apiCall(cmd, "GET", {}, True) + + if "id" in data: + return Tado.Timetable(data["id"]) + + raise Exception('Returned data did not contain "id" : '+str(data)) + + def setTimetable(self, zone, id): + """Set the Timetable type currently active + id = 0 : ONE_DAY (MONDAY_TO_SUNDAY) + id = 1 : THREE_DAY (MONDAY_TO_FRIDAY, SATURDAY, SUNDAY) + id = 3 : SEVEN_DAY (MONDAY, TUESDAY, WEDNESDAY ...)""" + # pylint: disable=C0103 + + # Type checking + if not isinstance(id, Tado.Timetable): + raise TypeError('id must be an instance of Tado.Timetable') + + cmd = 'zones/%i/schedule/activeTimetable' % (zone) + + data = self._apiCall(cmd, "PUT", {'id': id }, True) + return data + + def getSchedule(self, zone, id, day=None): + """Get the JSON representation of the schedule for a zone + a Zone has 3 different schedules, one for each timetable + (see setTimetable) """ # pylint: disable=C0103 + # Type checking + if not isinstance(id, Tado.Timetable): + raise TypeError('id must be an instance of Tado.Timetable') + if day: - cmd = 'zones/%i/schedule/timetables/1/blocks/%s' % (zone,day) + cmd = 'zones/%i/schedule/timetables/%i/blocks/%s' % (zone,id,day) else: - cmd = 'zones/%i/schedule/timetables/1/blocks' % zone + cmd = 'zones/%i/schedule/timetables/%i/blocks' % (zone,id) data = self._apiCall(cmd, "GET", {}, True) return data - def setSchedule(self, zone, day, data): + + def setSchedule(self, zone, id, day, data): """Set the schedule for a zone, day is required""" # pylint: disable=C0103 - cmd = 'zones/%i/schedule/timetables/1/blocks/%s' % (zone,day) + # Type checking + if not isinstance(id, Tado.Timetable): + raise TypeError('id must be an instance of Tado.Timetable') + + cmd = 'zones/%i/schedule/timetables/%i/blocks/%s' % (zone,id,day) data = self._apiCall(cmd, "PUT", data, True) return data - def getWeather(self): """Gets outside weather data""" # pylint: disable=C0103