NEWS
JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen
-
@mickym , also der Payload sind KNX Gruppenadressen die am Ende nur den Status true oder false beinhalten sollen. Ich will diese dann in VIS weiterverarbeiten und durch das schreiben auf den Bus auch an allen Visualisierungen aktuell halten. Nicht erschrecken das ist ein ziemlich großes Projekt was die Menge der DP´s angeht
So sieht es ungefähr optisch aus als Text bekomme ich es gar nicht in einen Text wegen der 100000 Beschränkung
-
@schonpaule In der Change Node - setzt Du die msg.payload und nicht die msg.top. Und wie gesagt die Change Node hinter die KNX Node bzw. vor die Subflow-Node klemmen und nicht davor.
-
@mickym Ich habe gerade mal Deinen Subflow getestet. Der läuft soweit 1A. Ich schreibe damit das Objekt, was mein PV Speicher liefert. Was seltsam ist, ist, das mein Log mit warnings geflutet wird. Das scheint daran zu liegen, das die Datenpunkte readonly angelegt werden
node-red.0 2021-11-28 08:41:42.027 warn Read-only state "0_userdata.0.Solarwatt.SData.ACS.U_L2" has been written without ack-flag with value "225"
Man kann das umgehen, indem man in der Ouot-Node unten bei "Readonly" einstellt "Object is writable".
-
@waldmensch Ja das war mir bekannt - das sind alles Dinge seit dem admin5 - Du musst auch nachdem der Flow gelaufen ist, einmal das Skript von fastfoot drüber laufen lassen, damit die Objekte angelegt werden.
Da das ganze ja in userdata geschrieben wird - kann man man anstelle es auf writeable zu setzen das ACK -Flag setzen, also anstelle von command - ein value setzen. Das sollte ebenfalls gehen:
Es ist generelle so, dass man mit den Einstellungen in der iobroker-out Node - die Prüfung dieser Nodes ausschaltet . Der Subflow hat damit eigentlich gar nichts zu tun, der spaltet die Objekte ja nur in Einzelnachrichten auf und setzt die topics.
-
@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.
-
@mickym So ich habe die Node nochmals leicht überarbeitet. Die Bedeutung ist leider mit dem Admin 5 etwas verloren gegangen und man hat auch in den letzten 4 Monaten anscheinend immer noch keine Zeit gehabt den Admin oder NodeRed so anzupassen, dass ggf. Objekte selbst erstellt werden. Dennoch ist der Flow vielleicht noch hilfreich.
Die Node setzt nun nicht mehr zwingend das Füttern der Node mit msg.top voraus, um den Ausgangsdatenpunkt (objRoot) für den zu erstellenden Objektbaum festzulegen, sondern die Node kann nun auch mit Umgebungsvaribalen arbeiten. Endlich mal ein sinnvoller Einsatz für Umgebungsvariablen in Subflows.
Das heißt man kann nun direkt in der Node den Startpunkt eingeben. msg.top funktioniert aber weiterhin.
-
@mickym ,
danke das funktioniert mit dem LibreHardwareMonitor sehr gut.
Objekte werden jetzt selbst erstellt. -
@mickym
Danke für dein Subflow, kann ich auch gerade sehr gut gebrauchen.Ich hab allerdings Schwierigkeiten die Daten in einen Json String zurück zu konvertieren.
Hab es oben wie Du mit der Tasmota Steckdose es gemacht hast nachgebaut, nur mit einem anderen Pfad.
Aber das klappt nicht, ich nehme an das es am Change Node liegt und dort bei den Regulären Ausdruck ?
Ich möchte ganz einfach das was im IOBroker Pfad untet "0_userdata.0.objRoot" vorhanden ist als Datei speichern.Struktur im IOBroker:
Ergebnis:
{"version":3,"devices.554-6546532-36565-654654.Test":""} -
@bernd1967 Mal unabhängig davon, dass man so eine Struktur im iobroker auch einfach exportieren kann, aber was stimmt denn mit dem Ergebnis nicht? - Das schaut doch richtig aus?
Das was Du vielleicht als Problem ansiehst - ist ggf. gar keines. Falls Du erwartet hast, dass Du unter devices eine hierarchische Struktur bekommst - kann nicht funktionieren, da das kein Objekt ist. Das Problem ist eher die list Node - die gibt auch wenn Du ANY als Filter hast nur die states aus. Da müsste man halt wieder ein Issue aufmachen.
Für das Wiederherstellen der Struktur spielt das aber keine Rolle - diese wird, wenn Du meinen Subflow nimmst wieder 1:1 richtig hergestellt:
Du siehst ja, dass Du aus der List node nur 2 Objekte rausbekommst:
Auch wenn ich das im iobroker direkt exportiere bekommst Du nur 2 Objekte zurück:
Falls Du eine Objekthierarchie in Deinem JSON wiederherstellen möchtest, dann ist da nicht banal und muss man quasi selbst programmieren.
Mit einer Flow Variablen und einer function Node ist das dann sicher am Einfachsten. Hier mal eine Möglichkeit:
damit bekommst dann dieses Ergebnis:
{"version":3,"devices":{"554-6546532-36565-654654":{"Test":""}}}
-
@mickym sagte in JSON String oder Java Object in IOBroker Struktur:
hierarchische Struktur
Ja genau , das hat mich irritiert, die hierarchische Struktur......
Mit deinem Beispiel klappte es
DankeNachtrag: bei komplexen Strukturen entstehen allerding viele Fehler
Ist doch wohl nicht so einfach. -
@bernd1967 Ja - entweder muss man das halt wirklich auflösen oder Du schickst mal ein Beispiel wo es Probleme gibt, dass man es nachvollziehen kann.
Das Problem ist, dass nach der Aufsplittung halt bestimmte Originalinformationen für immer verloren sind, es werden ja Arrays und Objekte in gleicher Weise behandelt.
Die Frage ist halt wirklich braucht man diese Hierarchie oder kann man nicht mit dem Original leben - wie Du es am Anfang gemacht hast. Ich habe allerdings eine recht komplexe Struktur durchlaufen lassen und das ging fehlerfrei.
Also müsste man das wohl anhand Deines Beispiels, das nicht läuft nachvollziehen.
Ich hab den Flow nochmal angepasst - sodass die function Node zum Aufbau der Objektstruktur ausreicht und diese nach jeder Ausgabe gelöscht wird - damit es da kein Durcheinander gibt. -
@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: