OK, I've done some more digging and now have a script that pulls out the current temp, set temp and heating power level for both zones. It's not very elegant (and cobbles together stuff from elsewhere) but it seems to work. What I can't do is get the values into Indigo variables, but not sure how to modify the plugin to get them into device states. Ideally I would have two different devices representing my two zones...
Here's the script:
Code: Select all
import urllib
import urllib2
from cookielib import CookieJar
import json
class Tado:
"""Interacts with a Tado thermostat via public API.
Example usage: t = Tado('[email protected]', 'mypasswd')
t.getClimate(1) # Get climate, zone 1.
"""
# Instance-wide constant info
headers = { 'Referer' : 'https://my.tado.com/' }
api2url = 'https://my.tado.com/api/v2/homes/'
# 'Private' methods for use in class, Tado API V2.
def _apiCall(self, cmd):
url = '%s%i/%s' % (self.api2url, self.id, cmd)
req = urllib2.Request(url, headers=self.headers)
response = self.opener.open(req)
data = json.loads(response.read())
return data
def _setOAuthHeader(self, data):
access_token = data['access_token']
self.headers['Authorization'] = 'Bearer ' + access_token
def _loginV2(self, username, password):
url='https://my.tado.com/oauth/token'
data = { 'client_id' : 'tado-webapp',
'grant_type' : 'password',
'password' : password,
'scope' : 'home.user',
'username' : username }
data = urllib.urlencode(data)
url = url + '?' + data
req = urllib2.Request(url, data={}, headers=self.headers)
response = self.opener.open(req)
self._setOAuthHeader(json.loads(response.read()))
return response
# Public interface
def getMe(self):
"""Gets home information."""
url = 'https://my.tado.com/api/v2/me'
req = urllib2.Request(url, headers=self.headers)
response = self.opener.open(req)
data = json.loads(response.read())
return data
def getState(self, zone):
"""Gets current state of Zone zone."""
cmd = 'zones/%i/state' % zone
data = self._apiCall(cmd)
return data
def getCapabilities(self, zone):
"""Gets current capabilities of Zone zone."""
cmd = 'zones/%i/capabilities' % zone
data = self._apiCall(cmd)
return data
def getClimate(self, zone):
"""Gets temp (centigrade) and humidity (% RH) for Zone zone."""
cmd = 'zones/%i/state' % zone
data = self.getState(zone)['sensorDataPoints']
return { 'temperature' : data['insideTemperature']['celsius'],
'humidity' : data['humidity']['percentage'] }
def getWeather(self):
"""Gets outside weather data"""
cmd = 'weather'
data = self._apiCall(cmd)
return data
# Ctor
def __init__(self, username, password):
"""Performs login and save session cookie."""
# HTTPS Interface
cj = CookieJar()
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj),
urllib2.HTTPSHandler())
self._loginV2(username, password)
self.id = self.getMe()['homes'][0]['id']
t = Tado('MYUSERNAME', 'MYPASSWORD')
tadohouseclimate2 = t.getClimate(2)
tadohousetemp2 = round(tadohouseclimate2['temperature'],1)
tadostate2 = t.getState(2)
tadosettemp2 = tadostate2['setting']['temperature']['celsius']
tadoMode2 = tadostate2['tadoMode']
tadoPower2 = tadostate2['activityDataPoints']['heatingPower']['percentage']
tadohouseclimate1 = t.getClimate(1)
tadohousetemp1 = round(tadohouseclimate1['temperature'],1)
tadostate1 = t.getState(1)
tadosettemp1 = tadostate1['setting']['temperature']['celsius']
tadoMode1 = tadostate1['tadoMode']
tadoPower1 = tadostate1['activityDataPoints']['heatingPower']['percentage']
indigo.variable.updateValue(1879001743, value=str(tadohousetemp2))
indigo.variable.updateValue(1691479346, value=str(tadosettemp2))
indigo.variable.updateValue(576439922, value=str(tadoMode2))
indigo.variable.updateValue(1629558637, value=str(tadoPower2))
indigo.variable.updateValue(1239631313, value=str(tadohousetemp1))
indigo.variable.updateValue(144820532, value=str(tadosettemp1))
indigo.variable.updateValue(1021117713, value=str(tadoMode1))
indigo.variable.updateValue(77399010, value=str(tadoPower1))
indigo.server.log("Zone 1 temp: " + str(tadohousetemp1))
indigo.server.log("Zone 2 temp: " + str(tadohousetemp2))