question

horst-w avatar image
horst-w asked

Node Red, Sortierreihenfolge bei Arrays zu CSV

Ich will mehrere Werte aus dem MPPT und die Uhrzeit in ein CSV-File speichern.
Dazu habe ich diesen Flow gebastelt:

zwischenablage01.jpg

Alle 5 Sekunden wird ein Datensatz generiert. Wie man rechts sieht, passt aber die Reihenfolge der Daten nicht.
Mir ist klar, dass mein Ansatz kompletter Blödsinn sein könnte. Darum bitte ich mir den rechten Weg zu weisen.

Danke,
Horst

Node-RED
zwischenablage01.jpg (249.8 KiB)
2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

6 Answers
steffen-graap avatar image
steffen-graap answered ·

Ich verstehe zwar nicht so recht was du machen möchtest, glaube aber das du ein Denkfehler hast. NodeRed ist ein Eventbasiertes System, soll heißen das z.B. ein MPPT einen geänderten Wert feststellt, und damit eine Eventkette startet. Das heißt aber nicht das zum selben Zeitpunkt, die anderen Werte was senden. Du musst also alle Daten erst mal sammeln und zwischenspeichern, und dann gesteuert von einem Zeittakt aus diesem Speicher deine Datensätze generieren.
Ich hoffe ich hab mich verständlich ausgedrückt.

2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

horst-w avatar image
horst-w answered ·

Erstmal danke für die Antwort Steffen.

Was will ich machen? Mehrere Werte aus dem MPPT in eine Zeile eines Textfiles zu schreiben, getrennt durch Semikolon und ergänzt mit der Uhrzeit.

Dass NodeRed eventbasiert ist, ist mir schon bewusst. Der MPPT sendet diese Daten alle 5 Sekunden. Ich weiß allerdings nicht ob synchron oder zufällig.
Mag ja sein, dass ich mit NodeRed auf dem Holzweg bin. Ich weiß halt keinen besseren, für Vorschläge bin ich offen.

Danke,
Horst

2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

steffen-graap avatar image
steffen-graap answered ·

NodeRed kann schon das richtige Tool für deine Anwendung sein, es muss eben nur richtig genutzt werden.

Ich bin mir nicht sicher, ob du das Eventbasierte richtig verstanden hast. Jede Eventkette beginnt mit einer Node, welche Daten generiert, z.B. Der Strom des MPPT. Dieses Datenpacket wird dann an verarbeitende Nodes weitergeleitet, welche die Daten verändert oder ähnliches und diese wieder weiterleitet.
Wenn du nun aber an einem Punkt (die Join-Node) Daten aus verschiedenen Event-Quellen (auch wenn diese aus dem selben Gerät stammen)verwenden möchtest, so sind diese nicht syncronisert.
Du musst für eine Syncronisierung sorgen, in dem du erst mal jede einzelne Quelle im Speicher ablegst. Dies kannst du z.B. mit einer function-Node erreichen, in der du mit dem Befehl "global.set" das empfangene Datenpacket im Speicher ablegst.
Mit einer neuen Eventkette, welche z.B. durch eine Injection-Note, die zyklisch ausgeführt wird, alle Daten wieder syncronisert aus dem Speiche lädst (global.get) und zu einem Datenpacket zusammen setzt, hast du dann dein syncronisiertes Datenpacket, welches du in eine Datei schreiben kannst.
Somit ist gewährleistet, das die Daten im Speicher gehalten werden, egal ob eine Eventquelle sie alle x Sekunden sendet oder eben nur alle X Minuten/Stunden, oder eben nur bei Veränderung.

Das ein MPPT die Daten alle 5 Sekunden sendet ist glaube ich ein Trugschluss. So wie ich das gesehen habe werden Daten immer nur nach Änderung gesendet.

2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

steffen-graap avatar image
steffen-graap answered ·

Ich habe mal ein Beispiel Node gemacht. Einfach entpacken und das "Beispiel.json" in NodeRed als neuen Flow importieren.

Beispiel.json.zip

In dem Beispiel werden Spannung (alle 7s) und Strom (alle 5s) zyklisch gesendet. Dies soll die Daten des MPPT darstellen.
Im oberen Teil hab ich es versucht so darzustellen wie es bei dir sein kann. Das Ergebnis ähnelt dem deinigen.
Im unteren Teil habe ich die Daten jeweils mit einer fuction-Node in globalen Variablen gespeichert.
Ganz unten wird zyklisch eine Zeitstempel erzeugt, der dann das Auslesen der Daten antriggert, und sie in ein Array schreibt, welches dann weiter gesendet wird.
Mit dem Zyklusintervall der Injection-Node kannst du dann auch bestimmen mit welcehm Intervall die Daten in die CSV geschrieben werden sollen.Werden die Daten häufiger vom MMPT erzeugt, so wird immer nur der letzte Wert verwendet, etwaige vorherige Daten gehen verloren. Sollte der MPPT langsamer Daten erzeugen als das Intervall ist, so wird der letzte Wert mehrfach verwendet.

Man kann das Ganze auch so gestalten, das jede Ausgabe des MPPT ein Datensatz erzeugt, der dann im csv gespeichert wird. GGf. auch mit einem kleinen Delay, falls Spannung und Strom zur selben Zeit vom MPPT erzeugt wird, damit diese dann nicht doppelt gespeicher werden.


beispieljson.zip (1.2 KiB)
2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

horst-w avatar image
horst-w answered ·

Danke Steffen, dass Du Dir so viel Mühe gibst.
Obwohl es sehr lehrreich ist, Problemstellungen selbst zu erarbeiten und zu lösen, ist es trotzdem erbaulich wenn man das Rad nicht immer wieder neu erfinden muss.

Das mit dem Eventbasierten habe ich schon verstanden und, dass es erst synchronisiert werden muss ist mir auch klar. Heute habe keine Zeit mehr, aber in den nächsten Tagen werde ich mir Deinen Vorschlag ansehen.

Zur Info, der Victron MPPT sendet alle 5 Sekunden:zwischenablage01.jpg

Danke,
Horst


zwischenablage01.jpg (123.9 KiB)
2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

steffen-graap avatar image
steffen-graap answered ·

Hallo Horst, kein Problem, macht ja auch Spaß Probleme zu lösen.

Da ich mein NodeRed schon vor der Zeit, in der es in Largeversion enthalten ist, installiert habe, und außerdem auf einem separaten RasPi läuft, kann ich die Victron-Nodes nicht verwenden. Daher ist mir die Einstellung unbekannt. Ich kenne es nur so das der MPPT bei Änderung die Daten versendet. Diese werden bei mir mit einer Standard-MQTT-Node abgefragt.

Wahrscheinlich wird die Node die Daten beim MPPT alle 5s anfragen. Das würde auch erklären, warum sie nicht alle synchron kommen.

Du kannst ja mal in deinem Flow die Debug-Node direkt an die einzelnen Victron-Nodes hängen, dann siehst du ja ob sie zur selben Zeit gesendet werden oder einen leichten Versatz haben.

Gruß Steffen

2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.