NEWS
Objectstruktur möglichst automatisch in iobroker anlegen
-
@mickymaus999
Vielen Dank für Deine ausführliche Antwort. Ich stehe aber scheinbar noch etwas auf dem Schlauch. Wenn ich den iobroker out Node verwende und das Objekt versuche zu schreiben wird bei mir im iobroker nur ein Datenpunkt mit dem Inhalt "Objekt" angelegt. Wenn ich das Objekt vorher in JSON wandel wird bei mir ein Datenpunkt mit dem JSON-String als Inhalt angelegt. Hast Du eine Idee was ich falsch mache?
Viele Grüße und danke schon mal,
MasterG -
@masterg2000 Ich bin zwar nicht mickymaus
- Du hast mich wohl etwas missverstanden.
Du kannst keine Objekte im iobroker speichern sondern nur JSON-Strings.
Deswegen sagte ich ja zum Speichern JSON-Strings - in Node Red wandelst Du diese wieder in Objekte um und arbeitest direkt damit. So mach ich das ja auch. Für Bearbeitung oder Auswertung wandeln ich dann in NodeRed den JSON String wieder in Objekt um. Das Ganze in beide Richtungen macht ja die JSON Node für dich,.
Willst Du die ganze Objektstruktur im iobroker aufteilen, musst Du das Objekt in die Einzelbestandteile zerlegen.
Die JSON String Struktur ist ja dazu da, um Objekte als String in einer Elementarstruktur zu speichern. Du kannst keine Objekte im iobroker speichern. Wie gesagt, Du kannst dann über einen Flow natürlich das Objekt in Einzelteile zerlegen und diese dann im iobroker speichern. Jeder Datenpunkt im iobroker ist aber immer nur ein Elementartyp (bool, zeichenkette, zahl usw.)
Wenn Du selbst die Objektstruktur im iobroker aufbauen willst musst Du halt über einen Flow und die Split Nodes das Objekt in Einzelteile zerlegen und dann als Basiselemente im iobroker unter einem Topic wegschreiben. Für mich stellt sich nur die Frage, ob das so sinnvoll ist und ob man sich egal ob zur Visualisierung oder zur Bearbeitung nur die relevanten Parameter aus dem Objekt selektiert.
-
@mickym
Sorry, da hat wohl die Autovervollständigung irgendwie zugeschlagenund danke für die erneut schnelle Antwort!
Da haben wir uns wohl in der Tat missverstanden. Die Daten rufe ich über das entsprechende bluelinky Node ab. Insofern benötige ich nicht wirklich Daten aus iobroker. Plan war eigentlich nur die Daten über Node-Red abzurufen und dann hauptsächlich in iobroker zu arbeiten. Ich dachte halt, wenn ich eigentlich schon die perfekte Struktur der Daten habe, muss es doch möglich sein die auch auf einen Schlag in iobroker zu bekommen. Zumal mit JSON ja auch ein "Austauschformat" zur Verfügung stehen würde. Das komplett zu zerlegen und die Werte einzeln zu schreiben widerstrebt mir da irgendwie.
Wie gesagt, auch in iobroker bin ich noch recht neu. Wäre es eine Alternative den JSON-String in einen Datenpunkt im iobroker zu schreiben, den Datenpunkt überwachen und bei Änderung automatisch die entsprechende Struktur im iobroker mit den Daten aus dem JSON-String neu zu schreiben? Hilft natürlich nur, wenn ich die Datenpunkte dann nicht einzeln befüllen muss, sondern das automatisch auf Basis der Struktur im JSON String passiert.Sollte es echt keine Möglichkeit geben aus Node-Red eine dort vorhandene Objektstruktur (bestehend aus Elementartyp) in eine identische Struktur in iobroker zu schreiben fände ich das echt enttäuschend. Das würde den Datenaustausch echt einfach machen. Und wenn die entsprechende Struktur bereits existiert finde ich es irgendwie Steinzeit das Objekt in Einzelteile zerlegen und einzeln in Datenpunkte schreiben zu müssen.
-
@masterg2000 Ich habe trotzdem mal einen kleinen Testflow gemacht, damit sich Deine Enttäuschung in Grenzen hält, wobei das sicher nicht NodeRed anzulasten ist, dass es aus JSON Strings fertige iobroker Struktus aufbaut - falls der nicht funktioniert musst Du den halt ggf. selbst anpassen. Im Übigen bauen Dir auch blocklies und Javascript nicht automatisch Objektstrukturen im iobroker aus JSON Strings auf!!!! Das nur mal so angemerkt!
In der Inject Node befindet sich folgendes Objekt:
oder im JSON string format übersichtlicher:
{ "squadName": "Super hero squad", "homeTown": "Metro City", "formed": 2016, "secretBase": "Super tower", "active": true, "members": [ { "name": "Molecule Man", "age": 29, "secretIdentity": "Dan Jukes", "powers": [ "Radiation resistance", "Turning tiny", "Radiation blast" ], "dressed": { "head": "Kopfbedeckung" } }, { "name": "Madame Uppercut", "age": 39, "secretIdentity": "Jane Wilson", "powers": [ "Million tonne punch", "Damage resistance", "Superhuman reflexes" ] }, { "name": "Eternal Flame", "age": 1000000, "secretIdentity": "Unknown", "powers": [ "Immortality", "Heat Immunity", "Inferno", "Teleportation", "Interdimensional travel" ] } ] }
Nun habe ich einen Flow gebastelt, der Dir das Objekt abbildet.
Auch wenn Du das enttäuschend findest - manches ist nicht so banal wie es aussieht. Das ist weder ein Defizit des einen noch des anderen Produkts man muss sich halt etwas damit beschäftigen.
Ohne das jetzt bis zum Schluss getestet zu haben - hier mal ein Testflow:
Damit wird der obige JSON String in folgender Objekt struktur in folgender Struktur im iobroker abgebildet:
#
Den Toplevel musst halt im letzten Change Node anpassen.
Hier der Flow - damit kannst Du dann machen was Du willst und gibt auch keine Garantie -das der in jedem Fall funktioniert:
In der Tat würde ich Dir das aber alles nicht empfehlen. Grundsätzlich brauchst Du dafür aber Node Red nicht, dass kannst Du auch mit Blockly oder Javascript machen.
Das Problem ist, dass Du Dich nicht mit Node Red beschäftigen willst und direkt was die bluelinky Node Dir ausgibt bearbeiten willst. Du willst Node.Red als Adapter gebrauchen, um Dir das im iobroker verfügbar zu machen. Ist ein Umweg und wer sich nicht mit dem Produkt beschäftigen will, ist auch OK aber dann darf man diesem Produkt sicher nicht zum Vorwurf machen, dass es Objekte nicht 1:1 im iobroker abbildet - dafür ist es nämlich nicht gemacht.
-
@masterg2000 sagte in Objectstruktur möglichst automatisch in iobroker anlegen:
Sollte es echt keine Möglichkeit geben aus Node-Red eine dort vorhandene Objektstruktur (bestehend aus Elementartyp) in eine identische Struktur in iobroker zu schreiben fände ich das echt enttäuschend. Das würde den Datenaustausch echt einfach machen. Und wenn die entsprechende Struktur bereits existiert finde ich es irgendwie Steinzeit das Objekt in Einzelteile zerlegen und einzeln in Datenpunkte schreiben zu müssen.
Wie gesagt, Du kannst Dir über .parse Dir auch im blockly oder Javascript die Objekte direkt aus dem JSON String auslesen und direkt weiter bearbeiten. Dann schreibst DU einfach den JSON String aus der NodeRed NOde in einen Datenpunkt und bearbeitest halt dort mit Blockly und/oder Javascript - dann brauchst Dich mit Node Red nicht mehr beschäftigen und dann kann Dir ja Dein Blockly die Struktur im iobroker aufbauen - das ist sicher keine Kernkompetenz oder Aufgabe von NodeRed. Im Übrigen würde ich Dir diese Vorgehensweise auch empfehlen. Dann wirst DU auch feststellen, dass auch Blockly und Javascript Dir nicht automatisch ein Objektstruktur aus einem JSON String im iobroker erstellen. Das finde ich dann zumindest genauso enttäuschend!!!!
Im Übrigen gibts hier 1000 Einträge in der Suche - die versuchen einzelen Datenpunkte aus JSON Strings mittels Blockly oder Javascript zu erstellen:
hier ein Beispiel: https://forum.iobroker.net/topic/41611/gelöst-mqtt-direkt-in-obj-auf-einen-json-node-zugreifen?_=1617486071630Da Du jemand zu sein scheinst, der sich eigentlich mit dem Produkt (Node-Red) nicht beschäftigen will, der sollte dann im Fehlerfall bei der Analyse des JSON-Strings lieber direkt in seiner ihm vertrauten Umgebung arbeiten (Blockly oder Javascript). Im Übrigen ist im iobroker zu arbeiten und/oder NodeRed zu nutzen kein Gegensatz. NodeREd ist mit jeder Logikmaschine wie Blockly oder Javascript gleichwertig. Ich werde wohl nie verstehen, warum man das als 2 verschiedene Systeme betrachtet, während man Blockly wohl als Kernkompetenz des iobrokers ansieht nur weil >90% hier Blockly im iobroker als Logikmaschine gebrauchen.
Noch besser wäre natürlich, wenn Du im iobroker einen Adapter schreibst, der den Einsatz der bluelinky Node überflüssig macht, dann brauchst Du NodeRed gar nicht mehr und der Adapter würde Dir die entsprechende Struktur direkt zur Verfügung stellen.
-
@masterg2000 Ach übrigens - hier ist das Forum, in dem Du Deiner Enttäuschung Ausdruck verleihen kannst und Verbesserungsvorschläge entsprechend einbringen kannst:
https://github.com/ioBroker/ioBroker.node-red/issues
Vielleicht werden diese in zukünftigen Versionen des Node-Red Adapters ja von den Entwicklern berücksichtigt!Aus dem unteren Flow habe ich mal eine Node als Subflow generiert - die kannst Du ja mal verwenden und schauen, ob Du damit zufrieden bist: https://forum.iobroker.net/topic/43856/json-string-oder-java-object-in-iobroker-struktur
-
@mickym
Wow, VIELEN DANK!!! Ich werde mich mal durch Deinen Testflow arbeiten. Soweit ich im Moment verstehe ist es genau das was ich brauche.
Zum Thema Node-Red. Ich bin durchaus bereit mich in Node Red einzuarbeiten und werde es auch parallel zum iobroker benutzen. Und ja, der erste Einsatz war jetzt erst einmal die Integration unseres Autos ins Smarthome (solargesteuertes Laden, Erhalt einer Mindestladung, ...). Da ich ansonsten bisher alle anderen "Geräte" im iobroker habe und das Auto ja auch ettliche Infos rausrückt, fände ich es schade die Informationen die Node-Red holt nicht auch im iobroker bei den anderen Geräten abzulegen. Dann muss ich den aktuellen Status von "Geräten" nicht über mehrere "Systeme" hinweg zusammensuchen, ich kann Historien in einem System halten und zwecks Visualisierung und Bedienung ist es aus meiner Sicht auch besser bei einem System zu bleiben. Wo im Hintergrund "Programme" ablaufen ist mir letztlich egal. Und Node Red sieht für mich durchaus sehr interessant aus und ich möchte mich da auch noch etwas reinfuchsen. Ich denke auch, dass ich bzgl. des Autos das eine oder andere in Node-Red umsetze.
Grund für meine initiale Frage war daher auch nur, dass ich mir nicht vorstellen konnte, dass es bei der ansonsten scheinbar guten Zusammenarbeit von iobroker und Node-Red und dem großen Funktionsumfang von Node-Red nicht möglich sein sollte mehrere Daten auf einen Schlag in den iobroker zu schreiben. Wenn ich hier wirklich die Message komplett zerlege und einzeln in iobroker schreibe sieht der Flow für meinen Geschmack auch nicht mehr wirklich übersichtlich aus. Und wie schon geschrieben, wenn die Struktur auch schon vorhanden ist, finde ich es halt immer wenig sinnvoll diese noch einmal komplett nach zu basteln. Daher auch die Frage, ob es evtl. möglich ist die Daten auf einen Rutsch in den iobroker zu schreiben wenn wenigstens die Struktur im iobroker schon existiert.Viele Grüße,
MasterG -
@masterg2000 Wie gesagt aus dem letzten Post habe ich einen Subflow mit einer eigenen Node erstellt. Da gibst in msg.top nur noch mit, wie der oberste Datenpunkt unter 0_userdata.0 heißen soll. In der Hilfe siehst Du ja dann noch eine Beschreibung des Subflows.
Diese Aufdröselung in einzelne Datenpunkte ist halt eine Aufgabe die man selbst machen muss, das kannst wie gesagt auch im Blockly oder Javascript umsetzen.
@masterg2000 sagte in Objectstruktur möglichst automatisch in iobroker anlegen:
Wenn ich hier wirklich die Message komplett zerlege und einzeln in iobroker schreibe sieht der Flow für meinen Geschmack auch nicht mehr wirklich übersichtlich aus.
.. letztlich macht der Flow aber genau dies, indem er alles zerlegt und neu schreibt.
-
@mickym
Sensationell, VIELEN DANK!!
Der Flow funktioniert einwandfrei und sollte ein Standard-Node für iobroker sein!
-
@masterg2000 Danke.
Ich habe den Flow nochmals verbessert und auch Beispiele des entsprechenden Inputs mit den entsprechenden Screenshots der resultierenden Baumstruktur im IOBroker anhand von Screenshots dargestellt.https://forum.iobroker.net/topic/43856/json-string-oder-java-object-in-iobroker-struktur/2