NEWS
Node-RED Werte aus M-Bus XML Datei auslesen
-
Hallo NodeRed-Fachleute,
im I-Net findet man leider nur wenig Hilfe zu Node-RED, insbesondere deutschsprachige Foren.
Ich würde gerne aus einer xml Datei gewisse Werte auslesen und diese dann per Modbus an einen zentralen Regler übergeben. Ich habe da zwar in der verganenen Nacht etwas hinbekommen, mir erscheint die Lösung aber etwas zu kompliziert zu sein.
Mit diesem Inhalt einer Test.xml habe ich meine Flow getestet:
! <company><employee><name>Chrish</name>
! <age>40</age>
! <salary>$2000,30</salary></employee></company>Mit diesen Nodes habe ich dann die Datei eingelesen:
Das Ergebnis sieht dann so aus:
Die Werte des Objekts in den arrays würde ich nun gerne direkt auslesen und in ein Zahlenformat umwandeln. Ich habe nur leider keine Idee wie man das einfach und schnell umsetzen kann. Irgendwie fehlt mir noch das Verständnis für msg.payload und Co. Ich hatte gehofft nach dem Einlesen der xml Datei könnte man die Werte direkt als Variable weiter verarbeiten?!
Verwundert bin ich über die Menüpunkte Pfad und Wert kopieren. Wenn man Path copied aufruft kommt folgendes Ergebnis: {"company":{"employee":[{"name":["Chrish"],"age":["40"],"salary":["$2000,30"]}]}}. Ebenso lassen sich dann auch die Werte aus dem array(1) auslesen und kopieren.
Zu einem brauchbaren Ergebnis bin ich dann über Umwege gekommen. Aus dem xml Objekt habe ich über ein Node ein Json String erzeugt:
Jeder Versuch die Werte aus dem String auszulesen, endeten aber immer nur in einer Fehlermeldung. Dieser Weg führte nicht nicht zum Ziel. Wie ich im Netz nachlesen konnte, bin ich wohl nicht der Einzige. Dann irgendwann heute in der Früh habe ich die Split-Funktion verstanden und zur Anwendung gebracht. Nun habe ich das gewünschte Ergebnis herausbekommen.
Aber irgendwie werde ich das Gefühl nicht los, dass es viel einfacher gehen müsste. Leider findet man nur wenige Beispiele und Anleitungen zu Node-Red .
Vielleicht habe ich ja Glück und finde hier Experten, oder User mit denen ich mich austauschen kann.
Garf
-
Hallo Garf,
der XML-Node konvertiert das XML in ein JSON-Objekt. Auf die Elemente kann man dann im Javascript direkt zugreifen. Da sich Elemente im XML wiederholen dürfen und der XML-Node kein XML-Schema verwendet, werden generell alle Unterelemente in Arrays gepackt, auch wenn es nur ein Element gibt.
Um z.B. auf den Namen zuzugreifen, benötigst du folgendes Statement:
var name=msg.payload.company.employee[0].name[0];
Gruß
Markus
-
Hallo Markus,
vielen Dank für deine Rückmeldung. Genauso ist es, dass habe ich gestern Abend auch noch herausgefunden. Mein Gefühl, es muss doch einfacher gehen, hatte mich also nicht getäuscht.
Kopiert man den path Inhalt so sieht dieser wie folgt aus: payload.MBusData.DataRecord[2].Value[0]
Um den Wert in der Array nun weiter verarbeiten zu können, hätte ich dem kopierten Inhalt also nur noch das msg. vorsetzen müssen.
Bitte nicht wundern, ich bin inzwischen wieder zum realen Projekt zurückgekehrt, deshalb sieht der Inhalt des JSON Objekt bei mir jetzt ein wenig anders aus.
Ziel meines Projektes ist es, aus einem Meter Bus die Daten der angeschlossenen Feldgeräten, wie Energie- und Wärmezähler, auf Anforderung auslesen zu können. Diese dann in ein Modbusregister zu schreiben und durch einen zentralen Regler auszulesen. Das Auslesen der an den Meter Bus angeschlossenen Geräte und das Schreiben des xml-Datenfiles erfolgt mit Hilfe der libmbus libary von rscada auf einem RaspberryPi3.
Es freut mich sehr, dass ich hier jemanden gefunden habe, der sich offensichtlich in Node-Red gut auskennt.
Danke nochmals für deine Hilfe.
Gruß
Garf