NEWS
Mehrere Objektwerte in CSV schreiben *gelöst*
-
Hallo zusammen,
ich würde gerne mehrere Objektwerte in eine CSV Datei schreiben lassen. Ich habe aktuell einen Flow für einen Wert und weiß aber nicht, wie ich jetzt mehrere Werte hier einbauen kann.
[ { "id": "1f191dc3161284eb", "type": "tab", "label": "Solarertrag als CSV", "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": "update", "func": "all", "gap": "", "fireOnStart": "false", "outFormat": "MQTT", "x": 170, "y": 320, "wires": [ [ "ff441e41.86da6" ] ] }, { "id": "cd391a0c.856018", "type": "file", "z": "1f191dc3161284eb", "name": "", "filename": "I:\\CSV\\Solarertrag_Balkonkraftwerk.csv", "filenameType": "str", "appendNewline": false, "createDir": false, "overwriteFile": "false", "encoding": "cp1252", "x": 2040, "y": 500, "wires": [ [] ] }, { "id": "792b60ad.f1578", "type": "csv", "z": "1f191dc3161284eb", "name": "", "sep": ";", "hdrin": "", "hdrout": "none", "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:\\CSV\\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": 440, "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": true, "timeout": "", "count": "1", "reduceRight": false, "reduceExp": "", "reduceInit": "", "reduceInitType": "", "reduceFixup": "", "x": 600, "y": 480, "wires": [ [ "fbd8dc3f.4df7c" ] ] }, { "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": [] }, { "id": "3c6c5d15.ba7f42", "type": "fs-ops-access", "z": "1f191dc3161284eb", "name": "", "path": "I:\\CSV", "pathType": "str", "filename": "Solarertrag_Balkonkraftwerk.csv", "filenameType": "str", "read": true, "write": true, "throwerror": false, "x": 530, "y": 580, "wires": [ [ "8d3670b.8ae109" ], [ "ea9cb3bc.5c8b4" ] ] } ]
-
Warum noch ein weiterer thread ?
Anbei Beispiel, wie ich meine Photovoltaik Werte 1x täglich in csv speichere.
Ändere es nach deinen Vorstellung ab:// Daten in Datei schreiben (/home/nfs/Privat/Haus/Photovoltaik/SolarpowerLog.csv) var Zaehler_180 = (getState("smartmeter.1.1-0:1_8_0__255.value").val).toFixed(2); var Zaehler_280 = (getState("smartmeter.1.1-0:2_8_0__255.value").val).toFixed(2); var Prod_alt = getState(java+"2012_Tagesleistung").val; var Prod_neu = getState(java+"2023_Tagesleistung_neu").val; var Prod_alt_neu = getState(java+"2023_Tagesleistung_alt_neu").val; var Netz_bezogen = (getState(java+"Auswertung.Tag.Netz_Meter_bezogen").val).toFixed(2); var Netz_eingespeist = (getState(java+"Auswertung.Tag.Netz_Meter_eingespeist").val).toFixed(2); var Haus_Verbrauch = (getState(java+"Auswertung.Tag.Haus_Verbrauch").val).toFixed(2); var string = Tag + "." + Monat + "." + Jahr + ";" + Zaehler_180 + ";" + Zaehler_280 + ";" + Prod_alt + ";" + Prod_neu + ";" + Prod_alt_neu + ";" + Netz_bezogen + ";" + Netz_eingespeist + ";" + Haus_Verbrauch; fs.appendFileSync("/home/nfs/Privat/Haus/Photovoltaik/SolarpowerLog.csv", string + "\n"); log("Tag ->Huawei csv in Datei geschrieben: " + string, "info");
-
@bahnuhr sagte in Mehrere Objektwerte in CSV schreiben:
Warum noch ein weiterer thread ?
Hallo @bahnuhr,
ich hatte mit @mickym schon geschrieben und er meinte, ich sollte einen eigenen Thread dafür erstellen. Bei der anderen Diskussion ging es nicht um NodeRed. -
@surfer09 sagte in Mehrere Objektwerte in CSV schreiben:
@bahnuhr sagte in Mehrere Objektwerte in CSV schreiben:
Warum noch ein weiterer thread ?
Hallo @bahnuhr,
ich hatte mit mickym schon geschrieben und er meinte, ich sollte einen eigenen Thread dafür erstellen. Bei der anderen Diskussion ging es nicht um NodeRed.versteh ich nicht.
Hier steht auch nichts von nodered.Aber wenn du meinst.
Bin jetzt raus hier. -
@bahnuhr ?? Ich bin doch im NodeRed Unterforum? Um was sollte es denn sonst gehen? Aber trotzdem Danke für dein Java Skript!
-
@bahnuhr sagte in Mehrere Objektwerte in CSV schreiben:
Warum noch ein weiterer thread ?
weil es hier um node-red geht
-
OK - ich habe Deinen Flow importiert.
Das ist eigentlich ganz easy. Du musst halt alles in einem Objekt sammeln. Nachdem Deine Zeilen ja wohl alle Daten enthalten sollen - gehe ich nicht davon aus, dass Du warten möchtest bis jeder Wert triggert?
Du könntest dann selbst triggern und alle Werte sammeln, die Du in eine Zeile schreiben willst. Oder was willst Du? Aber wie gesagt erst musst Du Dir überlegen, wann Du eine Zeile schreiben möchtest. Du kannst natürlich auch jedesmal eine Zeile schreiben, wenn sich nur ein Wert geändert hat.
Wenn die Werte alle über eine Wildcard sammeln kannst, dann kannst Du auch eine list Node verwenden. Wie sehen denn Deine Daten aus?
-
@mickym Genau, der hintere Teil mit der Datei wird sich vermutlich nicht ändern. Nur ich bin jetzt total überfordert wie und wo ich die 3 Werte unterbringe. Alle 3 Datenpunkte werden mit Blockly um 23:59 mit den aktuellen Werte überschrieben. Am besten wäre, wenn die Werte dann kurz danach in die CSV geschossen werden.
Ich benötige Spalte 1 Datum/Uhrzeit der Übertragung, Spalte 2 Wert1, Spalte 3 Wert2, Spalte 4 Wert3. Die Werte sind alles Dezimalwerte mit 2 Nachkommastellen wenn das wichtig ist.Müssen diese beiden Kollegen dann pro Datenpunkt angelegt werden?
-
@surfer09 Ja genau - wenn die 3 DP zur gleichen Zeit geschrieben werden, dann ist es am Einfachsten Du kopierst diese 2 Node noch 2 mal mit unterschiedlichen Imput und topic
Du musst nur dafür Sorge tragen, dass der topic dann Deinen Spalten entspricht unt unterschiedlich ist.
In der JOIN Node
machst Du den Haken raus, dass jede nachfolgende Antwort geschrieben wird. Und setzt die Anzahl auf 3 - dann muss von jeder IN Node ein Wert kommen - bevor der Flow weitergeht. Es wird also gewartet bis alle 3 Werte aktualisiert wurden.
In der nachfolgenden Change NOde musst dann nur noch die beiden Spalten in msg.columns der beiden anderen Werte einfügen:
Diese müssen mit den topics matchen.
Das war es dann auch schon.
Um das Ganze zu testen, musst du zumindest alle 3 Werte einmal aktualisieren - kannst du auch in der Objektansicht des iobrokers machen, indem du den Wert nochmal schreibst.
-
@mickym Danke für diese tolle Anleitung! Ich habe jetzt allerdings noch eine Kleinigkeit.
In der erzeugten Datei fehlen die Spaltenüberschriften:
Eigentlich hatte ich doch definiert?!
[ { "id": "1f2e3e76bc22eaf5", "type": "tab", "label": "Stromverbrauch Übersicht", "disabled": false, "info": "", "env": [] }, { "id": "c89470695baf12cc", "type": "ioBroker in", "z": "1f2e3e76bc22eaf5", "name": "Gestriger-Stromverbrauch-inkl-Netzbezug", "attrname": "", "topic": "0_userdata.0.PV-Anlage.Gestriger-Stromverbrauch-inkl-Netzbezug", "payloadType": "value", "onlyack": "", "func": "all", "gap": "", "fireOnStart": "false", "outFormat": "MQTT", "x": 420, "y": 240, "wires": [ [ "f66599290600f4d8" ] ] }, { "id": "cc9f98ec38dad97b", "type": "file", "z": "1f2e3e76bc22eaf5", "name": "", "filename": "I:\\CSV\\Stromverbrauch_Übersicht.csv", "filenameType": "str", "appendNewline": false, "createDir": false, "overwriteFile": "false", "encoding": "cp1252", "x": 2910, "y": 320, "wires": [ [] ] }, { "id": "439d2a3a5f5b523d", "type": "csv", "z": "1f2e3e76bc22eaf5", "name": "", "sep": ";", "hdrin": "", "hdrout": "none", "multi": "one", "ret": "\\r\\n", "temp": "", "skip": "0", "strings": true, "include_empty_strings": "", "include_null_values": "", "x": 2220, "y": 320, "wires": [ [ "e05b34f6096c6b4d" ] ] }, { "id": "dc242a92a7abcdd9", "type": "change", "z": "1f2e3e76bc22eaf5", "name": "", "rules": [ { "t": "set", "p": "reset", "pt": "msg", "to": "true", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 2050, "y": 260, "wires": [ [ "439d2a3a5f5b523d" ] ] }, { "id": "9e53a2c71f32654a", "type": "change", "z": "1f2e3e76bc22eaf5", "name": "", "rules": [ { "t": "set", "p": "columns", "pt": "msg", "to": "Datum & Uhrzeit,Stromverbrauch inkl. Netzbezug,Netzbezug,Stromverbrauch Haus von PV", "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": 1660, "y": 300, "wires": [ [ "6d90d97e2c1f4927" ] ] }, { "id": "6d90d97e2c1f4927", "type": "switch", "z": "1f2e3e76bc22eaf5", "name": "NewFile?", "property": "fNewFile", "propertyType": "flow", "rules": [ { "t": "true" }, { "t": "false" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 1850, "y": 300, "wires": [ [ "dc242a92a7abcdd9" ], [ "439d2a3a5f5b523d" ] ] }, { "id": "f66599290600f4d8", "type": "change", "z": "1f2e3e76bc22eaf5", "name": "Stromverbrauch inkl. Netzbezug", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "Stromverbrauch inkl. Netzbezug", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 770, "y": 240, "wires": [ [ "cad5874ffe081a65" ] ] }, { "id": "e05b34f6096c6b4d", "type": "change", "z": "1f2e3e76bc22eaf5", "name": "fNewFile = false", "rules": [ { "t": "set", "p": "fNewFile", "pt": "flow", "to": "false", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 2390, "y": 320, "wires": [ [ "e5d2ec578c236fb9" ] ] }, { "id": "e5d2ec578c236fb9", "type": "change", "z": "1f2e3e76bc22eaf5", "name": "", "rules": [ { "t": "set", "p": "filename", "pt": "msg", "to": "I:\\CSV\\Stromverbrauch_Übersicht.csv", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 2600, "y": 320, "wires": [ [ "cc9f98ec38dad97b" ] ] }, { "id": "cad5874ffe081a65", "type": "change", "z": "1f2e3e76bc22eaf5", "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": 1320, "y": 300, "wires": [ [ "16d2ba80b692091d", "694d4a67103a09b9" ] ] }, { "id": "16d2ba80b692091d", "type": "join", "z": "1f2e3e76bc22eaf5", "name": "", "mode": "custom", "build": "object", "property": "payload", "propertyType": "msg", "key": "topic", "joiner": "\\n", "joinerType": "str", "accumulate": false, "timeout": "", "count": "3", "reduceRight": false, "reduceExp": "", "reduceInit": "", "reduceInitType": "", "reduceFixup": "", "x": 1480, "y": 300, "wires": [ [ "9e53a2c71f32654a" ] ] }, { "id": "6cebbec48955b658", "type": "change", "z": "1f2e3e76bc22eaf5", "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": 1710, "y": 400, "wires": [ [ "1463c0a51e142c55" ] ] }, { "id": "a4484cd91c127f61", "type": "change", "z": "1f2e3e76bc22eaf5", "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": 1710, "y": 480, "wires": [ [ "1463c0a51e142c55" ] ] }, { "id": "1463c0a51e142c55", "type": "debug", "z": "1f2e3e76bc22eaf5", "name": "", "active": true, "tosidebar": false, "console": false, "tostatus": true, "complete": "payload", "targetType": "msg", "statusVal": "payload", "statusType": "msg", "x": 1900, "y": 440, "wires": [] }, { "id": "694d4a67103a09b9", "type": "fs-ops-access", "z": "1f2e3e76bc22eaf5", "name": "", "path": "I:\\CSV", "pathType": "str", "filename": "Stromverbrauch_Übersicht.csv", "filenameType": "str", "read": true, "write": true, "throwerror": false, "x": 1410, "y": 400, "wires": [ [ "6cebbec48955b658" ], [ "a4484cd91c127f61" ] ] }, { "id": "e4c4bc1098c16a5e", "type": "ioBroker in", "z": "1f2e3e76bc22eaf5", "name": "Netzbezug-Vortag-23-59", "attrname": "", "topic": "0_userdata.0.PV-Anlage.Netzbezug-Vortag-23-59", "payloadType": "value", "onlyack": "", "func": "all", "gap": "", "fireOnStart": "false", "outFormat": "MQTT", "x": 370, "y": 320, "wires": [ [ "042a57214d3861d4" ] ] }, { "id": "042a57214d3861d4", "type": "change", "z": "1f2e3e76bc22eaf5", "name": "Netzbezug", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "Netzbezug", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 670, "y": 320, "wires": [ [ "cad5874ffe081a65" ] ] }, { "id": "ed0362d319bee9a9", "type": "ioBroker in", "z": "1f2e3e76bc22eaf5", "name": "Stromverbrauch-Haus-von-PV-Vortag-23-59", "attrname": "", "topic": "0_userdata.0.PV-Anlage.Stromverbrauch-Haus-von-PV-Vortag-23-59", "payloadType": "value", "onlyack": "", "func": "all", "gap": "", "fireOnStart": "false", "outFormat": "MQTT", "x": 430, "y": 420, "wires": [ [ "a0360e6a43ea4b41" ] ] }, { "id": "a0360e6a43ea4b41", "type": "change", "z": "1f2e3e76bc22eaf5", "name": "Stromverbrauch Haus von PV", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "Stromverbrauch Haus von PV", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 790, "y": 420, "wires": [ [ "cad5874ffe081a65" ] ] } ]
Eine weitere Frage wäre noch: Glücklicherweise sind das ja jetzt alles Zahlenwerte. Was wäre wenn jetzt noch ein weiterer Wert hinzukommen würde, der Text enthält?
Müsste das dann so aussehen? -
Ich glaube, das mit den Spaltenüberschriften habe ich gefunden. Ob das so richtig ist? Bei meinem Test hat es zumindest funktioniert
-
@surfer09 wenn es funktioniert ist doch bestens. ja irgendwo in der csv node definiert man das und die Überschriften sind ja durch msg.coöumns festgelegt.
Vielleicht wirst ja doch noch ein NodeRed Fan: -
@mickym Im Prinzip funktioniert das ja alles wunderbar, wenn man weiß an welchen Schrauben man drehen muss
-
Moin
Gut das das Thema gerade auf ist habe da auch eine Frage. Ich habe 3 Werte siehe Flow diese 3 Werte möchte ich in die CSV schreiben. Funktioniert auch soweit nur werden die Werte unterschiedlich aktualisiert und dann habe ich in meiner CSV ein durcheinander.
Mit nur einem Wert klappt das problemlos.Danke euch
-
@amutep nun dann mach vorne nicht so ein Durcheinander und sorge dafür, dass es 4 unterschiedliche topics sind. dann wartet sie auch bis alle 4 getriggert wurden. wenn du willst, dass nur am Anfang auf alle 4 gewartet wird und dann bei je dem Update eine neue Zeile geschrieben wird, dann halt den Haken bei jeder nachfolgenden Nachricht einen Haken machen