NEWS
Werte vom Datenpunkt in CSV-Datei schreiben *gelöst*
-
@mickym Okay, das habe ich verstanden. "Change" habe ich jetzt auch gesetzt
Allerdings läuft mein IO-Broker auf Windows. Kommt er dann mit dem /home/iobroker klar?
Aktuell schreibt sich noch gar nichts in die Datei.. Der IN-IOBroker Block zeigt aber schonmal den geschriebenen Wert an. -
Wie gesagt bevor Du den Flow aus dem anderen Thread importierst, solltest Du in deinem NodeRed noch die Dateisystem Nodes installieren. Damit kann man auch Dateien löschen etc..
Wie gesagt - nutze einfach mal den Flow aus dem anderen Thread - ich erkläre Dir das gleich.
Als erstes gehst Du bitte in Deine NodeRed Adaptereinstellungen und hakst dort an, dass Du den Paletten-Manager nutzen willst.
-
@mickym ok, ist erledigt.
-
@surfer09 sagte in Werte vom Datenpunkt in CSV-Datei schreiben:
@mickym ok, ist erledigt.
Dann öffnest Du den Palettenmanager im Hauptmenü
und gibst bei der Suche für die Installation folgendes ein:
node-red-contrib-fs-ops
Wenn das alles geklappt hat, dann siehst Du im ersten Tab, dass die Nodes installiert wurden:
die stehen Dir ab sofort auch zur Verfügung
-
falls du an einer Lösung mit Blockly interessiert bist, meld dich. Ich schreibe per Blockly die Werte meiner PV Anlage am Ende des Monats in eine CSV
-
@frana120500 Hallo Frana! Stelle deine Lösung doch vielleicht auch vor. Wäre ja gar nicht schlecht, wenn man 2 Lösungswege hat.
-
@mickym sagte in Werte vom Datenpunkt in CSV-Datei schreiben:
d gibst bei der Suche für die Installation folgendes ein:
Ja, auch erledigt
Hat alles funktioniert soweit.
-
@surfer09 Gut dann nimmst Du den Flow aus dem anderen Thread - ich kopier den nochmal hier rein - und kopierst ihn in die Zwischenablage und importierst ihn dann in Node Red.
Sobald Du den Code hier aus dem Thread in die Zwischenablage kopiert hast, gehst Du im Node Red im Hauptmenü auf Import:
und fügst den Code in das rosa Fenster und klickst auf Import
-
@mickym sagte in Werte vom Datenpunkt in CSV-Datei schreiben:
Hat auch funktioniert. Jetzt habe ich hier einige Blöcke mehr im Fenster
-
@surfer09 Sehr gut - nun schaut es erst mal so aus, wie in dem anderen Thread.
So nun müssen wir den Flow an deine Bedürfnisse anpassen.
Wieviele Datenpunkte möchtest Du denn schreiben und welche Spalten, wie sollten die Überschriften lauten etc. ????
-
Hier meine Blockly Lösung. Ich habe mir einen Mountpunkt angelegt, da ich die Daten noch weiterverarbeite.
In meinem Fall werden die neuen Daten unten angehangen. Habe jetzt hier mit dem ID von Selektor gearbeitet, aber das lässt sich ja anpassen.
Hier das Blockly:
Der Inhalt der Funktion:
und hier das ganze als Blockly Export:
-
@mickym Also es handelt sich um einen Datenpunkt (Einspeiseertrag Solaranlage). Eigentlich brauche ich nur 1. Spalte Datum, 2. Spalte Wert vom Datenpunkt.
-
@surfer09 Ok - Datum nehmen wir am Besten den Zeitpunkt wann es auch geschrieben wird. Das heißt Du kannst alle Change Nodes am Anfang bis auf einen löschen und hängst Deine iobroker In Node vor diese Change Node.
Dann passt Du Pfad zur Testdatei auf einen lokalen Pfad an. Entweder nimmst Du "/" und es funktioniert, sonst halt "" ggf. muss man die auch verdoppeln.
Den Pfad passt du in diesen beiden Nodes an.
Falls Du keine Spaltenüberschriften brauchst, kann man den Flow auch wesentlich vereinfachen.
-
@mickym Okay, ich habe jetzt einen lokalen Pfad dort hinterlegt (I:\iobroker\werte.csv), aber es passiert nichts. In der Datei hat sich nichts verändert.
-
@surfer09 Ok - ja hab noch was vergessen. Da Du ja nur einen Datenpunkt hast, setze bitte mal in der JOIN Node die Anzahl an Nachrichten auf 1.
Wenn der Datenpunkt im iobroker nicht aktualisiert wird, kannst Du auch noch eine Inject Node vorne dran hängen und damit testen.
- Dann weisst Du auch wofür man diese Node braucht.
Durch Drücken auf die Schaltfläche triggerst Du manuell den Flow mit einem Wert:
Du musst nur darauf achten, dass Du einen Zahlenwert nimmst.
-
@mickym Es funktioniert! Woohoo!
Er packt jetzt aber alles in eine Spalte und die anderen Spaltennamen stehen dort auch noch aufgeführt..
-
@surfer09 Ja - Punkt eins ich hatte den Spaltentrenner auf Tab eingestellt, damit man nicht mit Dezimalzahlen in Konflikt kommt. Das machst Du also beim Excel import ebenfalls.
Ansonsten kannst Du das Trennzeichen in der CSV Node konfigurieren:
Die Spaltenüberschriften, sowie das Datumsformat sind in der 1. Change Node nach der JOIN Node konfiguriert:
Da einfach den String kürzen. Die Überschriften sind mit Komma getrennt.Die mittlere Zeile in der Change Node kannst eh löschen (auf das x rechts klicken( - das war wohl irgendein Überbleibsel
Wenn Du keine Dezimalzahlen da drin stehen hast in Deinem Datenpunkt, dann kann man sich das Formateingabe, was für ein Zahlenformat rauskommen soll auch sparen.
-
@mickym Was soll ich sagen? Du bist der Beste
Es funktioniert jetzt. Allerdings kann ich scheinbar die CSV-Datei nur lokal ablegen - was mich so aber jetzt nicht stört, vermutlich ist das ein Rechte Problem.
Dezimalstellen kommen auf jeden Fall vor, daher passt das so schon.Meine jetzige Node-Red Kodierung habe ich gerade mal exportiert, vielleicht können andere das ja auch gebrauchen, um einen Datenpunkt in eine CSV-Datei zu schreiben:
[ { "id": "1f191dc3161284eb", "type": "tab", "label": "Flow 1", "disabled": false, "info": "", "env": [] }, { "id": "f8853ddf8535a98c", "type": "ioBroker in", "z": "1f191dc3161284eb", "name": "Tagesertrag-Solaranlage-Carport", "topic": "0_userdata.0.Tagesertrag-Solaranlage-Carport", "payloadType": "value", "onlyack": "", "func": "all", "gap": "", "fireOnStart": "false", "outFormat": "MQTT", "x": 170, "y": 320, "wires": [ [ "ff441e41.86da6" ] ] }, { "id": "cd391a0c.856018", "type": "file", "z": "1f191dc3161284eb", "name": "", "filename": "", "appendNewline": false, "createDir": false, "overwriteFile": "false", "encoding": "cp1252", "x": 1900, "y": 500, "wires": [ [] ] }, { "id": "792b60ad.f1578", "type": "csv", "z": "1f191dc3161284eb", "name": "", "sep": ";", "hdrin": "", "hdrout": "once", "multi": "one", "ret": "\\r\\n", "temp": "", "skip": "0", "strings": true, "include_empty_strings": "", "include_null_values": "", "x": 1340, "y": 500, "wires": [ [ "df1d94b.c458e68" ] ] }, { "id": "8f1ae972.d5f228", "type": "change", "z": "1f191dc3161284eb", "name": "", "rules": [ { "t": "set", "p": "reset", "pt": "msg", "to": "true", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1170, "y": 440, "wires": [ [ "792b60ad.f1578" ] ] }, { "id": "fbd8dc3f.4df7c", "type": "change", "z": "1f191dc3161284eb", "name": "", "rules": [ { "t": "set", "p": "columns", "pt": "msg", "to": "Datum & Uhrzeit,Ertrag in kWh", "tot": "str" }, { "t": "set", "p": "payload[\"Datum & Uhrzeit\"]", "pt": "msg", "to": "", "tot": "date" }, { "t": "set", "p": "payload[\"Datum & Uhrzeit\"]", "pt": "msg", "to": "$moment().locale(\"de\").tz('Europe/Berlin').format('DD.MM.YYYY HH:mm:ss')", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 780, "y": 480, "wires": [ [ "31ffef83.0a28a" ] ] }, { "id": "31ffef83.0a28a", "type": "switch", "z": "1f191dc3161284eb", "name": "NewFile?", "property": "fNewFile", "propertyType": "flow", "rules": [ { "t": "true" }, { "t": "false" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 970, "y": 480, "wires": [ [ "8f1ae972.d5f228" ], [ "792b60ad.f1578" ] ] }, { "id": "ff441e41.86da6", "type": "change", "z": "1f191dc3161284eb", "name": "Ertrag in kWh", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "Ertrag in kWh", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 200, "y": 480, "wires": [ [ "579569f5.ebb9c8" ] ] }, { "id": "df1d94b.c458e68", "type": "change", "z": "1f191dc3161284eb", "name": "fNewFile = false", "rules": [ { "t": "set", "p": "fNewFile", "pt": "flow", "to": "false", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1510, "y": 500, "wires": [ [ "7f14f556.0e8bcc" ] ] }, { "id": "7f14f556.0e8bcc", "type": "change", "z": "1f191dc3161284eb", "name": "", "rules": [ { "t": "set", "p": "filename", "pt": "msg", "to": "I:\\Solarertrag.csv", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1720, "y": 500, "wires": [ [ "cd391a0c.856018" ] ] }, { "id": "579569f5.ebb9c8", "type": "change", "z": "1f191dc3161284eb", "name": "Zahlen Komma", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "$formatNumber(payload, \"#,####\", {'decimal-separator':',', 'grouping-separator':'.'} )\t", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 410, "y": 480, "wires": [ [ "8f46052e.5418c8", "3c6c5d15.ba7f42" ] ] }, { "id": "8f46052e.5418c8", "type": "join", "z": "1f191dc3161284eb", "name": "", "mode": "custom", "build": "object", "property": "payload", "propertyType": "msg", "key": "topic", "joiner": "\\n", "joinerType": "str", "accumulate": false, "timeout": "", "count": "1", "reduceRight": false, "reduceExp": "", "reduceInit": "", "reduceInitType": "", "reduceFixup": "", "x": 600, "y": 480, "wires": [ [ "fbd8dc3f.4df7c" ] ] }, { "id": "3c6c5d15.ba7f42", "type": "fs-ops-access", "z": "1f191dc3161284eb", "name": "", "path": "I:\\", "pathType": "str", "filename": "Solarertrag.csv", "filenameType": "str", "read": true, "write": true, "throwerror": false, "x": 640, "y": 620, "wires": [ [ "8d3670b.8ae109" ], [ "ea9cb3bc.5c8b4" ] ] }, { "id": "8d3670b.8ae109", "type": "change", "z": "1f191dc3161284eb", "name": "fNewFile = false", "rules": [ { "t": "set", "p": "fNewFile", "pt": "flow", "to": "false", "tot": "bool" }, { "t": "set", "p": "payload", "pt": "msg", "to": "File found - fNewFile=false", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 830, "y": 580, "wires": [ [ "992590f7.3b452" ] ] }, { "id": "ea9cb3bc.5c8b4", "type": "change", "z": "1f191dc3161284eb", "name": "fNewFile = true", "rules": [ { "t": "set", "p": "fNewFile", "pt": "flow", "to": "true", "tot": "bool" }, { "t": "set", "p": "payload", "pt": "msg", "to": "File not found - fNewFile=true", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 830, "y": 660, "wires": [ [ "992590f7.3b452" ] ] }, { "id": "992590f7.3b452", "type": "debug", "z": "1f191dc3161284eb", "name": "", "active": true, "tosidebar": false, "console": false, "tostatus": true, "complete": "payload", "targetType": "msg", "statusVal": "payload", "statusType": "msg", "x": 1020, "y": 620, "wires": [] } ]
Danke auf jeden Fall an @mickym !
-
@surfer09 Na das freut mich, ich sehe das Zeitformat hast Du ebenfalls bereits angepasst.
Aber fehlt da nicht noch was?
Wolltest Du diese Datenpunkte nicht nur innerhalb eines bestimmten Zeitfensters auslesen? Und ich hoffe Du hast einen kleinen Einblick in die Funktionsweise von Node Red bekommen.
-
@mickym Nein, das ist völlig okay so. Die Daten sollen einfach jeden Tag untereinander weggeschrieben werden. Der Datenpunkt wird jeden Abend um 23:30 Uhr mit dem Tageswert beschrieben und dann um 23:59 Uhr zurück auf 0 gesetzt.