NEWS
[Projekt] ETA Heizung
-
Hallo, ich habe das gleiche Problem. Hab am Wochenende mal wieder ein paar Aktualisierungen durchgeführt.
Seit dem funktioniert das ETA Script bei mir auch nicht mehr. Scheinbar wurde das Module XMLDOM aus node.js entfernt.
Kennt jemand eine alternative?
Leider hat das Downgrade auf Javascript Version 6.0 bei mir nicht geholfen
Danke -
@herry HI! Geniale VIS könnte man die bekommen? LG Friedrich
-
@gmbh07 said in [Projekt] ETA Heizung:
@rille06 Hallo, ich habe da mit dem Modus Adapter versucht komme aber nicht weiter, hast du vielleicht eine kleine Übersicht deiner Einstellungen? Es springt bei mir immer wie auf denn Fotos hin und her und ich habe keine Werte.
Habe auch dieses Problem. @gmbh07 konntest du das Problem in der Zwischenzeit lösen?
-
@amandus99 said in [Projekt] ETA Heizung:
@smarttux
Mach es über ein Skript. Das funktioniert wunderbar über den iobroker. Kannst damit auch steuernd eingreifen wenn du unbedingt magstKönntest du bitte dein funktionierendes Skript teilen?
Ich bin leider auf noch einen grünen Zweig gekommen, wie ich die Anlage über den ioBroker schalten kann.
Also beispielsweise Pumpe/Kessel aus oder VL-Temperatur-Erhöhung. -
klar schau es dir an, habe zB einen Datenpunkt mit dem ich die Zirkulation vom FWM an und ausschalten kann
var http = require('http'); var xpath = require('xpath'); var dom = require('xmldom').DOMParser; var etaIP = 'http://192.168.10.82:8080/user/var'; // 1. URI // 2. iobroker Object // 3. read // 4. write // 5. name // 6. type // 7. unit // 8. role // 9. CCU variable (optional) var etaVars = [ ["/120/10601/0/11327/0", "eta.Puffer.oben", true, false, "Puffer oben", "string", "°C", "value.temperature", ""] ,["/120/10601/0/11328/0", "eta.Puffer.mitte", true, false, "Puffer mitte", "string", "°C", "value.temperature", ""] ,["/120/10601/0/11329/0", "eta.Puffer.unten", true, false, "Puffer unten", "string", "°C", "value.temperature", ""] ,["/120/10601/0/0/12528", "eta.Puffer.ladezustand", true, false, "Puffer Ladezustand", "number", "%", "state", ""] ,["/120/10101/0/11125/2120", "eta.HK.vorlauf", true, false, "Heizkreis Vorlauf Soll Temp", "number", "°C", "value.temperature", ""] ,["/120/10101/0/11125/2121", "eta.HK.vorlaufIst", true, false, "Heizkreis Vorlauf Ist Temp", "number", "°C", "value.temperature", ""] ,["/40/10021/0/0/12153", "eta.kessel.vollast", true, false, "Kessel Vollaststunden", "string", "", "state", ""] ,["/40/10021/0/0/12016", "eta.kessel.verbrauch", true, false, "Kessel Gesmtverbrauch", "number", "kg", "state", ""] ,["/40/10021/0/0/12013", "eta.kessel.aschebox", true, false, "Kessel Verbrauch seit Aschebox", "number", "kg", "state", ""] ,["/40/10021/0/0/12180", "eta.kessel.druck", true, false, "Kessel Druck", "number", "bar", "state", ""] ,["/40/10021/0/0/12001", "eta.kessel.soll", true, false, "Kessel Soll", "number", "°C", "state", ""] ,["/40/10021/0/0/12161", "eta.kessel.ist", true, false, "Kessel Ist", "number", "°C", "state", ""] ,["/40/10021/0/0/12162", "eta.kessel.abgasgtemp", true, false, "Kessel Abgastemperatur", "number", "°C", "state", ""] ,["/40/10021/0/0/12165", "eta.kessel.abgasgeblaese", true, false, "Kessel Abgasgebläse", "number", "U/min", "state", ""] ,["/40/10021/0/0/12164", "eta.kessel.restsauerstoff", true, false, "Kessel Restsauerstoff", "number", "%", "state", ""] ,["/40/10021/0/0/12080", "eta.kessel.zustand", true, false, "Kessel Zustand", "string", "", "state", ""] ,["/40/10021/0/0/12077", "eta.kessel.angeforderteLeistung", true, false, "Kessel angeforderte Leistung", "number", "kW", "state", ""] ,["/40/10201/0/0/12015", "eta.lager.silo", true, false, "Pellets Silo", "number", "kg", "state", ""] ,["/40/10021/0/0/12011", "eta.lager.tag", true, false, "Pellets Tagesbehälter", "number", "kg", "state", ""] ,["/120/10601/0/0/12197", "eta.system.aussentemperatur", true, false, "Aussentemperatur", "number", "°C", "state", ""] ,["/79/10531/0/11137/2001", "eta.FWM.Zirkulation", true, false, "Anforderung Zirkulation", "string", "", "state", ""] ,["/120/10101/0/11125/2001", "eta.FBH.HKmischerAnforderung", true, false, "Anforderung Heizkreismischer", "string", "", "state", ""] ,["/120/10101/0/11125/2120", "eta.FBH.HKmischerSoll", true, false, "Soll Temp Heizkreismischer", "number", "°C", "value.temperature", ""] ,["/120/10101/0/11125/2121", "eta.FBH.HKmischerIst", true, false, "Ist Temp Heizkreismischer", "number", "°C", "value.temperature", ""] ,["/120/10101/0/11125/2002", "eta.FBH.HKmischerZustand", true, false, "Zustand Heizkreismischer", "string", "", "state", ""] ,["/120/10101/0/11125/2127", "eta.FBH.HKmischerPosition", true, false, "Position Heizkreismischer", "number", "%", "value.percent", ""] ,["/120/10101/0/11125/2124", "eta.FBH.Laufzeit", true, false, "Laufzeit Heizkreismischer", "number", "s", "", ""] ,["/120/10101/0/11125/0", "eta.FBH.HKpumpeAusgang", true, false, "Heizkreispumpe Ausgang", "number", "°C", "value.temperature", ""] ,["/120/10101/0/11125/2001", "eta.FBH.HKpumpeAnforderung", true, false, "Heizkreispumpe Anforderung", "string", "", "state", ""] ///79/10531/12175/0/1109 Alternative ]; etaVars.forEach(function(etaVar){ createState(etaVar[1], 0, { read: etaVar[2], write: etaVar[3], name: etaVar[4], type: etaVar[5], unit: etaVar[6], role: etaVar[7] }); }); schedule("*/5 * * * *", function () { pollETA(); }); schedule("0 0 * * *", function () { checkLager(); }); pollETA(); //var lagerAlt = getState('javascript.0.eta.lager.silo').val; //deleteState("javascript.0.eta.lager.verbrauch"); //createState("javascript.0.eta.lager.verbrauch",0,{name:'Lager Tagesverbrauch', type: 'number', unit: 'kg', role:'state'}); //createState("javascript.0.eta.lager.alt",LagerAlt,{name:'Lager TempAlt', type: 'number', unit: 'kg', role:'state'}); //createState("javascript.0.eta.lager.Resttage",-1,{name:'Lager Anzahl Tage', type: 'number', unit: 'days', role:'state'}); //createState("javascript.0.eta.lager.letzterTag",-1,{name:'Lager Letzter Tag mit Pellets', type: 'string', unit: '', role:'state'}); //setState("javascript.0.eta.lager.alt", LagerAlt, true/*ack*/); //var LagerNeu = checkLager(LagerAlt); //checkLager(); function debugOutput(){ var akt = getState('javascript.0.eta.lager.silo').val; var verbrauch = getState("javascript.0.eta.lager.verbrauch").val; var restTage = 0; restTage = Math.round(akt/verbrauch) log("## Aktuelle Verbrauswerte ##"); log("----------------------------"); log("Lager akt: " + akt); log("Lager verbrauch: " + verbrauch); var ungerundet = akt/verbrauch; log("ungerundet: " +ungerundet); log("restTage " + restTage); var someDate = new Date(); var numberOfDaysToAdd = restTage; someDate.setDate(someDate.getDate() + numberOfDaysToAdd); var endOfPellets = formatDate(someDate, "DD.MM.YYYY"); log("endofPellets: " + endOfPellets); setState("javascript.0.eta.lager.letzterTag", endOfPellets, true); setState("javascript.0.eta.lager.Resttage", restTage, true); } //debugOutput(); function checkLager(){ var lagerAlt = getState('javascript.0.eta.lager.alt').val; //var LagerAlt = getState('javascript.0.eta.lager.silo').val; var akt = getState('javascript.0.eta.lager.silo').val; log("** Aktuelle Verbrauswerte **"); log("----------------------------"); log("Lager alt: " + lagerAlt); log("Lager aktuell: " + akt); var verbrauch = lagerAlt - akt; //var verbrauch = getState("javascript.0.eta.lager.verbrauch").val; // edit back after debug setState("javascript.0.eta.lager.verbrauch", verbrauch, true/*ack*/); setState("javascript.0.eta.lager.alt", akt, true/*ack*/); log("Verbrauch: " + verbrauch); var restTage = 0; restTage = Math.round(akt/verbrauch); var ungerundet = akt/verbrauch; var someDate = new Date(); var numberOfDaysToAdd = restTage; someDate.setDate(someDate.getDate() + numberOfDaysToAdd); var endOfPellets = formatDate(someDate, "DD.MM.YYYY"); setState("javascript.0.eta.lager.letzterTag", endOfPellets, true); setState("javascript.0.eta.lager.Resttage", restTage, true); log("end of pellets" + endOfPellets); lagerAlt = akt; } //checkLager(); function pollETA() { // log("** Polling ETA Variables"); etaVars.forEach(function(etaVar){ http.get(etaIP + etaVar[0], function (http_res) { // initialize the container for our data var data = ""; // this event fires many times, each time collecting another piece of the response http_res.on("data", function (chunk) { // append this chunk to our growing `data` var data += chunk; // log("** ETA chunk: " + chunk); }); // this event fires *one* time, after all the `data` events/chunks have been gathered http_res.on("end", function () { // log("** ETA data: " + data); try { var doc = new dom().parseFromString(data); var select = xpath.useNamespaces({"eta": "http://www.eta.co.at/rest/v1"}); var strValue = (select('//eta:value/@strValue', doc)[0].nodeValue); var text = (select('//eta:value/text()', doc)[0].nodeValue); var scaleFactor = (select('//eta:value/@scaleFactor', doc)[0].nodeValue); var unit = (select('//eta:value/@unit', doc)[0].nodeValue); var value = ""; //change Aus to false, An to true for Zirkulation if (etaVar[0] == "/79/10531/0/11137/2001"){ if (strValue == "Aus"){ strValue = "false"; } else strValue = "true"; } if (etaVar[5]=="number") { value = text * 1.0 / scaleFactor; } else { value = strValue; } setState(etaVar[1], value, true); } catch (e) { log("ETA: Cannot set data "+ etaVar[2] +":" + e, 'error'); } }); }); }); }
-
@kapsville
Hi hab auch dieses Problem...
Gibt es eine Lösung?
LG
Friedrich -
@tcfigge
Hi ich komme nur auf 6.0.1 zurück. Gibt es eine Möglichkeit auf 6.0 zu kommen bzw. 5.x? Vielen Dank für eure Hilfe..
LG Friedrich -
@frisch
Hi!
Ich habe das über die Expertenfunktion in der Adapterinstallation gemacht...
Da gab es die 6.0.0 noch.Ist das Problem wohl schon bekannt und auf dem Weg der Lösung?
-
@tcfigge
Danke für die Info. Ich hab gestern ein paar Module installiert..
npm install date-format, npm install node-fetch@3.0.0, npm install xmldom, npm install xpath,
diese dann irgendwie eingetragen
Jetzt bekomme ich die Werte.
Das Script meldet aber noch ein paar Fehlermeldungen (aber es läuft)...PS: bin blutiger Anfänger...
-
@amandus99
Hallo, gibt es auch eine Möglichkeit eine einzelne Pumpe aus und einzuschalten über ein Skript.
Wenn ich den Wert unter Objekte ändere, dass dieser dann auch an die ETA Heizung übertragen wird.
Beispiel: "Kollektorpumpe 1" von 0% auf 100%Werde leider aus deinem Skript nicht Schlau wie ich das anwenden kann
-
Ich habe auch mal das Script genommen und bekomme zwar Werte aber habe auch reichlich Fehlermeldungen
auch stimmen einige Infos nicht z.B. Ein [heizen]
ich lese die Werte parallel mit dem parser aus dort sind sie richtig
any hints ?
-
Bist du weitergekommen?
Ich schaue mir auch gerade die Integration an und wäre für eine verbesserte Lösung dankbar
Kannst du die Konfiguration des Parsers teilen? -
Ich schließe mich der Frage mal!
Wäre ein super Startpunkt, bevor man kompltte von 0 anfangen muss -
@kapsville
sry das ich jetzt erst antworte.
Du musst für ModBus TCP an der Heizung entsprechend werte "freigeben" und Adressieren.
unten Links auf die Werkzeugkiste -> Berechtigung -> 135 "Enter"
Danach über die Parameterliste einzeln alle werte die du willst via Zahnradsymbol -> MusdBus/TCP -> Register zuweisen
Oben Links und in der Info (falls vorhanden) stehen allgemeine Infos dazu, ist relativ selbsterklärend.
Idr sind alles Signed 32 bit (Big Endian) oder Unsigned 32 bit (Big Endian) als Datentyp.
Dann eben alle Register im ModBus Adapter entsprechend eintragen.An der ETA hab ich das über VNC Viewer gemacht.
Funktioniert bei mir schon lange problemlos. -
Ich komme mit modbus auch nicht weiter, kannst du dir das hier mal anschauen.
Irgendwas musst du anders/besser gemacht haben: -
@canetlotw
Moin,
ist der verlinkte Post von dir selbst?
Das dabei beschriebene Problem liegt nicht an Iobroker sondern an der ETA Firmware.
Wegen diesem Problem war ich vor ca einem Jahr schon mit ETA Selbst in Kontakt, Offiziell wurde der Fehler nicht behoben,
bei einem Bekannten hat es dann aber mit einem Firmware update dennoch geklappt.
Mit dem Haken bei "aliases" erwartet der Modbus-Adapter strickte Einhaltung der Adressbereiche, ETA liefert aber ab einem gewissen
Bereich keine Sinnvollen daten mehr.
Ich würde also mal auf eine Aktuelle Version Updaten, falls das nicht schon der fall ist.Bedeutet für dich, du musst den Hacken bei aliases raus machen.
Bei deiner Heizung dann mit Adresse 1000 beginnend einfach alle werte nacheinander Aktivieren und eben im Modbus Adapter entsprechend eintragen.
Ich meine auch, dass der Abfrage Intervall zu kurz ist, ich habe bei mir 5sec drin, ich meine ein zu kurzer Intervall hat ebenfalls zu Problemen geführt,
dabei bin ich mir aber nicht mehr ganz sicher. -
Hallo!
In einem anderen Thread hat mir jemand geholfen, die Probleme mit dem Script zu beheben.
Fehler war in der DOMParser Zeile 3 und einer in der log Zeile 117
Hier jetzt die funktionierende Version:
var http = require('http'); var xpath = require('xpath'); var dom = require('@xmldom/xmldom').DOMParser; var objectInstanz = '0_userdata.0.Heizung.'; var etaIP = 'http://192.168.100.220:8080/user/var'; // 1. URI // 2. iobroker Object // 3. read // 4. write // 5. name // 6. type // 7. unit // 8. role // 9. CCU variable (optional) var etaVars = [ ["/120/10251/0/0/12242", "eta.puffer.oben", true, false, "Puffer oben", "number", "°C", "value.temperature", ""] ,["/120/10251/0/0/12244", "eta.puffer.unten", true, false, "Puffer unten", "number", "°C", "value.temperature", ""] ,["/120/10251/0/0/12522", "eta.puffer.mitte", true, false, "Puffer mitte", "number", "°C", "value.temperature", ""] ,["/120/10251/0/0/12533", "eta.puffer.leistung", true, false, "Puffer Leistung", "number", "KW", "state", ""] ,["/120/10251/12130/0/1109", "eta.puffer.zustand", true, false, "Puffer Zustand", "string", "", "state", ""] ,["/120/10101/0/0/12080", "eta.hk.1.zustand", true, false, "Heizkreis Zustand", "string", "", "state", ""] ,["/120/10101/0/0/19391", "eta.hk.1.info", true, false, "Heizkreis Info", "string", "", "state", ""] ,["/120/10101/0/0/12241", "eta.hk.1.vorlauf", true, false, "Heizkreis Vorlauf", "number", "°C", "value.temperature", ""] ,["/120/10101/0/0/12111", "eta.hk.1.heizkurve", true, false, "Heizkreis Heizkurve", "number", "°C", "value.temperature", ""] ,["/120/10101/0/11124/0", "eta.hk.1.pumpe", true, false, "Heizkreis Pumpe", "string", "", "state", ""] ,["/120/10101/0/11124/2001", "eta.hk.1.anforderung", true, false, "Heizkreis Anforderung", "string", "", "state", ""] ,["/40/10021/0/0/19402", "eta.kessel.aktion", true, false, "Kessel", "string", "", "state", ""] ,["/40/10021/0/11123/2002", "eta.kessel.pumpe", true, false, "Kesselpumpe", "string", "", "state", ""] ,["/40/10021/0/0/12153", "eta.kessel.vollast", true, false, "Kessel Vollaststunden", "string", "", "state", ""] ,["/40/10021/0/0/12016", "eta.kessel.verbrauch", true, false, "Kessel Gesamtverbrauch", "number", "kg", "state", ""] ,["/40/10021/0/0/12013", "eta.kessel.aschebox", true, false, "Kessel Verbrauch seit Aschebox", "number", "kg", "state", ""] ,["/40/10021/0/0/12180", "eta.kessel.druck", true, false, "Kessel Druck", "number", "bar", "state", ""] ,["/40/10021/0/0/12001", "eta.kessel.soll", true, false, "Kessel Soll", "number", "°C", "state", ""] ,["/40/10021/0/0/12161", "eta.kessel.ist", true, false, "Kessel Ist", "number", "°C", "state", ""] ,["/40/10021/0/0/12162", "eta.kessel.abgasgtemp", true, false, "Kessel Abgastemperatur", "number", "°C", "state", ""] ,["/40/10021/0/0/12165", "eta.kessel.abgasgeblaese", true, false, "Kessel Abgasgebläse", "number", "U/min", "state", ""] ,["/40/10021/0/0/12164", "eta.kessel.restsauerstoff", true, false, "Kessel Restsauerstoff", "number", "%", "state", ""] ,["/40/10021/0/0/12080", "eta.kessel.zustand", true, false, "Kessel Zustand", "string", "", "state", ""] ,["/40/10201/0/0/12015", "eta.lager.silo", true, false, "Pellets Silo", "number", "kg", "state", ""] ,["/40/10021/0/0/12011", "eta.lager.tag", true, false, "Pellets Tagesbehälter", "number", "kg", "state", ""] ,["/40/10241/0/0/12197", "eta.system.aussentemperatur", true, false, "Aussentemperatur", "number", "°C", "state", ""] ]; etaVars.forEach(function(etaVar){ createState(objectInstanz + etaVar[1], 0, { read: etaVar[2], write: etaVar[3], name: etaVar[4], type: etaVar[5], unit: etaVar[6], role: etaVar[7] }); }); schedule("*/7 * * * *", function () { pollETA(); }); pollETA(); function pollETA() { // console.log("** Polling ETA Variables"); etaVars.forEach(function(etaVar){ http.get(etaIP + etaVar[0], function (http_res) { // initialize the container for our data var data = ""; // this event fires many times, each time collecting another piece of the response http_res.on("data", function (chunk) { // append this chunk to our growing `data` var data += chunk; // console.log("** ETA chunk: " + chunk); }); // this event fires *one* time, after all the `data` events/chunks have been gathered http_res.on("end", function () { // console.log("** ETA data: " + data); try { var doc = new dom().parseFromString(data); var select = xpath.useNamespaces({"eta": "http://www.eta.co.at/rest/v1"}); var strValue = (select('//eta:value/@strValue', doc)[0].nodeValue); var text = (select('//eta:value/text()', doc)[0].nodeValue); var scaleFactor = (select('//eta:value/@scaleFactor', doc)[0].nodeValue); var unit = (select('//eta:value/@unit', doc)[0].nodeValue); var value = ""; if (etaVar[5]=="number") { value = text * 1.0 / scaleFactor; } else { value = strValue; } /* console.log("**** ETA " + etaVar[0] + " @strValue: " + strValue); console.log("**** ETA " + etaVar[0] + " @unit: " + unit); console.log("**** ETA " + etaVar[0] + " text() : " + text); console.log("**** ETA " + etaVar[0] + " @scaleFactor: " + scaleFactor); console.log("** ETA [" + etaVar[4] + "]: " + value + " " + unit); */ setState(objectInstanz + etaVar[1], value, true); } catch (e) { log("ETA: Cannot set data "+ etaVar[2] +":" + e, 'error'); } }); }); }); log(formatDate(new Date(), "DD. O YYYY hh:mm"), "info"); }
Vielleicht hilft es jemandem....
-
@tcfigge Nicht zu vergessen... ggf. müssen die lokalen Adressen der Objekte bei Euch noch ausgelesen und angepasst werden falls auf Euren Heizungen andere Boards/zusätzlicher HK verwendet wurden.
- Eure Adressen erhaltet Ihr über die lokal freigeschaltete ETA API: http://lokale-adresse:8080/user/menu
- Welche Variablen Ihr auslesen und in welche Objektstrukturen schreiben wollt definiert Ihr dann in dem etaVars Array (inkl. Formatierung etc.)
Ich hatte auch mal vor vielen Jahren einen Adapter dafür geschrieben, der hatte aber leider nie zuverlässig funktioniert...
-
ModbusTCP läuft bei mir schon ewig absolut ohne Probleme. Intervall hab ich 15s. Kleiner wie Pollintervall (bei mir ~3000ms) führt natürlich unweigerlich zu Problemen.
-
@warp735 Reine Neugier… Bleiben die Einstellungen für Modbus in der Heizung erhalten wenn diese neu gestartet bzw. mal ausgeschaltet wird (stromlos)?