Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Entwicklung
  4. [Projekt] ETA Heizung

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    762

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    18
    1
    6.1k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.5k

[Projekt] ETA Heizung

Scheduled Pinned Locked Moved Entwicklung
88 Posts 30 Posters 21.5k Views 22 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A amandus99

    @smarttux
    Mach es über ein Skript. Das funktioniert wunderbar über den iobroker. Kannst damit auch steuernd eingreifen wenn du unbedingt magst

    S Offline
    S Offline
    solar-robert
    wrote on last edited by
    #52

    @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 magst

    Kö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.

    A 1 Reply Last reply
    0
    • S solar-robert

      @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 magst

      Kö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.

      A Offline
      A Offline
      amandus99
      wrote on last edited by
      #53

      @solar-robert

      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');
      				}
      			});
      		});
      	});
      	
      
      }
      
      1 Reply Last reply
      0
      • K Kapsville

        @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.
        Bildschirmfoto 2022-08-02 um 11.06.51.png Bildschirmfoto 2022-08-02 um 11.06.45.png

        Habe auch dieses Problem. @gmbh07 konntest du das Problem in der Zwischenzeit lösen?

        frischF Offline
        frischF Offline
        frisch
        wrote on last edited by
        #54

        @kapsville
        Hi hab auch dieses Problem...
        Gibt es eine Lösung?
        LG
        Friedrich

        1 Reply Last reply
        0
        • T tcfigge

          @tcfigge Nach Downgrade auf Javascriptadapter 6.0 läuft es erstmal wieder... ?!?!?

          frischF Offline
          frischF Offline
          frisch
          wrote on last edited by
          #55

          @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

          T 1 Reply Last reply
          0
          • frischF frisch

            @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

            T Offline
            T Offline
            tcfigge
            wrote on last edited by
            #56

            @frisch
            Hi!
            Ich habe das über die Expertenfunktion in der Adapterinstallation gemacht...
            Da gab es die 6.0.0 noch. :man-shrugging:

            Ist das Problem wohl schon bekannt und auf dem Weg der Lösung?

            frischF 1 Reply Last reply
            0
            • T tcfigge

              @frisch
              Hi!
              Ich habe das über die Expertenfunktion in der Adapterinstallation gemacht...
              Da gab es die 6.0.0 noch. :man-shrugging:

              Ist das Problem wohl schon bekannt und auf dem Weg der Lösung?

              frischF Offline
              frischF Offline
              frisch
              wrote on last edited by
              #57

              @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
              11b35b1a-a5f9-4775-ae05-833cb71870b0-image.png

              Jetzt bekomme ich die Werte.
              Das Script meldet aber noch ein paar Fehlermeldungen (aber es läuft)...

              PS: bin blutiger Anfänger...

              1 Reply Last reply
              0
              • KH OstnerK Offline
                KH OstnerK Offline
                KH Ostner
                wrote on last edited by
                #58

                @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 :man-shrugging:

                M 1 Reply Last reply
                0
                • KH OstnerK KH Ostner

                  @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 :man-shrugging:

                  M Offline
                  M Offline
                  merlinfive
                  wrote on last edited by
                  #59

                  Ich habe auch mal das Script genommen und bekomme zwar Werte aber habe auch reichlich Fehlermeldungen

                  3e300e89-2c56-44ff-934f-04be49d2cad5-image.png

                  auch stimmen einige Infos nicht z.B. Ein [heizen]
                  4697c7b1-1527-4022-9863-962136ac9e98-image.png

                  ich lese die Werte parallel mit dem parser aus dort sind sie richtig
                  dc784e10-4079-4f06-a1ee-1cc0a272616c-image.png

                  any hints ?

                  C 1 Reply Last reply
                  0
                  • M merlinfive

                    Ich habe auch mal das Script genommen und bekomme zwar Werte aber habe auch reichlich Fehlermeldungen

                    3e300e89-2c56-44ff-934f-04be49d2cad5-image.png

                    auch stimmen einige Infos nicht z.B. Ein [heizen]
                    4697c7b1-1527-4022-9863-962136ac9e98-image.png

                    ich lese die Werte parallel mit dem parser aus dort sind sie richtig
                    dc784e10-4079-4f06-a1ee-1cc0a272616c-image.png

                    any hints ?

                    C Offline
                    C Offline
                    CaneTLOTW
                    wrote on last edited by
                    #60

                    @merlinfive

                    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?

                    1 Reply Last reply
                    0
                    • HerryH Herry

                      @catnipper
                      ich habe mich an deinen Adapter versucht und nach ein paar Änderungen läuft er sehr gut. Trotzdem sind noch ein paar "undefinierbare" Fehler vorhanden, was aber komischerweise nicht am Ergebnis zur Erzeugung der Daten beiträgt.
                      Ich denke auch, das hat mit dem jeweiligen System und dessen Software zu tun.
                      Bei mir läuft das ganze auf einem Raspberry 4, 4 GB Ram problemlos und schnell.

                      ETA_VIS.jpg

                      Realisiert habe ich das über ioBroker und Vis. Die Darstellung ist sehr einfach gehalten, da der Monitor im Hausgang hängt und für jeden verständlich sein soll.
                      Hier noch die Anpassungen am Script:

                      Script.jpg

                      Zur Visualisierung läuft auf dem Raspberry auch noch Magic Mirror 2 und das sieht dann so aus:

                      MM-Display_cplt.jpg

                      Vielen Dank für deine großartige Arbeit mit dem Adapter !

                      C Offline
                      C Offline
                      CaneTLOTW
                      wrote on last edited by
                      #61

                      @herry

                      Ich schließe mich der Frage mal!
                      Wäre ein super Startpunkt, bevor man kompltte von 0 anfangen muss :)

                      1 Reply Last reply
                      0
                      • K Kapsville

                        @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.
                        Bildschirmfoto 2022-08-02 um 11.06.51.png Bildschirmfoto 2022-08-02 um 11.06.45.png

                        Habe auch dieses Problem. @gmbh07 konntest du das Problem in der Zwischenzeit lösen?

                        R Offline
                        R Offline
                        Rille06
                        wrote on last edited by
                        #62

                        @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.

                        C K 2 Replies Last reply
                        0
                        • R Rille06

                          @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.

                          C Offline
                          C Offline
                          CaneTLOTW
                          wrote on last edited by CaneTLOTW
                          #63

                          @rille06

                          Ich komme mit modbus auch nicht weiter, kannst du dir das hier mal anschauen.
                          Irgendwas musst du anders/besser gemacht haben:

                          https://github.com/ioBroker/ioBroker.modbus/issues/388

                          R 1 Reply Last reply
                          0
                          • C CaneTLOTW

                            @rille06

                            Ich komme mit modbus auch nicht weiter, kannst du dir das hier mal anschauen.
                            Irgendwas musst du anders/besser gemacht haben:

                            https://github.com/ioBroker/ioBroker.modbus/issues/388

                            R Offline
                            R Offline
                            Rille06
                            wrote on last edited by
                            #64

                            @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.
                            ETA-Modbus.png

                            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.

                            1 Reply Last reply
                            0
                            • T Offline
                              T Offline
                              tcfigge
                              wrote on last edited by
                              #65

                              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....

                              C ronin_mnR 2 Replies Last reply
                              0
                              • T tcfigge

                                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....

                                C Offline
                                C Offline
                                catnipper
                                wrote on last edited by
                                #66

                                @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...

                                1 Reply Last reply
                                0
                                • W Offline
                                  W Offline
                                  warp735
                                  wrote on last edited by
                                  #67

                                  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.

                                  C 1 Reply Last reply
                                  0
                                  • W warp735

                                    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.

                                    C Offline
                                    C Offline
                                    catnipper
                                    wrote on last edited by
                                    #68

                                    @warp735 Reine Neugier… Bleiben die Einstellungen für Modbus in der Heizung erhalten wenn diese neu gestartet bzw. mal ausgeschaltet wird (stromlos)?

                                    W 1 Reply Last reply
                                    0
                                    • C catnipper

                                      @warp735 Reine Neugier… Bleiben die Einstellungen für Modbus in der Heizung erhalten wenn diese neu gestartet bzw. mal ausgeschaltet wird (stromlos)?

                                      W Offline
                                      W Offline
                                      warp735
                                      wrote on last edited by
                                      #69

                                      @catnipper
                                      Selbstverständlich... An/Aus Update stromlos... alles kein Problem

                                      C 1 Reply Last reply
                                      0
                                      • W warp735

                                        @catnipper
                                        Selbstverständlich... An/Aus Update stromlos... alles kein Problem

                                        C Offline
                                        C Offline
                                        catnipper
                                        wrote on last edited by
                                        #70

                                        @warp735 super, dann schaue ich mir das auch mal an! Scheint besser als mein ursprünglicher Adapter oder auch die JS Lösung mit dem Gefummel mit den URI‘s und Konvertierung!

                                        W 1 Reply Last reply
                                        0
                                        • C catnipper

                                          @warp735 super, dann schaue ich mir das auch mal an! Scheint besser als mein ursprünglicher Adapter oder auch die JS Lösung mit dem Gefummel mit den URI‘s und Konvertierung!

                                          W Offline
                                          W Offline
                                          warp735
                                          wrote on last edited by
                                          #71

                                          @catnipper
                                          Ja, viel besser. Auch das steuern klappt so super zuverlässig und ist 100x einfacher

                                          T 1 Reply Last reply
                                          0

                                          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                                          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                                          With your input, this post could be even better 💗

                                          Register Login
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          486

                                          Online

                                          32.8k

                                          Users

                                          82.7k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Home
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe