NEWS

tado Heizkörperthermostat in ioBroker



  • Hallo zusammen,

    ich habe mir gerade ein Javscript gebastelt, welches ein paar Daten (eingestellte Temperatur, gemessene Raumtemperatur, Luftfeuchtigkeit, Heatingpower und ON/OFF-Status) meiner tado Heizkörperthermostate in iobroker einliest (es sind noch viel viel mehr Werte möglich, habe aber erstmal die für mich wichtigsten 5 genommen).

    Langzeit-Tests stehen noch aus, das Script ist gerade erst fertig geworden, ich wollte es aber dennoch schonmal mit euch teilen.

    Es gibt aktuell noch keine offizielle öffentliche API von tado, ich verwende hier API Abfragen mit Username und Passwort in der URL welche ich in einem Blogeintrag im Netz gefunden habe. Diesem Blogeintrag nach, kann es bei dieser Methode bei geringen Abfrage-Intervallen (der Autor hatte 30sec eingestellt) dazu führen, dass die tado Geräte die Verbindung zum Server verlieren, sämtliche Kommunikation verweigern und manuell neugestartet werden müssen (Bridge & Thermostate).

    Deshalb habe ich das Abfrage-Intervall erstmal auf 10min im Script eingestellt.

    Ich habe nur wenig Ahnung von Javascript und habe mir alles zusammengesucht mit google.

    Der Code ist somit alles andere als perfekt! (Optimierungsvorschläge sind gerne gesehen! Bitte aber dann verständlich für "ganz ganz Dumme" erklären! 🙂 )

    Bekannte Fehler:

    • Beim ersten Scriptdurchlauf wird es zu einem Fehler kommen, da das Script die Datenpunkte erstellt und direkt befüllen möchte. Das klappt meistens nicht. Beim darauffolgenden Durchlauf funktioniert aber alles, da die Datenpunkte dann bereits schon existieren. (Vielleicht kann mir jemand sagen wie ich das umgehen kann?)
    • Wenn ein Thermostat ausgeschaltet ist, dann schlägt die Abfrage der Werte fehl, vermutlich habe ich da einen Datenpunkt falsch konfiguriert, da der zurückgelieferte Wert "null" und keine Zahl ist. Schaue ich die Tage nochmal weiter nach.

    Eine kurze Anleitung befindet sich im oberen Teil des Scriptcodes.

    Hier nun das Script:

    // tado Script für ioBroker
    // Version 0.1
    //
    // Anleitung:
    // 1\. Pro Thermostat muss ein Script erstellt und individuell konfiguriert werden!
    // 2\. Eindeutigen Raumname im Konfig-Bereich des Scripts für das Thermostat angeben. Bei mehreren Thermostaten in einem Raum bitte unterschiedliche Raumnamen verwenden.
    // 3\. Über folgende URL (Nutzername und Passwort in der URL angeben) per WEbbrowser die HomeID ermitteln und in dem Konfigurations-Teil des Scripts eintragen:
    //    https://my.tado.com/api/v2/me?username=USERNAME&password=PASSWORT
    // 4\. Über folgende URL (HOME ID, Nutzername und Passwort in der URL angeben) per Webbrowser die ZoneID ermitteln und in dem Konfigurations-Teil des Scripts eintragen:
    //    https://my.tado.com/api/v2/homes/HOMEID/zones/2/state?username=USERNAME&password=PASSWORT
    //     - Die "2" im Link steht für ZoneID 2, in meinem Fall war das das Thermostat im Wohnzimmer
    //     - am besten unterschiedliche Temperaturen in den Räumen per App einstellen und dann verschiedene Zahlen im Link durchprobieren
    //
    //
    // Quellen die bei der Scripterstellung geholfen haben:
    // http://wirres.net/article/articleview/10326/1/6/
    // http://blog.scphillips.com/posts/2017/01/the-tado-api-v2/
     schedule("*/10 * * * *", function () { // Zeiteinstellung: Script aktualisiert alle 10 Min die Werte. Bei geringeren Abfrageintervallen kann es zu Verbindungsabbrüchen kommen und alle Geräte müssen neugestartet werden!
    
        //[b]Konfiguration:[/b]
        var Raumname = 'Wohnzimmer'; // Der hier angegebene Raumname dient zur Benennung des erzeugten Channel Objekts in ioBroker
        var ZoneID = "2"; // Zonennummer des Raums (muss über API URL ermittelt werden, siehe Anleitung)
        var HomeID = "XXXXX"; // HomeID (muss über API URL ermittelt werden, siehe Anleitung)
        var Username = "USERNAME"; // tado Username (E-Mail Adresse)
        var Password = "PASSWORT"; // tado Passwort (Sonderzeichen müssen entsprechend umgewandelt werden, z.B. # = %23)
    
        // SCRIPTBEGINN - AB HIER NICHTS VERÄNDERN !
    	 var url = "https://my.tado.com/api/v2/homes/"+HomeID+"/zones/"+ZoneID+"/state?username="+Username+"&password="+Password; // API URL
       	//läd die Json herunter
      	var request = require("request");
        request(url, function (error, response, body) {
      	//parst die Json
        var json = JSON.parse(body);
    
        //Datenpunkterstellung:
        createState("tado." + Raumname + ".temperature", 0, false, {type: "number", name: "temperature", desc: "Eingestellte Temperatur", role: "value.temperature", unit: "°C", read: true, write: true});
        createState("tado." + Raumname + ".power", "OFF", false, {type: "string", name: "power", desc: "Aufheizen", read: true, write: true});
        createState("tado." + Raumname + ".inside_temperature", 0, false, {type: "number", name: "inside_temperature", desc: "Gemessene (Raum-)Temperatur", role: "value.temperature", unit: "°C", read: true, write: true});
        createState("tado." + Raumname + ".humidity", 0, false, {type: "number", name: "humidity", desc: "Luftfeuchtigkeit", role: "value.humidity", unit: "%", min: 0, max: 100, read: true, write: true});
        createState("tado." + Raumname + ".heatingpower", 0, false, {type: "number", name: "heatingpower", desc: "Heizkraft", unit: "%", min: 0, max: 100, read: true, write: true});
         //Datenabfrage:
        //Temperatur:
      	setState("javascript.0.tado."+Raumname+".temperature", json.setting.temperature.celsius);
      	log('tado Temperatur '+Raumname+': ' + json.setting.temperature.celsius);
      	//Power:
      	setState("javascript.0.tado."+Raumname+".power", json.setting.power);
      	log('tado Power-Setting '+Raumname+': ' + json.setting.power);
      	//Humidity:
      	setState("javascript.0.tado."+Raumname+".humidity", json.sensorDataPoints.humidity.percentage);
      	log('tado Humidity '+Raumname+': ' + json.sensorDataPoints.humidity.percentage);
      	//Inside Temperature:
      	setState("javascript.0.tado."+Raumname+".inside_temperature", json.sensorDataPoints.insideTemperature.celsius);
      	log('tado Inside Temperature '+Raumname+': ' + json.sensorDataPoints.insideTemperature.celsius);
      	//Heating Power:
      	setState("javascript.0.tado."+Raumname+".heatingpower", json.activityDataPoints.heatingPower.percentage);
      	log('tado Heating Power '+Raumname+': ' + json.activityDataPoints.heatingPower.percentage);
      	});
    }); 
    

    Viel Spaß damit!



  • Hallo eXTreMe,

    ich habe mir jetzt mal dein Script angeschaut und es gestern bei mir aktiviert.

    Wenn ich es aber jetzt starte, wie in der Beschreibung, werden zwar die Objekte angezeigt, aber die Temperatur etc. stehen auf 0 °C, 0%.

    Wo könnte der Fehler liegen?

    P.S.: Das Thermostat ist an.



  • Hallihallo eXTreMe.

    Dein Script läuft bei mir nun schon seit 3 Wochen recht sauber. gestern habe ich es in VIS eingebunden und da ist mir aufgefallen das ich nur die werte auslesen kann aber keine neuen setzen kann. ist das richtig oder ist da bei mir noch ein Fehler. ich habe es auch direkt in iobroker versucht die soll Temperatur zu ändern doch nach einer weile ist es wieder die eingestellte Temperatur von meiner Tado App. funktioniert das bei dir richtig?



  • doppelpost, siehe unten



  • @kaltesbier:

    Hallihallo eXTreMe.

    Dein Script läuft bei mir nun schon seit 3 Wochen recht sauber. gestern habe ich es in VIS eingebunden und da ist mir aufgefallen das ich nur die werte auslesen kann aber keine neuen setzen kann. ist das richtig oder ist da bei mir noch ein Fehler. ich habe es auch direkt in iobroker versucht die soll Temperatur zu ändern doch nach einer weile ist es wieder die eingestellte Temperatur von meiner Tado App. funktioniert das bei dir richtig? `

    das script kann nur werte auslesen

    müss nochmal die script quellen die ich da oben im code mit angegeben hatte genauer durchlesen und testen ob da nicht nur abfragen sondern auch wertänderungen mit funktionieren und dann ggf. das script erweitern.

    edit: Habs nachgelesen, manuelle temperatureingabe ist möglich, wenn ich zeit habe befasse ich mich nochmal damit, werte ändern per javascript ist nämlich noch neuland für mich, bisher hab ich immer nur ausgelesen.

    $ curl -X PUT "https://my.tado.com/api/v2/homes/<homeid>/zones/<zoneid>/overlay" -H "Authorization: Bearer `cat /tmp/tadotoken`" -H "Content-Type:application/json;charset=UTF-8" --data-binary '{"setting":{"type":"HEATING","power":"ON","temperature":{"celsius":21}},"termination":{"type":"MANUAL"}}'</zoneid></homeid>
    

    wenn du es eilig hast und schnell eine lösung suchst die aber umständlich ist:

    mit dem cloud adapter über IFTTT webhooks lässt sich tado ansprechen. nur du müsstest für jeden temperaturwert (und das für jeden raum) in IFTTT ein applet anlegen und ein entsprechendes javascript in iobroker schreiben. Wenn du nur eine hand voll feste werte (z.b. AUS, 20°C und 25°C) anlegst dann ist die arbeit noch überschaubar.

    ich habe es momentan in VIS einfach so gelöst, dass ich die tado webseite als iframe in VIS eingebunden habe. sieht genauso aus wie die app. nimmt nur einiges an platz weg in VIS



  • Hallo zusammen,

    ich bin jetzt neu bei ioBroker, und versuche auch zu scripten. Das mit dem auslesen der Temperaturen usw. funktioniert super. Ich möchte jetzt die Anwesenheit von den Handys bei Tado auslesen. Habe versucht aus dem vorhandenen Script von eXTreMe abzuleiten, jedoch beim Pfad von den Handys muss ich eine Zahl ->0 der 1 angeben. Das mag das Script garnicht, habe ich jetzt im Beitrag fett, unterstrichen un kursiv hervorgehoben. Bitte um Hilfe

    Das Script:

    schedule("*/10 * * * *", function () { // Zeiteinstellung: Script aktualisiert alle 10 Min die Werte. Bei geringeren Abfrageintervallen kann es zu Verbindungsabbrüchen kommen und alle Geräte müssen neugestartet werden!

    var Username = "xxx"; // tado Username (E-Mail Adresse)

    var Password = "xxx"; // tado Passwort (Sonderzeichen müssen entsprechend umgewandelt werden, z.B. # = %23)

    var url = "https://my.tado.com/api/v2/me?username= … ; // API URL

    //läd die Json herunter

    var request = require("request");

    request(url, function (error, response, body) {

    //parst die Json

    var json = JSON.parse(body);

    //Datenpunkterstellung:

    createState("Anwesenheit Roman",false, {read: true, write: true, name: "Anwesenheit Roman", type: "boolean", def: false});

    //Datenabfrage:

    setState("javascript.0.Anwesenheit Roman", json.mobileDevices.<u>0</u>.location.atHome);

    log(json.mobileDevices.<u>0</u>.location.atHome);

    });

    });



  • Habe es mal als in die Adapter Request Liste aufgenommen:

    https://github.com/ioBroker/AdapterRequests/issues/71



  • Hallo zusammen,

    sehr cooles Script, läuft bei mir seit Tagen stabil. Gibts bzgl. dem Post von Roman und der Anwesenheit einzelner Handys schon einen Lösungsansatz? Ich stehe ebenfalls vor dem Problem mit der besagten "0". Einklammern brachte keinen Erfolg.

    Gruß

    Simon



  • Hallo Simon,

    du musst Eckige Klammern benutzen [0] dann klappt es. Bin aber von der Lösung weg, da es zu träge ist. Ich frage jetzt die Anwesenheit über das WLAN ab, ob die Handys zu Hause sind.


  • Developer Most Active Administrators



Suggested Topics

2.1k
Online

32.3k
Users

39.0k
Topics

528.0k
Posts