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. Skripten / Logik
  4. (Anfänger) XML Auslesen und Datenpunkt erstellen

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.3k

(Anfänger) XML Auslesen und Datenpunkt erstellen

Scheduled Pinned Locked Moved Skripten / Logik
11 Posts 4 Posters 3.2k Views
  • 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.
  • dietlmanD Offline
    dietlmanD Offline
    dietlman
    wrote on last edited by
    #1

    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
    0
    • AlCalzoneA Offline
      AlCalzoneA Offline
      AlCalzone
      Developer
      wrote on last edited by
      #2

      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?

      Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

      1 Reply Last reply
      0
      • dietlmanD Offline
        dietlmanD Offline
        dietlman
        wrote on last edited by
        #3

        @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
        0
        • AlCalzoneA Offline
          AlCalzoneA Offline
          AlCalzone
          Developer
          wrote on last edited by
          #4

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

          Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

          1 Reply Last reply
          0
          • dietlmanD Offline
            dietlmanD Offline
            dietlman
            wrote on last edited by
            #5

            @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
            0
            • dietlmanD Offline
              dietlmanD Offline
              dietlman
              wrote on last edited by
              #6

              @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
              0
              • AlCalzoneA Offline
                AlCalzoneA Offline
                AlCalzone
                Developer
                wrote on last edited by
                #7

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

                Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                1 Reply Last reply
                0
                • dietlmanD Offline
                  dietlmanD Offline
                  dietlman
                  wrote on last edited by
                  #8

                  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
                  0
                  • paul53P Offline
                    paul53P Offline
                    paul53
                    wrote on last edited by
                    #9

                    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
                    
                    

                    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                    1 Reply Last reply
                    0
                    • dietlmanD Offline
                      dietlmanD Offline
                      dietlman
                      wrote on last edited by
                      #10

                      @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
                      0
                      • J Offline
                        J Offline
                        jerry
                        wrote on last edited by
                        #11

                        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
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        792

                        Online

                        32.6k

                        Users

                        82.2k

                        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