NEWS
Modbuswerte aus Schleife in einzelne Objekten schreiben
-
@tugsi du musst halt für jeden Datenpunkt ein eigenes Topic festlegen
-
@mickym sagte in Modbuswerte aus Schleife in einzelne Objekten schreiben:
@tugsi du musst halt für jeden Datenpunkt ein eigenes Topic festlegen
Was meinst Du mit Topic?
Also für jede Abfrage ein eigenen Flow? Oder kann ich auch wie bei der Abfrage eine Schleife für die Topics machen?
Topic habe ich auch offen gelassen, weil wenn ich unter zB userdata.0. ein DP angelegt hatte, hat er mir den gar nicht in der Auswahl angeboten... -
@tugsi sagte in Modbuswerte aus Schleife in einzelne Objekten schreiben:
@mickym sagte in Modbuswerte aus Schleife in einzelne Objekten schreiben:
@tugsi du musst halt für jeden Datenpunkt ein eigenes Topic festlegen
Was meinst Du mit Topic?
Also für jede Abfrage ein eigenen Flow? Oder kann ich auch wie bei der Abfrage eine Schleife für die Topics machen?
Topic habe ich auch offen gelassen, weil wenn ich unter zB userdata.0. ein DP angelegt hatte, hat er mir den gar nicht in der Auswahl angeboten...Die Datenpunkte, die Dir angeboten werden, werden Dir nur bei jedem Adapterstart eingelesen. Keine Ahnung, ob Du in der Buffer Node das Topic wieder überschreibst. Wenn nicht kannst Du ggf. das topic bereits in der function node festlegen. Du kannst aber auch aus der payload ein neues Topic generieren. Wenn Deine payload zum Beispiel wie oben ausschaut und Du 3 Objekte rausbekommst, wobei die port_number unterschiedlich ist, dann setzt Du halt via change node, ein msg.topic auf "0_userdata.0.hoymiles.port." & payload.port_number
Du schreibst ja nicht unter welchen Datenpunkten Du die Objekte schreiben willst - ausserdem musst Du auch eine JSON Node davor hängen, da Du in den iobroker keine komplexe Datentypen schreiben kannst, wie Arrays oder Objekte.
Also ist die port_number ein Wert, in der sich die Objekte unterscheiden? Und wohin möchtest Du die Datenpunkte schreiben?
Ich habs jetzt einfach so gemacht - ihr schreibt halt immer nur die Hälfte was ihr wollt. Voraussetzung ist, dass Du in der Adapterkonfig Fremdobjekte erstellen angehakt hast.
Hier als Beispiel zum Import.Du musst halt die change Node und die Json Node dazwischenklemmen.
Solche Informationen stehen im Übrigen alle in der Hilfe zu der Node - auch zu iobroker Out Node.
-
@mickym sagte in Modbuswerte aus Schleife in einzelne Objekten schreiben:
ihr schreibt halt immer nur die Hälfte was ihr wollt
Erstmal Danke mickym, ich komme aus dem Programmierbereich, eigentlich mehr SPS in der Industrie, von daher kenne ich das Problem, man bekommt zu wenig Input ... lach
Bei mir ist halt leider das Problem, dass ich das Konstrukt NodeRed so gar nicht kenn, habe versucht mich etwas einzulesen, aber zu wenig... denn das mit den msg.topic hatte ich so nicht verstanden..jetzt ist mir zu spät, werde es morgen mal anschauen und ausprobieren.
Leider kann ich den Port nicht als alleiniges Merkmal benutzen.
Der Port hängt mit der Seriennummer zusammen.
Jeder Wechselrichter hat 6 Ports, 6 Wechselrichter habe ich und somit habe ich auch 6x Port 1, Port2 ...
Wenn dann müsste es so aufgeteilt werden in :
"0_userdata.0.hoymiles.serial_number." & payload.serial_number & ".port." & payload.port_number
Wenn sowas geht, 2 Variablen zu benutzen?
Dann hätte man eine Struktur: hoymiles - SN (somit den Wechselrichter) - Port 1-6 und darunter die Werte.
Im Grunde hatte ich vor, alle erzeugten Leistungen pro WR zusammenzuzählen, anzeigen zu lassen und auch ob Alarm ansteht und die prodzuierte Leistung.Wie gesagt, werde morgen mir das in Ruhe mal anschauen, was Du mir zum Import gegeben hast und du weißt ja, die Fragen entstehen meist erst, wenn man bastelt..
Danke schon mal für Deine Mühen!
-
@tugsi Ich könnte Dir zwar was über JSONATA basteln, weil ich finde, dass es ja Ziel ist bei NodeRed nicht wieder x Code-Zeilen zu schreiben, aber Du kannst ja auch alles in JS programmieren. Wenn Du alles in einzelne Datenpunkte haben willst, dann empfehle ich Dir meinen Subflow. Ich mach Dir das mal aus dem einen Objekt was Du geliefert hast als Beispiel mit meinem Subflow. Beachte bitte die Hinweise bzgl. Fremderstellung von Objekten aus meinem Thread. https://forum.iobroker.net/topic/43856/json-oder-javascript-objekt-in-iobroker-datenpunkte-zerlegen
Zur Funktionsweise schau Dir die Hilfe zu der Node ggf. noch an. Du musst die Node nicht mehr importieren, wenn Du den Flow in diesem Post importierst, da die Node Bestandteil des Flows ist. Du musst die Buffer Node noch vorne dran hängen, wobei man die Buffernode wahrscheinlich auch anders hätte konfigurieren können. Ich bin generell kein Freund von function Nodes mit dem Du die Requests erstellst, weil man mit codieren (auch wenn es Dir leichter fällt, viel von der visuellen Ablaufsteuerung kaputt macht). Du hast ja nun eine bestimmte Struktur vorgegeben.
Damit schreibst Du dann den Rest nicht in ein einzelnen JSON String sondern in einzelne Datenpunkte.
-
@mickym Super danke....
Jetzt hatte ich die Zeit und die Muse mir das anzuschauen, die Nacht ist man dann doch nicht mehr so aufnahmefähig...
Anfänglich habe ich noch Probleme gehabt, da er mir keine Datenpunkte angelegt hatte, hab zum testen den msg.payload zwischengehangen und gesehen, dass im Grunde alles richtig rausgeht.
Abwr wie immer, der Fehler sitzt davor, hatte in der NodeRed-Instanz Fremdobjekte anlegen nicht angekreuzt.Jetzt schreibt er schön die Datenpunkte rein, in der Struktur habe ich aber das Verzeichnis serial_number und port rausgenommen, sodass es dann "nur" .hoymiles."seriennummer"."portnummer". steht, das ist übersichtlicher und reicht ja komplett aus.
Aber eines habe ich noch nicht ganz verstanden, Du würdest keine function Node nehmen, aber korrigiere mich, die function Node ist doch die Schleife, die die Abfrage durch die Modbusregister macht.
Jedes Register ist ja gleich aufgebaut und hat halt die vorgegebene Struktur.
Wie hättest Du es denn gelöst?Hier mal mein kompletter Flow als Export:
Danke für den Support!
-
@tugsi sagte in Modbuswerte aus Schleife in einzelne Objekten schreiben:
Aber eines habe ich noch nicht ganz verstanden, Du würdest keine function Node nehmen, aber korrigiere mich, die function Node ist doch die Schleife, die die Abfrage durch die Modbusregister macht.
Jedes Register ist ja gleich aufgebaut und hat halt die vorgegebene Struktur.
Wie hättest Du es denn gelöst?Kann man schon machen. In diesem Fall ist die function Node auch einigermaßen OK. Wenn man es ohne function Node macht, dann erstellt man das Array und erzeugt daraus die Nachrichten.
Oben Deine Lösung - unten ohne function Node mit identischem Ergebnis:
JSONATA ist etwas schwierig - aber wenn man da eintaucht, wahnsinnig elegant und spart Code.
Deine ganze Schleife reduziert sich in JSONATA auf:
[0..35].{ 'fc': 3, 'unitid': 101, 'address': 4096+($*40), 'quantity': 40 }
Das Array wird dann über eine split Node in einzelne Nachrichten aufgeteilt.
Wie gesagt in Deinem Fall ist die function node auch OK - aber viele verwenden function Nodes und programmieren im Prinzip den ganzen Flow da rein. Du könntest auch noch die Buffer-Node und alle folgenden Nodes in die function Node unterbringen.
Wie gesagt in Deinem Fall kann man das schon so lassen, aber ich bin ein Freund davon, es erst ohne function Node zu probieren und nur wenn ich nicht mehr weiterkomme, greife ich darauf zurück.
Grundsätzlich sind Schleifen auch nichts anderes als eine Abfolge von Nachrichten, die Du durch die Nodes schickst.
Und eine Split Node teilt Dir ein Array oder ein Objekt auf wie ein array.forEach usw.
Übrigens JSONATA kannst Du auch in Blockly und in JS nutzen, da ich denke dass Du generell ja eher der Puzzlefraktion angehörst.
-
@tugsi Auch mit der Buffer Node - in dem Fall konntest Du meinen Subflow nutzen. Du hättest aber auch darauf verzichten können.
Wenn Du das Ganze aus der Buffer-Node Dir nicht als ein Objekt hättest ausgeben lassen:
sondern mit multiple results hättest Du einzelne Nachrichten gehabt und hättest dann mit einer Change Node nur noch das topic modifizieren müssen. Allerdings ist es so mit Seriennummer und Portnummer eleganter.
Ich will Dir nur ein paar Ansätze zeigen, wo man mit spielen kann.
-
Eine andere Mögllichkeit wäre vielleicht - statt 36 Einzelrequests an verschiedenen Adressen - einen Riesenblock als Buffer einzulesen und dann aufzuteilen. Keine Ahnung ob das geht. Habe kein Modbus.
-
@mickym sagte in Modbuswerte aus Schleife in einzelne Objekten schreiben:
da ich denke dass Du generell ja eher der Puzzlefraktion angehörst
Nicht ganz, ich bin schon etwas älter, komme noch aus der BASIC-Zeit, wo man damals ellenlange Listings aus zB der alten C64-Zeitschrift abgetippt hatte *lach
In meinem Job programmiere ich SPSen von Siemens, dort gibt den sogenannten FUP (Funktionsplan), da ist es mit "Kästchen", ich programmiere aber einiges noch sehr gerne in AWL (Anweisungliste), das kommt dem klassischen Programmieren sher nahe.
Das größte Problem was ich immer habe, ist der unterschiedliche Syntax, AWL wird so, PHP dann wieder so, JS möchte gerne dies.. Hochkammata, Anführungszeiten...
Deswegen bin ich in vielen Fällen froh, wenn man etwas "Fertiges" hat, welches man dann durch ein wenig Try&Error dann näher kennenlerntEine andere Mögllichkeit wäre vielleicht - statt 36 Einzelrequests an verschiedenen Adressen - einen Riesenblock als Buffer einzulesen und dann aufzuteilen. Keine Ahnung ob das geht. Habe kein Modbus.
Theoretisch sollte das klappen, hatte aber dieses Script im Netz gefunden, denn mit dem Modbus-Adapter vom ioBroker habe ich gar keine brauchbaren Daten bekommen, da war ich von NodeRed positiv überrascht...
Zusätzlich habe ich noch ein EM24-Zähler mit Modbus-RTU, dazwischen ein RTU-TCP-Wandler, da habe ich das Problem, dass ich nur 10Bytes auslesen kann, möchte ich mehr, habe ich Connection-Error.
Aber da brauche ich nur zwei Werte, momentane W und Gesamt kWh, die hole ich mir einzeln raus mit NodeRed.Aber Dank für Deine Mühen und die Muse mir etwas zu zeigen, ich bin da ein Freund von, dass man auch unterschiedliche Wege gehen kann.
Und im Bereich der Programmierung hat jeder seine eigenen Werte und bekanntlich führen viele Wege nach Rom
Ich werde mir auf jeden Fall Deine Anregungen in Ruhe mal anschauen und testen, wichtig ist jetzt erstmal dass ich die Daten habe und grob sehe wie es funktionert.