Moin Moin,
ich geh man davon aus das nicht viele hier die Tado Thermostate nutzen, trotzdem möchte ich mein Skript hier vorstellen.
Es ist noch in einem sehr frühen Stadium es geht noch nicht viel und es gibt auch noch Fehler !!
Tado bietet noch immer keine Offizielle API, alles basiert auf dem Web-Interface
Es Muss unter Authorisation der Username und das Passwort eingetragen werden
Das Client_Secret sollte universell für die Web API sein, sollte dem nicht so sein, bitte um Rückmeldung
createState('javascript.0.Tado.Authorization.Username','',{type: "string", role: "Username"});
createState('javascript.0.Tado.Authorization.Password','',{type: "string", role: "Password"});
createState('javascript.0.Tado.Authorization.Login','',{type: "boolean", role: "button"});
createState('javascript.0.Tado.Authorization.Authorized',false,{type: "boolean", role: "Authorized",write:false});
createState('javascript.0.Tado.GetZones','',{type: "boolean", role: "button"});
createState('javascript.0.Tado.GetZoneState','',{type: "boolean", role: "button"});
var Application = {
BaseURL:'https://my.tado.com/api/',
Client_ID:'tado-web-app',
Client_Secret:'wZaRN7rpjn3FoNyF5IFuxg9uMzYJcvOoQ8QWiIqS3hfk6gLhVlG57j5YNoZL2Rtc',
Token:'',
refresh_token:'',
HomeID:''
};
var ZoneIDs=[];
function SendRequest(Endpoint,Method,Send_Body,callback){
var options = {
url: Application.BaseURL+Endpoint,
method: Method,
headers: {Authorization: 'Bearer '+Application.Token},
form:Send_Body
};
request(options,function (error, response, body){
console.log(response.statusCode);
console.log(body);
switch (response.statusCode){
case 200: // OK
return callback(false,JSON.parse(body));
case 202: //Accepted, processing has not been completed.
break;
case 204: // OK, No Content
return callback(false,null);
case 400: //Bad Request, message body will contain more information
return callback(true,null);
case 401: //Unauthorized
RefreshToken(Application.refresh_token,function(err,access_token,refresh_token){
if(!err){
Application.Token=access_token;
Application.refresh_token=refresh_token;
console.log('Token erneuert !');
SendRequest(Endpoint,Method,Send_Body,function(err,data){
if(!err){return callback(false,data)}
else{return callback(true,null)}
});
}
else{return callback(true,null);}
});
break;
default:
return callback(true,null);
}
});
}
function GetToken(Password,Username,callback){
var options = {
url: 'https://auth.tado.com/oauth/token',
method: 'POST',
form: {grant_type:'password',password:Password,username:Username,scope:'home.user',client_id:Application.Client_ID,client_secret:Application.Client_Secret}
};
request(options, function (error, response, body){
if (response.statusCode==200){
P=JSON.parse(body);
return callback(false,P.access_token,P.refresh_token);
}
else{
console.warn(response.statusCode+' Login Error !');
return callback(true,null,null);
}
});
}//End of Function GetToken
function RefreshToken(Refresh_Token,callback){
var options = {
url: 'https://auth.tado.com/oauth/token',
method: 'POST',
form: {grant_type:'refresh_token',scope:'home.user',client_id:Application.Client_ID,client_secret:Application.Client_Secret,refresh_token:Application.refresh_token}
};
request(options, function (error, response, body){
if (response.statusCode==200){
P=JSON.parse(body);
return callback(false,P.access_token,P.refresh_token);
}
else{
console.error(response.statusCode+' Fehler bei Refresh Token !');
return callback(true,null,null);
}
});
}//End of Function RefreshToken
function GetZones(data,Pfad){
for (var ObjName in data) {
var New_Pfad=Pfad+'.'+ObjName;
console.log(ObjName)
var Type=typeof data[ObjName];
switch(Type){
case 'object':
console.log('ist Objekt')
//console.log(ObjName)
GetZones(data[ObjName],New_Pfad);
break;
case 'boolean':
case 'string':
case 'number':
case 'none':
if (!getObject(New_Pfad)){
createState(New_Pfad, data[ObjName], {type:Type, role: ObjName});
}
else{setState(New_Pfad,data[ObjName],akt=true)}
//console.log(ObjName)
break;
default:
if (Array.isArray(data[ObjName])===true){
console.log('ist Array')
for (i = 0; i < data[ObjName].length; i++) {
GetZones(data[ObjName[i]]);
}
}
else{console.log('is nix')}
break;
}
}
}//End of Function
function GetZoneState(ZoneIDs){
if ("undefined"== typeof Intervall){
Intervall = setInterval(function () {
for (i = 0; i < ZoneIDs.length; i++) {
ZoneState(ZoneIDs[i]);
}
},10000);
}
else{clearInterval(Intervall)}
}//End of Function
function ZoneState (id){
SendRequest('v2/homes/'+Application.HomeID+'/zones/'+id+'/state','GET','',function(err,data){});
}
on({id:'javascript.0.Tado.Authorization.Login'}, function (obj){
var Username = getState('javascript.0.Tado.Authorization.Username').val;
var Password = getState('javascript.0.Tado.Authorization.Password').val;
GetToken(Password,Username,function(err,access_token,refresh_token){
if(!err){
//setState('javascript.0.Tado.Authorization.Username',val='',akt=true);
//setState('javascript.0.Tado.Authorization.Password',val='',akt=true);
setState('javascript.0.Tado.Authorization.Authorized',val=true,akt=true);
Application.Token=access_token;
Application.refresh_token=refresh_token;
SendRequest('v1/me','GET','',function(err,data){
if(!err){Application.HomeID=data.homeId}
});
}
else{setState('javascript.0.Tado.Authorization.Authorized',val=false,akt=true);}
});
});
on({id:'javascript.0.Tado.GetZones'}, function (obj){
SendRequest('v2/homes/'+Application.HomeID+'/zones','GET','',function(err,data){
if(!err){GetZones(data,'javascript.0.Tado.Zones')}
});
});
on({id:'javascript.0.Tado.GetZoneState'}, function (obj){
GetZoneState([1,2,3]);
});