@xatrix Ist erledigt, ich hab mein aktuelles Skript in meinem Beitrag oben editiert.
NEWS
Latest posts made by kr4mb3
-
RE: Skript für Bluetooth-Heizkörperthermostat unter IoBroker
-
RE: Skript für Bluetooth-Heizkörperthermostat unter IoBroker
Hi oemer9119,
ja ich bekomme Werte zurück, wenn ich getStatus ausführe. Das passiert in meinem Skript ja in zwei Teilen. Zuerst werden Werte wie Batteriestatus oder Boost über die Funktion "eQ3json" abgerufen, danach der aktuelle Modus, die Temperatur, die Ventil-Stellung und der Name sowie Hersteller des Thermostats über die Funktion "eQ3status". Über Putty sieht der Befehl "status" bei mir zB so aus wie im Anhang.
Die Zeile 143 im Skript teilt zB die Zeile "Device Name" am Doppelpunkt, um nur den Namen selbst zu bekommen. Trim entfernt dann noch die ganzen Leerzeichen zwischen Doppelpunkt und dem Namen. Hat dein Thermostat evtl keinen Namen?!
Und Zeile 140 ermittelt die Offset Temperatur. Die Zeile im Rückgabewert tritt aber nur auf, wenn man auch den Offset-Wert verändert. Das sollte aber eigentlich keine Fehler aufwerfen. Hast du denn dein Thermostat auch erfolgreich mit dem ioBroker Host per Bluetooth gekoppelt?
3592_2019-01-02_22_38_55-window.png
3592_2019-01-02_22_53_50-window.png -
RE: Skript für Bluetooth-Heizkörperthermostat unter IoBroker
Hallo,
Kann jemand vielleicht kurz erklären wie der das eingebunden hat mit dem code? Evtl für vis oder den cloud Adapter `
Ich habe mir noch einen weiteren State erstellt, der den Boost Modus aktiviert bzw. deaktiviert:
createState('eQ3.control.boostSwitch', false, {type: "boolean", role: "switch"});
Diese State habe ich dann im Cloud Adapter hinzugefügt, so kann ich per Alexa-Spracheingabe spontan den Boost Modus aktivieren, wenn es mir zu kalt ist. Den Temperaturwert per Cloud-Adapter zu erhöhen wäre auch sehr praktisch, ich habe es allerdings noch nicht hinbekommen, bestimmte absolute Werte zu übergeben, sondern bloß Prozentwerte…
In VIS solltest du eigentlich alle States aus dem Skript als Button oder als anderes Objekt einfügen können. Zum Beispiel mit dem hqWidget "Inner Temperature". Dort kann man die Zieltemperatur und den aktuellen Ventilstatus anzeigen. Und wenn du einen Sensor dafür hast, auch die aktuelle Temperatur. Und ein paar Stati aus dem Skript kann man auch als Signalbilder nutzen, zB ob der Boostmodus an ist, die Batterie leer ist oder das Fenster offen ist.
Greetz kr4mb3
3592_01_widget.png
3592_02_signalbilder.png -
RE: Skript für Bluetooth-Heizkörperthermostat unter IoBroker
@DennisK:Weis jemand von euch wie ich den Pfad "./eQ-3-radiator-thermostat/eq3.exp <macadresse>temp 20.0" anpassen muss, damit er mit iobroker kompatibel ist?</macadresse> `
Ich habe mich die Tage auch mal mit dem Thermostat beschäftigt und mir basierend auf dem Code von Heckie75 ein Skript in ioBroker geschrieben, dass mir auch ein paar Datenpunkte erstellt. Sicherlich nicht der schönste Code, aber es funktioniert. Ich habe den Pfad zur eq3.exp-Datei absolut angegeben, damit ich den Code verwenden kann:
/* script needs Heckie75/eQ-3-radiator-thermostat package. see https://github.com/Heckie75/eQ-3-radiator-thermostat thermostat must be paired via bluetooth exec command must be enabled in javascript adapter */ //Absolute Path to eQ-3-radiator-thermostat package and MAC of paired eQ3 thermostat var eQ3 = "/home/pi/eQ-3-radiator-thermostat/eq3.exp"; var mac = "00:1A:22:0C:08:3E"; //new iobroker states createState('eQ3.control.boostOn', false, {type: "boolean", role: "button"}); createState('eQ3.control.boostOff', false, {type: "boolean", role: "button"}); createState('eQ3.control.boostSwitch', false, {type: "boolean", role: "switch"}); createState('eQ3.control.getStatus', false, {type: "boolean", role: "button"}); createState('eQ3.control.setMode', false, {max: 1, min: 0, states: {0:"auto",1:"manual"}}); createState('eQ3.control.setTemp'); createState('eQ3.control.setOffset'); createState('eQ3.control.command'); createState('eQ3.status.Temperature'); createState('eQ3.status.Valve'); createState('eQ3.status.Mode'); createState('eQ3.status.VacationMode'); createState('eQ3.status.LowBattery'); createState('eQ3.status.OpenWindow'); createState('eQ3.status.Boost'); createState('eQ3.status.Locked'); createState('eQ3.status.OffsetTemp'); createState('eQ3.device.MAC'); createState('eQ3.device.Name'); createState('eQ3.device.Vendor'); createState('eQ3.timer.timerJSON'); //Exec-Befehl var eQ3exec = eQ3 + ' ' + mac + ' '; //Status on({id: 'javascript.0.eQ3.control.getStatus', val: true}, function (obj) { exec(eQ3exec + "status", function(err, stdout, stderr) { eQ3status(stdout); }); }); //Boost On on({id: 'javascript.0.eQ3.control.boostOn', val: true}, function (obj) { exec(eQ3exec + "boost", function(err, stdout, stderr) { eQ3status(stdout); }); }); //Boost Off on({id: 'javascript.0.eQ3.control.boostOff', val: true}, function (obj) { exec(eQ3exec + "boost off", function(err, stdout, stderr) { eQ3status(stdout); }); }); //Boost Switch on({id: 'javascript.0.eQ3.control.boostSwitch', change: "any"}, function (obj) { var value = obj.state.val; log (value); if (value === true) { exec(eQ3exec + "boost", function(err, stdout, stderr) { eQ3status(stdout); log ("Boost an"); }); }else if (value === false){ exec(eQ3exec + "boost off", function(err, stdout, stderr) { eQ3status(stdout); log ("Boost aus"); }); } }); //Set Temperature on({id: 'javascript.0.eQ3.control.setTemp', change: "any"}, function (obj) { var value = obj.state.val; exec(eQ3exec + "temp " + value, function(err, stdout, stderr) { eQ3status(stdout); }); }); //Set Offset on({id: 'javascript.0.eQ3.control.setOffset', change: "any"}, function (obj) { var value = obj.state.val; exec(eQ3exec + "offset " + value, function(err, stdout, stderr) { eQ3status(stdout); }); }); //Set Mode on({id: 'javascript.0.eQ3.control.setMode', change: "any"}, function (obj) { var value = obj.state.val; if (value === 0) { exec(eQ3exec + "auto", function(err, stdout, stderr) { eQ3status(stdout); }); } else if (value === 1){ exec(eQ3exec + "manual", function(err, stdout, stderr) { eQ3status(stdout); }); } }); //Custom Command on({id: 'javascript.0.eQ3.control.command', change: "any"}, function (obj) { var value = obj.state.val; exec(eQ3exec + value, function(err, stdout, stderr) { eQ3status(stdout); }); }); //Thermostat Status function eQ3status(stdout) { eQ3json(); stdout = stdout.split("\n"); stdout.forEach(element => { switch(element.split(":")[0]){ /* case "Temperature": setState('eQ3.status.Temperature', element.split(":")[1].trim()); break; case "Valve": setState('eQ3.status.Valve', element.split(":")[1].trim()); break; */ case "Mode": setState('eQ3.status.Mode', element.split(":")[1].trim()); break; case "Vacation mode": setState('eQ3.status.VacationMode', element.split(":")[1].trim()); break; case "Offset temperature": setState('eQ3.status.OffsetTemp', element.split(":")[1].trim()); break; case "Device name": setState('eQ3.device.Name', element.split(":")[1].trim()); break; case "Device vendor": setState('eQ3.device.Vendor', element.split(":")[1].trim()); break; case "": break; } }); } //Thermostat Status JSON function eQ3json(){ exec(eQ3exec + "json", function(err, stdout, stderr) { obj = JSON.parse(stdout); //Status setState('eQ3.status.LowBattery', obj.mode["low battery"]); setState('eQ3.status.OpenWindow', obj.mode["open window"]); setState('eQ3.status.Boost', obj.mode.boost); setState('eQ3.status.Locked', obj.mode.locked); setState('eQ3.status.Valve', obj.valve); setState('eQ3.status.Temperature', obj.temperature); //Device setState('eQ3.device.MAC', obj.mac); //Timer setState('eQ3.timer.timerJSON', JSON.stringify(obj.timers)); }); } schedule('*/2 * * * *', function (obj) { exec(eQ3exec + "status", function(err, stdout, stderr) { eQ3status(stdout); }); });
Noch habe ich nicht alle Funktionen des Skripts von Heckie75 umgesetzt, aber mehr brauch ich aktuell nicht. Die Basissteuerung und die Abfrage des Status (alle 2 Minuten) reicht mir bisher. Vielleicht hilft dir oder anderen das ja als Vorlage.
Greetz
kr4mb3