NEWS
JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen
-
@mickym
Danke für deine Mühe, ich werde das später nochmal ausprobieren.Der Fehler der immer wieder auftaucht ist übrigens folgender:
[error] [function:e4a1e5e5e9dc34ee] Error: Invalid property expression: unexpected { at position 67Ein Beispiel kann ich Dir jetzt nicht geben weil dort sensible Daten vorhanden sind.
Die müßte ich erstmal rausfiltern und das ist aufwendig.
Ich kopiere im Moment alles manuelle mit einem JSON Editor. -
@bernd1967 Warum speicherst Du den JSON String vor der Aufteilung eigentlich nicht gleich in eine Datei?
-
Um diesen Flow mal mit der Erstellung von Folder Objekten zu testen habe ich mal die Objekte aus folgendem Ast meines mqtt Adapters exportiert:
Mit den Eigenschaften der Objekte ergibt es dann folgenden JSON String:
Dieser wird nun als States die einzelnen Endpunkte aufdröseln und erzeugt die Topics die dann über die iobroker -out Node geschrieben werden:
Die Struktur ist dann:
Die fehlenden Objekte müsste also die iobroker-Node selbst erzeugen.
-
So ich habe die Subflow Node etwas erweitert, indem man das topic bei Benutzung von Wildcards mit verwenden kann.
Default ist natürlich false, um das bisherige Verhalten zu erhalten. Der Hilfetext wurde wie folgt angepasst:
Ich will das mal an einem Beispiel demonstrieren. Wenn man anstelle des zigbee Adapter das zigbee2mqtt Projekt verwenden will und die JSON Objekte ebenfalls als einzelne Datenpunkt verfügbar haben will, kann man wie folgt vorgehen.
Ich zeige mal wie ich meine Bewegungsmelder unter zigbee2mqtt angelegt habe:
Die Bewegungsmelder geben unter dem mqtt Adapter den Status als JSON Strings zurück, um das nun mit dieser Node alles auf einmal als Objektbaum im iobroker darzustellen, kann man das wie folgt erreichen:
Über die Wildcards liefert die mqtt-In Nodes alle Daten vom Bewegungsmelder - ob man oder wie man das topic modifiziert, kann man selbst entscheiden.
In der Subflow Node setzt man keepTopic auf true:
Somit wird automatisch für alle Bewegungsmelder einzelne Datenpunkte unter 0_userdata.0 erstellt, also ein ganzer Objektbaum:
-
@mickym ich habe das Ganze mal ausprobiert und habe folgendes Problem. Wenn ich die gesamte Ordnerstruktur wie in deinem Beispiel einlese erhalte ich folgendes...
Also die gleiche Ordnerstruktur wie sie mein zigbee2mqtt anlegt. Wenn ich aber nur einen Sensor auslese dann habe ich das gewünschte Ergebnis.
Was mache ich falsch?
-
@noah3112 Ach ja das mit dem Script habe ich auch gemacht. Ist das überhaupt noch nötig?
-
@noah3112 Also im Prinzip bist Du halt verantwortlich, dass Du das topic so aus Deinen msg.topics präparierst, dass das topic so erstellt wird.
Das topic wird nach dem top eingefügt - dann erfolgen die topics des Objektes. Ich hatte ja das Beispiel des Bewegungsmelders gebracht. Du kannst auch zigbee/# nehmen. Letztlich siehst Du ja wenn Du nach der subflow Node eine debug Node machst erst mal welche topics rauskommen.
-
@noah3112 Welches Script meinst Du?
-
@noah3112 Ich hab mal mein ganzen zigbee2mqtt Baum ausgelesen Indem ich als topic zigbee2mqtt/# nehme.
Ich hab meinen zigbee2mqtt halt nach Funktionen gegliedert - aber wird alles aufgelöst.
,
die states werden auch korrekt aufgeschlüsselt:
Importiere ggf- nochmals neu - damit Du auch die aktuellste Version hast.
Die Subflow Node muss halt keepTopic auf true sein:
-
@noah3112 Wahrscheinlich hast Du Dein zigbee2mqtt struktur anders aufgebaut. Wie gesagt nutze mal zigbee2mqtt/# als input - die Change Node um das Topic zu isolieren, habe ich angepasst. Das mit dem Bewegungsmelder war nur ein Beispiel wenn man selektieren möchte und nicht den ganzen Baum abbilden will.
-
@mickym sagte in JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen:
@waldmensch Generell muss man seit dem Admin5 - einmal auch immer noch das Skript von @fastfoot drüberlaufen lassen - das automatische Erstellen von Objekten im Admin5 lässt wohl auf sich warten.
Also dieses Skript importieren - und einmal ausführen:
Muss man nur einmal machen - wenn die Objekte angelegt sind - kann der Flow ungehindert weiter in die einzelnen Datenpunkte schreiben.
Das war mit dem Script gemeint.
-
@noah3112 Nein das brauchst Du nicht mehr. Das hat unser großer Meister gefixt wenn Du NodeRed Adapter Version 3.0 und höher verwendest, das heißt die Folder-Objekte werden korrekt angelegt (da unter 0_userdata.0).
-
@mickym Bei mir ist es auch nach Funktionen gegliedert. Das war der Versuch mit den Umweltsensoren. Ich werde mal alles anwählen und schauen was passiert. keepTopic war auch auf true hatte vergessen davon ein Screenshot zu machen.
-
@noah3112 Ja bei Dir musst halt ggf. zigbee/# verwenden und dann musst das topic halt mit dem regex Ausdruck richtig rausselektieren:
Wie gesagt - wichtig ist, dass das topic richtig aufbereitet wird, um es korrekt in dem Subflow zu verwenden.
-
@mickym so jetzt mal das gesamte Paket mit den von dir gerade gesendeten Flow laufen lassen. Das gleiche Ergebnis ich bekomme nur den state angezeigt. Komisch im debug Fenster bekomme ich wesentlich mehr Daten angezeigt diese werden nur nicht aufgelöst und dargestellt.
-
@noah3112 Vielleicht browser refresh? - Wenn im debug alles rauskommt, dann müsste es auch so angelegt werden.
-
@noah3112 Sorry das stimmt so nicht bei einigen Sensoren bzw Aktoren sind mehrere Daten vorhanden. Kann es sein das ich einfach nur warten muss bis alle mal gesendet haben?
-
@noah3112 KLar - mqtt - sendet ja nur wenn was aktualisiert wird - das heisst die Bäume bauen sich ja erst auf - mqtt - liest nie "vorhandene" alte Daten aus - ausser Du speicherst das mit retain - was nicht zu empfehlen ist.
-
@mickym Alles Bestens ich habe jetzt Daten ohne Ende Vielen Dank das hat mir echt weitergeholfen. Jetzt kann ich mich an meine Visualisierung machen. Beim Dashboard ist man echt eingeschränkt aber Vis überfordert mich auf der anderen Seite auch wieder. Man hat´s echt nicht leicht
-
@noah3112 sagte in JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen:
@noah3112 Sorry das stimmt so nicht bei einigen Sensoren bzw Aktoren sind mehrere Daten vorhanden. Kann es sein das ich einfach nur warten muss bis alle mal gesendet haben?
ggf. - das hat aber mit diesem Thema nichts zu tun - ist, dass Du im zigbee2mqtt die availabilty Option zu nutzen.