Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
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
    15
    1
    513

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    1.9k

(Anfänger) XML Auslesen und Datenpunkt erstellen

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
11 Beiträge 4 Kommentatoren 3.2k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • AlCalzoneA Offline
    AlCalzoneA Offline
    AlCalzone
    Developer
    schrieb am zuletzt editiert von
    #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 Antwort Letzte Antwort
    0
    • dietlmanD Offline
      dietlmanD Offline
      dietlman
      schrieb am zuletzt editiert von
      #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 Antwort Letzte Antwort
      0
      • AlCalzoneA Offline
        AlCalzoneA Offline
        AlCalzone
        Developer
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        0
        • dietlmanD Offline
          dietlmanD Offline
          dietlman
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          0
          • dietlmanD Offline
            dietlmanD Offline
            dietlman
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            0
            • AlCalzoneA Offline
              AlCalzoneA Offline
              AlCalzone
              Developer
              schrieb am zuletzt editiert von
              #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 Antwort Letzte Antwort
              0
              • dietlmanD Offline
                dietlmanD Offline
                dietlman
                schrieb am zuletzt editiert von
                #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 Antwort Letzte Antwort
                0
                • paul53P Offline
                  paul53P Offline
                  paul53
                  schrieb am zuletzt editiert von
                  #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 Antwort Letzte Antwort
                  0
                  • dietlmanD Offline
                    dietlmanD Offline
                    dietlman
                    schrieb am zuletzt editiert von
                    #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 Antwort Letzte Antwort
                    0
                    • J Offline
                      J Offline
                      jerry
                      schrieb am zuletzt editiert von
                      #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 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      544

                      Online

                      32.6k

                      Benutzer

                      81.9k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe