Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Einsteigerfragen
    4. Einbindung von Geräten
    5. Rest API, Value von Gerät auslesen, In Datenpunkt schreiben

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Rest API, Value von Gerät auslesen, In Datenpunkt schreiben

    This topic has been deleted. Only users with topic management privileges can see it.
    • W
      wusa last edited by wusa

      Hallo zusammen,

      ich bin momentan auf der Suche nach eine Möglichkeit, ein Gerät (genauer gesagt meine Heizung) auszulesen.
      Momentan mache ich das mit einem selbst geschriebenen Python Skript.
      Gerne würde ich allerdings mal etwas neues testen.

      Ich kann auf die Rest API per Link zugreifen. Link sieht wie folgt aus:
      http://192.168.7.5:8080/user/var/120/10251/0/0/12242

      Die Ausgabe sieht wie folgt aus:
      a8c8853d-becd-4095-9901-3df7d1366cf0-image.png

      Hier kann ich "strValue" abgreifen und habe einen Wert aus dem Puffer.

      Es gibt hier noch viele Werte mehr.

      Wie könnte ich das jetzt am besten machen? Mit einem Blockly?
      So hättee ich gestartet, allerdings komme nicht nicht ganz weiter:

      59887068-8638-47e4-9d43-1082cd0fc8b6-image.png

      Würde mich über einen Tipp freuen.

      Danke

      Codierknecht 1 Reply Last reply Reply Quote 0
      • Codierknecht
        Codierknecht Developer Most Active @wusa last edited by Codierknecht

        @wusa
        Der "Aktualisiere" Block muss in das "offene Maul" des Request-Blocks.
        Sonst wird der ausgeführt bevor der Request ein Ergebnis erhalten hat.

        Und so ganz am Rande: Am "Request" steht nicht umsonst "deprecated" dran.
        Nimm den neuen Http-Get-Block.

        0e7d3776-a5c7-4925-8bad-eddd96a5c9fe-image.png

        Edit
        Bitte keine Bilder von Texten wie z.B. XML. Daraus kann man nicht zitieren oder kopieren.
        Stattdessen den Text in Code-Tags </> posten.

        W 1 Reply Last reply Reply Quote 0
        • W
          wusa @Codierknecht last edited by

          @codierknecht sagte in Rest API, Value von Gerät auslesen, In Datenpunkt schreiben:

          Ich habe das ganze jetzt mit dem Http Get Block nachgebaut.
          Allerdings erhalte ich eine Fehlermeldung. Ich vermute, dass der strValue Wert nicht sauber ausgelesen werden kann.

          <eta xmlns="http://www.eta.co.at/rest/v1" version="1.0">
          <value advTextOffset="0" unit="°C" uri="/user/var/120/10251/0/0/12242" strValue="59" scaleFactor="10" decPlaces="0">588</value>
          </eta>
          

          114c2968-46e9-444a-bb1a-9cd85eaa2609-image.png

          38d9cda8-074c-46b7-ad6e-9ee9ebdc88d8-image.png

          OliverIO 1 Reply Last reply Reply Quote 0
          • OliverIO
            OliverIO @wusa last edited by

            @wusa

            das sieht nach folgefehler.
            die erste meldung sagt was, das nicht innerhalb von 2 sekunden geantwortet wurde. wahrscheinlich ist noch ein fehler in der anfrage.

            W 1 Reply Last reply Reply Quote 0
            • W
              wusa @OliverIO last edited by

              @oliverio
              Rufe ich den Link im Browser auf, funktioniert dieser Link ohne Probleme.

              OliverIO 1 Reply Last reply Reply Quote 0
              • OliverIO
                OliverIO @wusa last edited by

                @wusa

                wie sieht dein python skript genau aus?
                gibt es noch header die da gesetzt werden?

                W 1 Reply Last reply Reply Quote 0
                • W
                  wusa @OliverIO last edited by wusa

                  @oliverio

                  puffer_oben = 'http://192.168.7.5:8080/user/var/120/10251/0/0/12242'
                  
                  uClient = uReq(puffer_oben)
                  puffer_oben_temp = uClient.read()
                  
                  puffer_oben_soup = soup(puffer_oben_temp, "html.parser")
                  puffer_oben_value = puffer_oben_soup.value
                  puffer_oben_temperatur = puffer_oben_value.get('strvalue')
                  print(puffer_oben_temperatur)
                  
                  OliverIO 1 Reply Last reply Reply Quote 0
                  • OliverIO
                    OliverIO @wusa last edited by

                    @wusa sagte in Rest API, Value von Gerät auslesen, In Datenpunkt schreiben:

                    uReq

                    nochmal ne andere fremd bibliothek und nicht nur native python objekte.
                    das ist dann schwieriger.

                    also wenn du im browser die f12 drückst und in den networktab gehst
                    und dann den link aufrufst, kannst du den genauen request und den reponse vom server dir anzeigen lassen. der browser baut da eine menge headers noch mit dazu, die aber oft alle nicht notwendig sind. welcher header es konkret ist, was jetzt deine api fehlt kann ich nicht sagen.

                    leider sagt die rest doku dazu auch nix
                    https://www.meineta.at/javax.faces.resource/downloads/ETA-RESTful-v1.2.pdf.xhtml?ln=default&v=0

                    was ureq da noch dazubastelt ist aufgrund von komplexität jetzt auch nicht ermittelbar. ich hab hier geschaut
                    https://github.com/algesten/ureq

                    die wahrscheinlicsten header sind:
                    Content-Type: application/xml
                    und/oder
                    Content-Encoding: utf-8
                    evtl auch noch
                    user-agent

                    W 1 Reply Last reply Reply Quote 0
                    • W
                      wusa @OliverIO last edited by wusa

                      @oliverio

                      Ich habe als Zwischenschritt auch einen HTML Parser. Vielleicht ist das dann keine klassische REST API Abfrage.

                      Mit regex könnte es vielleicht funktionieren. Aber da kenne ich mich nicht aus.

                      Das ist die Ausgabe von Network im Browser mit F12:
                      a9ef05ea-8128-4883-aea2-e4bcd8e0829e-image.png

                      Das sind die Libs, welche ich eingebunden habe.

                      import bs4
                      import time
                      import requests
                      from urllib.request import urlopen as uReq
                      from bs4 import BeautifulSoup as soup
                      from influxdb import InfluxDBClient
                      
                      OliverIO 1 Reply Last reply Reply Quote 0
                      • OliverIO
                        OliverIO @wusa last edited by OliverIO

                        @wusa

                        es gibt einen adapter
                        https://github.com/frankhirsch/ioBroker.etamon/tree/master

                        dort ist ein javascript beispiel, das nicht die javascript-adapter methode sondern native node module verwendet.
                        evtl hilft das weiter
                        evtl reicht ja auch einfach der adapter

                        W 1 Reply Last reply Reply Quote 0
                        • W
                          wusa @OliverIO last edited by

                          @oliverio
                          Den Adapter kenne ich, aber der ist schon 5 Jahre alt. Entwicklung ist da keine mehr.
                          Da ich regelmäßig die Updates der Heizung installiere, kommen immer wieder neue Werte hinzu.

                          Könnte ich mir Regex weiter kommen? Kenne mich zwar nicht aus, aber vielleicht gibt es ja irgendwelche Generatoren im Internet.
                          Oder bin ich komplett auf dem Holzweg?

                          OliverIO haus-automatisierung 2 Replies Last reply Reply Quote 0
                          • OliverIO
                            OliverIO @wusa last edited by

                            @wusa

                            ich spreche von dem skript das in der beschreibung enthalten ist

                            var http = require('http');
                            var xpath = require('xpath');
                            var dom = require('xmldom').DOMParser;
                            
                            var etaIP = 'http://192.168.XYZ.XYZ: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",    "hm-rega.0.1810"]
                            	,["/120/10251/0/0/12244",		"eta.puffer.unten",				true, false, "Puffer unten",					"number",	"°C",		"value.temperature",    "hm-rega.0.1811"]
                            	,["/120/10251/0/0/12207",		"eta.puffer.aktion",			true, false, "Puffer Aktion",					"string",	"",			"state",                "hm-rega.0.1809"]
                            	,["/120/10251/0/0/12533",		"eta.puffer.leistung",			true, false, "Puffer Leistung",					"number",	"KW",		"state",                "hm-rega.0.5038"]
                            	,["/120/10251/0/0/12129",		"eta.puffer.zustand",			true, false, "Puffer Zustand",					"string",	"",			"state",                ""]
                            	
                            	,["/120/10101/0/0/12090",		"eta.hk.1.zustand",				true, false, "Heizkreis Zustand",				"string",	"",			"state",                "hm-rega.0.1812"]
                            	,["/120/10101/0/0/12241",		"eta.hk.1.vorlauf",				true, false, "Heizkreis Vorlauf",				"number",	"°C",		"value.temperature",    "hm-rega.0.8047"]
                            	,["/120/10101/0/0/12111",		"eta.hk.1.heizkurve",			true, false, "Heizkreis Heizkurve",				"number",	"°C",		"value.temperature",    "hm-rega.0.8048"]
                            	,["/120/10101/0/11124/0",		"eta.hk.1.pumpe",				true, false, "Heizkreis Pumpe",					"string",	"",			"state",                "hm-rega.0.1813"]
                            	,["/120/10101/0/11124/2001",	"eta.hk.1.anforderung",			true, false, "Heizkreis Anforderung",			"string",	"",			"state",                ""]
                            	
                            	,["/40/10021/0/0/12000",		"eta.kessel.aktion",			true, false, "Kessel",      					"string",	"",			"state",                "hm-rega.0.1822"]
                            	,["/40/10021/0/0/12153",		"eta.kessel.vollast",			true, false, "Kessel Vollaststunden",			"string",	"",		    "state",                "hm-rega.0.1814"]
                            	,["/40/10021/0/0/12016",		"eta.kessel.verbrauch",			true, false, "Kessel Gesmtverbrauch",			"number",	"kg",		"state",                "hm-rega.0.1815"]
                            	,["/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",                "hm-rega.0.1820"]
                            	,["/40/10021/0/0/12001",		"eta.kessel.soll",				true, false, "Kessel Soll",						"number",	"°C",		"state",                "hm-rega.0.5037"]
                            	,["/40/10021/0/0/12161",		"eta.kessel.ist",				true, false, "Kessel Ist",						"number",	"°C",		"state",                "hm-rega.0.3195"]
                            	,["/40/10021/0/0/12162",		"eta.kessel.abgasgtemp",		true, false, "Kessel Abgastemperatur",			"number",	"°C",	    "state",                "hm-rega.0.5040"]
                            	,["/40/10021/0/0/12165",		"eta.kessel.abgasgeblaese",		true, false, "Kessel Abgasgebläse",				"number",	"U/min",	"state",                "hm-rega.0.5039"]
                            	,["/40/10021/0/0/12164",		"eta.kessel.restsauerstoff",	true, false, "Kessel Restsauerstoff",			"number",	"%",		"state",                "hm-rega.0.5041"]
                            	,["/40/10021/0/0/12080",		"eta.kessel.zustand",			true, false, "Kessel Zustand",					"string",	"",			"state",                "hm-rega.0.1808"]
                            	
                            	,["/40/10201/0/0/12015",		"eta.lager.silo",				true, false, "Pellets Silo",					"number",	"kg",		"state",                "hm-rega.0.1817"]
                            	,["/40/10021/0/0/12011",		"eta.lager.tag",				true, false, "Pellets Tagesbehälter",			"number",	"kg",		"state",                "hm-rega.0.9651"]
                            	,["/40/10241/0/0/12197",		"eta.system.aussentemperatur",	true, false, "Aussentemperatur",				"number",	"°C",		"state",                "hm-rega.0.1821"]
                            ];
                            
                            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();
                            });
                            
                            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(etaVar[1], value);
                            					
                            					// Schreibe Variablen zu CCU
                            					if(etaVar[8]!="") {
                            					    setState(etaVar[8], value);
                            					}
                            				}
                            				catch (e) {
                            					log("ETA: Cannot set data "+ etaVar[2] +":" + e, 'error');
                            				}
                            			});
                            		});
                            	});
                            	
                            	var dateFormat = require('dateformat');
                            	var currentdate = new Date();
                            	log(dateFormat(currentdate, "dd. mmm yyyy hh:MM"));
                            	// optional last update in CCU3
                            	setState("hm-rega.0.7022", dateFormat(currentdate, "dd. mmm yyyy hh:MM"));
                            }
                            
                            1 Reply Last reply Reply Quote 0
                            • haus-automatisierung
                              haus-automatisierung Developer Most Active @wusa last edited by

                              @wusa sagte in Rest API, Value von Gerät auslesen, In Datenpunkt schreiben:

                              Könnte ich mir Regex weiter kommen?

                              Ja, einfacher wäre es aber das XML direkt zu parsen. Oder gibt es ggf. einen Parameter, dass man als Antwort gerne JSON statt XML hätte. Was ist das denn für eine Heizung?

                              OliverIO 1 Reply Last reply Reply Quote 0
                              • W
                                wusa last edited by

                                @haus-automatisierung

                                Ich weiß nicht genau was du meinst. Wie die Daten verarbeietet werden, ist mir eigentlich egal. Mir ist nur der Wert von "strValue" wichtig. Da würde ich gerne dran kommen.

                                Es handelt sich um eine ETA Heizung.

                                paul53 1 Reply Last reply Reply Quote 0
                                • OliverIO
                                  OliverIO @haus-automatisierung last edited by OliverIO

                                  @haus-automatisierung sagte in Rest API, Value von Gerät auslesen, In Datenpunkt schreiben:

                                  Ja, einfacher wäre es aber das XML direkt zu parsen

                                  dazu muss er erst einmal die daten abrufen können. da scheint es noch daran zu haken

                                  @wusa
                                  kopiere das gepostete skript einfach mal im javascript adapter in ein skript.
                                  dann trage in den javasceript adapter einstellungen als zusätzliche npm module noch

                                  xpath
                                  xmldom

                                  ein. dann müsste das skript laufen und verschiedene datenpunkt anlegen

                                  den letzten befehl
                                  setState("hm-rega.0.7022", dateFormat(currentdate, "dd. mmm yyyy hh:MM"));
                                  löschen, der könnte für dich nicht passen

                                  haus-automatisierung W 2 Replies Last reply Reply Quote 0
                                  • haus-automatisierung
                                    haus-automatisierung Developer Most Active @OliverIO last edited by

                                    @oliverio Ah, ich habe nicht alle Beiträge genau gelesen. Dachte es liegt nur noch am XML, weil hier ja zuletzt Lösungen zum Parsen geteilt wurden.

                                    Dann das Script mal auf den Verbose-Mode umschalten und ggf. den Timeout im Blockly-Baustein erhöhen.

                                    W 1 Reply Last reply Reply Quote 0
                                    • W
                                      wusa @haus-automatisierung last edited by

                                      @haus-automatisierung

                                      Hier ist nochmal die ganze Seite. So wird es angezeigt.
                                      da9d7edf-8baf-49a9-b339-be0ca151be21-image.png

                                      Es wird von REST API gesprochen. Es kommt aber XML-Datei in der Meldung.
                                      Ich bin mir hier leider auch nicht ganz sicher, wie ich ans Ziel komme.

                                      haus-automatisierung 1 Reply Last reply Reply Quote 0
                                      • W
                                        wusa @OliverIO last edited by

                                        @oliverio
                                        Das könnte funktioniere. Wollte das aber gerne über einen eigenen Adapter oder über das Blockly lösen.
                                        Wenn etwas neues hinzukommt, dann kann man das relative leicht lösen.
                                        Das Skript verstehe ich zb. gar nicht, daher würde ich es gerne umgehen.

                                        Dachte jetzt ehrlich gesagt erstmal an Blockly oder dann an den Parse Adapter.

                                        Codierknecht 1 Reply Last reply Reply Quote 0
                                        • haus-automatisierung
                                          haus-automatisierung Developer Most Active @wusa last edited by

                                          @wusa sagte in Rest API, Value von Gerät auslesen, In Datenpunkt schreiben:

                                          Es wird von REST API gesprochen. Es kommt aber XML-Datei in der Meldung.

                                          Ist doch alles richtig, eine REST-API kann auch XML zurück liefern. Bitte erstmal die Tipps von oben umsetzen. Ist ja soweit auf den ersten Blick alles richtig.

                                          W 1 Reply Last reply Reply Quote 1
                                          • Codierknecht
                                            Codierknecht Developer Most Active @wusa last edited by

                                            @wusa
                                            Wie @haus-automatisierung schon schieb: REST sagt erstmal nix über das Format der Antwort.

                                            Probier vielleicht zuerst mal, den Timeout höher zu setzen und lass Dir die Antwort einfach per Debug-Block ausgeben.
                                            Dann sehen wir weiter.

                                            138f719c-9dcd-4f87-8754-28872f72b737-image.png

                                            W 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            968
                                            Online

                                            31.6k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

                                            5
                                            35
                                            410
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo