Hallo zusammen,
ich möchte gerne auf meiner Homematic einen Datenlogger implementieren.
Idee: "Die Daten werden tageweise in ein CSV geschrieben und nach Mitternacht per Email versendet"
Ich habe dazu bereits einen funktionierenden Node Red Flow erstellt, der auf dem Raspi(nur Temporär im Einsatz) bereits sauber arbeitet. Flow im Anhang.
Ich nutze in dem Flow node-red-contrib-fs zum schreiben der Dateien. Leider klappt das auf der Homematic bisher garnicht, die csv-Datei wir nicht erzeugt.
Ich habe mich per SSH auf meine Homematic eingeloggt und einen Ordner /usr/local/FoxEssLog/ angelegt. Dieser hat auch Schreibrechte von allen Nutzern. Hat jemand eine Idee was bei der Homematic hier anders ist als beim Raspi?
Hat jemand schonmal erfolgreich Dateien im Node Red mit dem fs Paket angelegt und kann mir sagen wie ich da vorgehen muss?
Vielen Dank und freundliche Grüße
F. Prauße
Umsetzung eines Datenlogger mit Redmatic / Anlegen von Dateiern
Moderator: Co-Administratoren
Umsetzung eines Datenlogger mit Redmatic / Anlegen von Dateiern
- Dateianhänge
-
- DataLogger.zip
- (3.42 KiB) 24-mal heruntergeladen
- Henke
- Beiträge: 1536
- Registriert: 27.06.2022, 20:51
- System: CCU
- Hat sich bedankt: 144 Mal
- Danksagung erhalten: 309 Mal
Re: Umsetzung eines Datenlogger mit Redmatic / Anlegen von Dateiern
node-red-contrib-fs nutze ich nicht und bin wenig motiviert es zu installieren.
Ich versuche die Schreibzugriffe so weit wie möglich zu reduzieren und daher wäre meine Empfehlung:
Puffer die Daten einfach in einem flow oder global Objekt, d.h. im Speicher, und lösche sie nach dem Versenden.
Reduziert den Flow auf gut 1/3.
Ich versuche die Schreibzugriffe so weit wie möglich zu reduzieren und daher wäre meine Empfehlung:
Puffer die Daten einfach in einem flow oder global Objekt, d.h. im Speicher, und lösche sie nach dem Versenden.
Reduziert den Flow auf gut 1/3.
Re: Umsetzung eines Datenlogger mit Redmatic / Anlegen von Dateiern
Hallo danke für die schnelle Antwort.
Hättest du bezüglich dem Puffern im Flow oder Global Objekt evtl. ein Beispiel wie man sowas machen könnte?
Im CSV Format wären die Daten über einen Tag so im Bereich 4-5MB, kann ein Object das handeln?
Vielen Dank und freundliche Grüsse
F. Prausse
Hättest du bezüglich dem Puffern im Flow oder Global Objekt evtl. ein Beispiel wie man sowas machen könnte?
Im CSV Format wären die Daten über einen Tag so im Bereich 4-5MB, kann ein Object das handeln?
Vielen Dank und freundliche Grüsse
F. Prausse
- Henke
- Beiträge: 1536
- Registriert: 27.06.2022, 20:51
- System: CCU
- Hat sich bedankt: 144 Mal
- Danksagung erhalten: 309 Mal
Re: Umsetzung eines Datenlogger mit Redmatic / Anlegen von Dateiern
Im Speicher ist das weniger und bei 4-5 geht das locker. Evtl. kann man noch einen Filter auf nur veränderte Werte bzw. einen "Swinging Door" davor setzen. Das reduziert das ganze.
Nehmen wir als Input Daten, die ein Topic,ts und payload haben.
Ich nutze dabei gerne das Global, da ich so schnell eine Übersicht bekomme, was gerade an Daten da ist: und nun der hoch komplexe Flow
Code: Alles auswählen
[
{
"id": "8bee8afabd779d19",
"type": "inject",
"z": "427fc89b.e34038",
"name": "Test1",
"props": [
{
"p": "topic",
"vt": "str"
},
{
"p": "payload"
},
{
"p": "ts",
"v": "",
"vt": "date"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "Test1",
"payload": "1.5",
"payloadType": "num",
"x": 270,
"y": 2960,
"wires": [
[
"44a8848986376478"
]
]
},
{
"id": "41d6baba755c8ef1",
"type": "inject",
"z": "427fc89b.e34038",
"name": "Test1",
"props": [
{
"p": "topic",
"vt": "str"
},
{
"p": "payload"
},
{
"p": "ts",
"v": "",
"vt": "date"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "Test1",
"payload": "1.2",
"payloadType": "num",
"x": 270,
"y": 3020,
"wires": [
[
"44a8848986376478"
]
]
},
{
"id": "23d8722147f47d35",
"type": "inject",
"z": "427fc89b.e34038",
"name": "Test2",
"props": [
{
"p": "topic",
"vt": "str"
},
{
"p": "payload"
},
{
"p": "ts",
"v": "",
"vt": "date"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "Test2",
"payload": "1.0",
"payloadType": "num",
"x": 270,
"y": 3080,
"wires": [
[
"44a8848986376478"
]
]
},
{
"id": "44a8848986376478",
"type": "function",
"z": "427fc89b.e34038",
"name": "CsvList Add Data",
"func": "let Cl = global.get ( \"CsvList\")||{};\n\nif ( !Cl[msg.topic])\n Cl[msg.topic] = {};\n\nCl[msg.topic][msg.ts] = msg.payload;\n\nglobal.set( \"CsvList\", Cl );\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 550,
"y": 3020,
"wires": [
[
"af68cdc0b212a06c"
]
]
},
{
"id": "af68cdc0b212a06c",
"type": "debug",
"z": "427fc89b.e34038",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": true,
"complete": "true",
"targetType": "full",
"statusVal": "payload",
"statusType": "msg",
"x": 735,
"y": 3020,
"wires": [],
"l": false
},
{
"id": "a1fe8b675f1f9504",
"type": "function",
"z": "427fc89b.e34038",
"name": "CsvList Output and del",
"func": "let Cl = global.get ( \"CsvList\");\n\nif ( !Cl)\n{\n node.warn(\"Keine Daten vorhanden\");\n return;\n}\n\nmsg.payload = \"topic,ts,payload\\n\"; // 1. Zeile Inhalt\nmsg.topic = \"csv\";\n\nfor (const Topic of Object.keys(Cl)) {\n for (const Ts of Object.keys(Cl[Topic])) {\n msg.payload += Topic + \",\" + Ts + \",\" + Cl[Topic][Ts] + \"\\n\";\n } \n}\nglobal.set(\"CsvList\", null);\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 560,
"y": 3180,
"wires": [
[
"035446756af8845f"
]
]
},
{
"id": "9a9a91f6c82065de",
"type": "inject",
"z": "427fc89b.e34038",
"name": "Ausgabe",
"props": [],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 280,
"y": 3180,
"wires": [
[
"a1fe8b675f1f9504"
]
]
},
{
"id": "035446756af8845f",
"type": "debug",
"z": "427fc89b.e34038",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": true,
"complete": "true",
"targetType": "full",
"statusVal": "payload",
"statusType": "msg",
"x": 755,
"y": 3180,
"wires": [],
"l": false
}
]
Code: Alles auswählen
msg.buffer= Buffer.from(msg.payload);