Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. gelöst - xml Return in Blockly weiter verarbeiten

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    gelöst - xml Return in Blockly weiter verarbeiten

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

      @thabam

      Das wäre nett, vielen Dank.
      Den xml2json hatte ich im js Adapter auch schon bei den zusätzlichen npm Modulen hinzugefügt, hatte dann aber keine Ahnung wie ich dann damit weiter arbeite.

      Wenn Du mir da helfen könntest, wäre ich dankbar.

      Gruß

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

        @mac89muc
        ja ich denke für die extra bibliotheken gibt es dann keine blockly befehle mehr der man muss im internet schauen
        auch blockly kann erweitert werden.
        in blockly kenn ich mich aber nicht sonderlich gut aus. nur javascript

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

          @mac89muc

          Ok hier mal von meinem Adapter der Code:
          https://github.com/TheBam1990/ioBroker.trivum/blob/main/main.js

          In Zeile 305 ist der Teil der das XML in JSON umwandelt.

          Ansonsten kann ich dir anbieten heute abend 20.30uhr im discord

          mac89muc 1 Reply Last reply Reply Quote 0
          • mac89muc
            mac89muc @TheBam last edited by

            @thebam

            Vielen Dank für Deine Rückinfo. Habe einen Teilerfolg und es mittlerweile mit trail & error geschafft die xml in json zu wandeln mittels xml2json über js und das Ergebnis in einen Datenpunkt zu schreiben.

            Der Code dazu sieht folgendermaßen aus

            var parseString = require('xml2js').parseString;
            var request = require('request');
             
            request('http://192.168.178.125:1400/status/batterystatus', function (error, response, body) {
                if (!error && response.statusCode == 200) {
            		log("Body: " + body);
             
            		parseString(body, {
            				explicitArray: false,
            				mergeAttrs: true
            			}, 
            			function (err, result) {
            				if (err) {
            					log("Fehler: " + err);
            				} else {
            					log("Result: " + JSON.stringify(result.ZPSupportInfo.LocalBatteryStatus.Data.name));
                                setState("javascript.0.variables.Tests.String"/*String*/, (JSON.stringify(result.ZPSupportInfo.LocalBatteryStatus.Data)), true);
            				}
            			});
            	} else  {
            	  log(error);
            	}
            });
            

            Das Ergebnis sieht dann wie folgt aus

            [{"_":"GREEN","name":"Health"},{"_":"100","name":"Level"},{"_":"NORMAL","name":"Temperature"},{"_":"SONOS_CHARGING_RING","name":"PowerSource"}]
            

            Wie muss ich den Code oben erweitern, damit nur der zweite Werteblock {"_":"100","name":"Level"} und daraus der Wert 100 extrahiert wird um ihn dann in den Datenpunkt zu schreiben?

            Viele Grüße

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

              @mac89muc sagte in xml Return in Blockly weiter verarbeiten:

              Das Ergebnis ist ein Array
              Wenn der Wert immer an der 2. stelle ist, dann geht das so

              Für das ganze Element
              JSON.stringify(result.ZPSupportInfo.LocalBatteryStatus.Data[1]

              Für den Wert
              JSON.stringify(result.ZPSupportInfo.LocalBatteryStatus.Data[1][“_“]

              Wenn nicht, muss man das Array durchsuchen und jedes Element mit dem Name Attribute vergleichen.
              https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/find

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

                @oliverio

                Danke für die Hilfe - bin Dank Deiner Hilfe wieder etwas weiter.

                Ausgabe in den Datenpunkt wäre dann "100" - kannst Du mir noch einen Tipp geben, wie ich den Code erweitern muss um die Anführungszeichen beim Ergebnis noch wegzubekommen?

                Anscheinend sind die Anführungszeichen beim Wandel von xml zu json mittels der xml2json Erweiterung mit dazu gekommen.

                Angepasst mit Deinem input sieht er aktuell wie folgt aus

                var parseString = require('xml2js').parseString;
                var request = require('request');
                 
                request('http://192.168.178.125:1400/status/batterystatus', function (error, response, body) {
                    if (!error && response.statusCode == 200) {
                		log("Body: " + body);
                 
                		parseString(body, {
                				explicitArray: false,
                				mergeAttrs: true
                			}, 
                			function (err, result) {
                				if (err) {
                					log("Fehler: " + err);
                				} else {
                					log("Result: " + JSON.stringify(result.ZPSupportInfo.LocalBatteryStatus.Data[1]["_"]));
                                    setState("javascript.0.variables.Tests.String", (JSON.stringify(result.ZPSupportInfo.LocalBatteryStatus.Data[1]["_"])), true);
                				}
                			});
                	} else  {
                	  log(error);
                	}
                });
                

                Gruß

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

                  @mac89muc
                  Wahrscheinlich ist das Ergebnis dann keine Zahl sondern ein String oder der datenpunkt ist eine Zeichenkette

                  String in Zahl umwandeln geht mit parseInt oder parseFloat
                  Den datenpunkt kannst du in den Einstellungen dazu ändern

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

                    @oliverio

                    liegt das nicht eher an der json die aus der xml gewandelt wurde - hier taucht ja schon der Wert mit Anführungszeichen auf "100"

                    Aus dem Werteblock in der xml <Data name="Level">100</Data> wird nach dem Wandel mit xml2json {"_":"100","name":"Level"}

                    Wenn ich mich nicht täusche, müssten die Werte nach dem Doppelpunkt in json dann doch eigentlich ohne Anführungszeichen so stehen - {"_":100,"name":Level} oder?

                    Ich schaffe es nicht die Anführungszeichen direkt beim filtern des Arrays abzuschneiden. Hast Du hierfür evtl. noch den korrekten Code für die Zeile, dann kann ich mir den Umweg mit dem zweiten Datenpunkt etc sparen.

                    So läuft es jetzt wie gesagt über den Umweg bei mir mit folgendem Code

                    setState("javascript.0.variables.Tests.String", (JSON.stringify(result.ZPSupportInfo.LocalBatteryStatus.Data[1]["_"])), true);
                    setState("javascript.0.variables.Tests.Zahl", ((getState("javascript.0.variables.Tests.String").val.slice(1, 4))));
                    

                    EDIT

                    Habe es nun hinbekommen ohne zweiten Datenpunkt - der Fehler beim Wandeln von xml nach json bleibt aber.
                    Wenn hier noch jemand einen Tipp hat wie man den Fehler beheben kann, gerne melden.

                    Ich löse es jetzt so lange mit diesem Code - vielen Dank für eure Hilfe

                    setState("javascript.0.variables.Tests.Zahl", (JSON.stringify(result.ZPSupportInfo.LocalBatteryStatus.Data[1]["_"]).slice(1, 4)), true);
                    
                    OliverIO 1 Reply Last reply Reply Quote 0
                    • OliverIO
                      OliverIO @mac89muc last edited by OliverIO

                      @mac89muc sagte in xml Return in Blockly weiter verarbeiten:

                      @oliverio

                      liegt das nicht eher an der json die aus der xml gewandelt wurde - hier taucht ja schon der Wert mit Anführungszeichen auf "100"

                      Aus dem Werteblock in der xml <Data name="Level">100</Data> wird nach dem Wandel mit xml2json {"_":"100","name":"Level"}

                      Wenn ich mich nicht täusche, müssten die Werte nach dem Doppelpunkt in json dann doch eigentlich ohne Anführungszeichen so stehen - {"_":100,"name":Level} oder?

                      Ich schaffe es nicht die Anführungszeichen direkt beim filtern des Arrays abzuschneiden. Hast Du hierfür evtl. noch den korrekten Code für die Zeile, dann kann ich mir den Umweg mit dem zweiten Datenpunkt etc sparen.

                      So läuft es jetzt wie gesagt über den Umweg bei mir mit folgendem Code

                      setState("javascript.0.variables.Tests.String", (JSON.stringify(result.ZPSupportInfo.LocalBatteryStatus.Data[1]["_"])), true);
                      setState("javascript.0.variables.Tests.Zahl", ((getState("javascript.0.variables.Tests.String").val.slice(1, 4))));
                      

                      EDIT

                      Habe es nun hinbekommen ohne zweiten Datenpunkt - der Fehler beim Wandeln von xml nach json bleibt aber.
                      Wenn hier noch jemand einen Tipp hat wie man den Fehler beheben kann, gerne melden.

                      Ich löse es jetzt so lange mit diesem Code - vielen Dank für eure Hilfe

                      setState("javascript.0.variables.Tests.Zahl", (JSON.stringify(result.ZPSupportInfo.LocalBatteryStatus.Data[1]["_"]).slice(1, 4)), true);
                      

                      Die Funktion parseString der Bibliothek xml2js liefert dir direkt ein Javascript-Objekt zurück.
                      Daher kannst du über die Notation zur Objektreferenz auch auf die Detaildaten weiter tiefer in der Struktur zugreifen.
                      Da dieser Bibliothek die Information fehlt, welche Typen die xml-Felder haben, wird es die meisten Felder einfach in String umwandeln.
                      Daher musst du mit parseInt oder parseFloat diese Werte umwandeln. siehe unten

                      Ich glaube dir ist der Zweck der Befehle JSON.stringify und der gegenbefehl JSON.parse und noch nicht ganz geläufig.

                      JSON.stringify
                      https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

                      Dieser Befehl wandelt dir ein beliebiges javascript objekt (und die einfachen Objekte number,float,boolean und string gehören auch schon dazu) in ein, wie es der name schon sagt, String=Zeichenkette um.
                      Wenn du nun einen Zahlenwert in einen Datenpunk vom Typ Zahl schreiben willst, passiert das wie folgt.
                      man beachte parseInt, dieser Befehl wandelt dir eine Ganzzahl als Text in eine Variable vom Typ number um. Falls du Fließkommazahlen hast, musst du parseFloat nehmen und das Komma sollte ein Punkt sein.

                      setState("javascript.0.variables.Tests.String", (parseInt(result.ZPSupportInfo.LocalBatteryStatus.Data[1]["_"])), true);
                      

                      Der folgende Befehl ist Unsinn

                      JSON.stringify(result.ZPSupportInfo.LocalBatteryStatus.Data[1]["_"]).slice(1, 4))
                      

                      da du aus einem javascript wert einen string machst und dann die Zahl aus dem String herausschneidest.

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

                        @oliverio

                        Vielen Dank für die Erklärung, mit Deiner Hilfe habe ich es jetzt hinbekommen und wieder etwas gelernt, was ich für die nächste Sache nutzen kann.

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        952
                        Online

                        31.7k
                        Users

                        79.8k
                        Topics

                        1.3m
                        Posts

                        3
                        14
                        906
                        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