Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. (Anfänger) XML Auslesen und Datenpunkt erstellen

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    (Anfänger) XML Auslesen und Datenpunkt erstellen

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

      Brauche bitte wieder mal etwas Hilfe mit dem Auslesen eines XML file:

      Habe eine URL welche mir folgenden Inhalt als XML ausgibt und ich würde gerne die rot markierten Werte auslesen, bzw. einen Datenpunkt erstellen damit ich dann darauf zugreifen kann und visualiseiren kann:

      <val:root xmlns:val="<URL url=" http:/www.hw-group.com/xmlschema/ste/values.xsd"="">http://www.hw-group.com/XMLSchema/ste/values.xsd">

      <agent><version>2.1.2</version>

      <xmlver>1.01</xmlver>

      <devicename>boiler-temp.</devicename>

      <model>33</model>

      <vendor_id>0</vendor_id>

      <mac>00:0A:59:04:50:29</mac>

      <ip>192.168.1.189</ip>

      <mask>255.255.255.0</mask>

      <sys_name>Boiler</sys_name>

      <sys_location><sys_contact>HWg-STE:For more information try http://www.hw-group.com</sys_contact></sys_location></agent>

      <senset><entry><id>215</id>

      <name>Boiler Temp.</name>

      <units>C</units>

      <value>56.2</value>

      <min>40.0</min>

      <max>69.0</max>

      <hyst>1.0</hyst>

      <emailsms>1</emailsms>

      <state>1</state></entry></senset></val:root>

      Vielleicht kann jemand helfen,

      Danke!

      1 Reply Last reply Reply Quote 0
      • AlCalzone
        AlCalzone Developer last edited by

        Quick'n'Dirty in JavaScript. Funktioniert nur, wenn die Tags in der Reihenfolge und nur 1x auftreten.

        Dazu muss zuvor der Inhalt der XML-Datei in die Variable xmlString geladen werden.

        const regex = /\<name\>([^\<]+)\<\/Name\>\s*\<units\>([^\<]+)\<\/Units\>\s*\<value\>([^\<]+)\<\/Value\>/igm;
        const matches = regex.exec(xmlString);
        
        const name = matches[1];
        const units = matches[2];
        const value = +matches[3];</value\></units\></name\> 
        

        Dann hast du die Werte in den 3 Variablen name, units und value. Kriegst du das mit dem Datenpunkt selbst hin?

        1 Reply Last reply Reply Quote 0
        • dietlman
          dietlman last edited by

          @AlCalzone:

          Quick'n'Dirty in JavaScript. Funktioniert nur, wenn die Tags in der Reihenfolge und nur 1x auftreten.

          Dazu muss zuvor der Inhalt der XML-Datei in die Variable xmlString geladen werden.

          const regex = /\<name\>([^\<]+)\<\/Name\>\s*\<units\>([^\<]+)\<\/Units\>\s*\<value\>([^\<]+)\<\/Value\>/igm;
          const matches = regex.exec(xmlString);
          
          const name = matches[1];
          const units = matches[2];
          const value = +matches[3];</value\></units\></name\> 
          

          Dann hast du die Werte in den 3 Variablen name, units und value. Kriegst du das mit dem Datenpunkt selbst hin? `

          Danke, werd das so mal versuchen heute Abend, das mit dem Datenpunkt bekomme ich nicht selber hin, vielleicht kannst du mir dabei auch helfen.

          Noch eine Frage; würde das Abfragen der xml mit dem Parser Adapter auch funktionieren?

          LG

          1 Reply Last reply Reply Quote 0
          • AlCalzone
            AlCalzone Developer last edited by

            @dietlman:

            Danke, werd das so mal versuchen heute Abend, das mit dem Datenpunkt bekomme ich nicht selber hin, vielleicht kannst du mir dabei auch helfen. `
            Dann mach dir mal Gedanken, wie der heißen soll und so. Soll die ausgelesene Einheit mit gespeichert werden (und evtl aktualisiert)?

            @dietlman:

            Noch eine Frage; würde das Abfragen der xml mit dem Parser Adapter auch funktionieren? `
            Bestimmt, aber den hab ich noch nie benutzt. Da muss jemand anders weiterhelfen.

            1 Reply Last reply Reply Quote 0
            • dietlman
              dietlman last edited by

              @AlCalzone:

              @dietlman:

              Danke, werd das so mal versuchen heute Abend, das mit dem Datenpunkt bekomme ich nicht selber hin, vielleicht kannst du mir dabei auch helfen.
              Dann mach dir mal Gedanken, wie der heißen soll und so. Soll die ausgelesene Einheit mit gespeichert werden (und evtl aktualisiert)?

              der Datenpunkt sollte "boiler-temp" heissen und die ausgelesene Einheit sollte auch gespeichert werden und ich würde das Script dann einmal pro Minute laufen lassen.

              Parser hab ich mir inzwischen angeschaut, aber ich denke ein Javascript ist doch besser.

              1 Reply Last reply Reply Quote 0
              • dietlman
                dietlman last edited by

                @dietlman:

                @AlCalzone:

                Quick'n'Dirty in JavaScript. Funktioniert nur, wenn die Tags in der Reihenfolge und nur 1x auftreten.

                Dazu muss zuvor der Inhalt der XML-Datei in die Variable xmlString geladen werden.

                const regex = /\<name\>([^\<]+)\<\/Name\>\s*\<units\>([^\<]+)\<\/Units\>\s*\<value\>([^\<]+)\<\/Value\>/igm;
                const matches = regex.exec(xmlString);
                
                const name = matches[1];
                const units = matches[2];
                const value = +matches[3];</value\></units\></name\> 
                

                Dann hast du die Werte in den 3 Variablen name, units und value. Kriegst du das mit dem Datenpunkt selbst hin? `

                Danke, werd das so mal versuchen heute Abend, das mit dem Datenpunkt bekomme ich nicht selber hin, vielleicht kannst du mir dabei auch helfen.

                Noch eine Frage; würde das Abfragen der xml mit dem Parser Adapter auch funktionieren?

                LG `

                hab das script mal so gemacht, funktioniert aber leider nicht

                var xmlString = 'http://192.168.1.189:88/values.xml';

                const regex = /<name>([^<]+)</Name>\s*<units>([^<]+)</Units>\s*<value>([^<]+)</Value>/igm;

                const matches = regex.exec(xmlString);

                const name = matches[1];

                const units = matches[2];

                const value = +matches[3];

                bekomme diesen Fehler im browser angezeigt:

                Uncaught TypeError: Cannot read property '1' of null</value></units></name>

                1 Reply Last reply Reply Quote 0
                • AlCalzone
                  AlCalzone Developer last edited by

                  Naja, so durchsuchst du den String "http://192.168.1.189:88/values.xml" nach dem Datenpunkt und nicht die Datei selbst 😉

                  Die musst du herunterladen und den Inhalt durchsuchen.

                  Probiers mal so:

                  var request = require('request');
                  
                  // diesen Teil mit CRON ausführen
                  function doWork() {
                  request('http://192.168.1.189:88/values.xml', function (error, response, body) {
                  	if (error) {
                  		log("Fehler beim Herunterladen: " + error);
                  		return;
                  	} 
                  	const regex = /\<name\>([^\<]+)\<\/Name\>\s*\<units\>([^\<]+)\<\/Units\>\s*\<value\>([^\<]+)\<\/Value\>/igm;
                  	try {
                  		const matches = regex.exec(body);
                  
                  		const name = matches[1];
                  		const unit = "°" + matches[2];
                  		const value = +matches[3];
                  
                  		// Habe hier createState verwendet, falls sich irgendwann die Einheit ändert. Dann sollte das übernommen werden
                  		createState("boiler-temp", value, true, {
                  			type: "number",
                  			unit: unit,
                  			read: true,
                  			write: false,
                  			role: "value.temperature"
                  		});
                  	} catch (e) {
                  		log("Fehler beim Auswerten: " + error);
                  	}
                  });
                  });
                  
                  // jede Minute ausführen:
                  schedule("* * * * *", doWork);</value\></units\></name\> 
                  
                  1 Reply Last reply Reply Quote 0
                  • dietlman
                    dietlman last edited by

                    Hi und danke,

                    aber irgendwas scheint nicht zu passen im Script, siehe screenshot:
                    3139_screen_shot_2017-08-26_at_07.33.32.png

                    1 Reply Last reply Reply Quote 0
                    • paul53
                      paul53 last edited by

                      Anstelle von RegExp würde ich das zusätzliche NPM-Modul "xml2js" in die Konfiguration der JS-Instanz eintragen und dieses verwenden. Name und Masseinheit werden sich sicherlich nicht ändern (warum sollten sie ?).

                      const request = require('request');
                      const parser = require('xml2js').parseString;
                      
                      createState('Kesseltemperatur', 0, {
                          type: 'number',
                          unit: '°C',
                          read: true,
                          write: false,
                          role: 'value.temperature'
                      });
                      
                      function getTemp(xml) {
                          parser(xml, {explicitArray: false, explicitRoot: false}, function(err, obj) {
                              if(err) log('Fehler XML-Parsen: ' + err, 'error');
                              else {
                                  var temp = parseFloat(obj.SenSet.Entry.Value);
                                  setState('Kesseltemperatur', temp, true);
                              }
                          });
                      }
                      
                      function getXML() {
                          request('http://192.168.1.189:88/values.xml', function (error, response, body) {
                              if (error) log("Fehler beim Herunterladen: " + error, 'error');
                              else getTemp(body);
                          });
                      }
                      
                      schedule('* * * * *', getXML);  // jede Minute
                      
                      
                      1 Reply Last reply Reply Quote 0
                      • dietlman
                        dietlman last edited by

                        @paul53:

                        Anstelle von RegExp würde ich das zusätzliche NPM-Modul "xml2js" in die Konfiguration der JS-Instanz eintragen und dieses verwenden. Name und Masseinheit werden sich sicherlich nicht ändern (warum sollten sie ?).

                        const request = require('request');
                        const parser = require('xml2js').parseString;
                        
                        createState('Kesseltemperatur', 0, {
                            type: 'number',
                            unit: '°C',
                            read: true,
                            write: false,
                            role: 'value.temperature'
                        });
                        
                        function getTemp(xml) {
                            parser(xml, {explicitArray: false, explicitRoot: false}, function(err, obj) {
                                if(err) log('Fehler XML-Parsen: ' + err, 'error');
                                else {
                                    var temp = parseFloat(obj.SenSet.Entry.Value);
                                    setState('Kesseltemperatur', temp, true);
                                }
                            });
                        }
                        
                        function getXML() {
                            request('http://192.168.1.189:88/values.xml', function (error, response, body) {
                                if (error) log("Fehler beim Herunterladen: " + error, 'error');
                                else getTemp(body);
                            });
                        }
                        
                        schedule('* * * * *', getXML);  // jede Minute
                        
                        ```` `  
                        

                        Hi Paul!

                        Vielen Dank! Genauso funktioniert es perfekt.!! 🙂

                        1 Reply Last reply Reply Quote 0
                        • J
                          jerry last edited by

                          Ich habe ein ähnliches Problem, mein Kessel gibt es so:

                          Anfrage:

                          http://192.168.0.104/getregister.cgi?de … tkot_value

                          Antwort:

                          cmd status="ok">

                          Ich habe jedoch sowohl in Node-RED als auch in JScripten ich habe ein Problem mit der Autorisierung.

                          node-red anwort:

                          ...

                          eCoal WebServer

                          401 Unauthorized
                          ...

                          so wie man hinzufügt berechtigung für dieses Skript?

                          http://root:root@192.168.0.104/getregis ... tkot_value

                          es funktioniert nicht.

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          901
                          Online

                          31.6k
                          Users

                          79.6k
                          Topics

                          1.3m
                          Posts

                          4
                          11
                          2843
                          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