Umsetzung eines Datenlogger mit Redmatic / Anlegen von Dateiern

Node-RED als CCU3/RaspberryMatic Addon, WebApp, HomeKit, ...

Moderator: Co-Administratoren

Antworten
FPrausse
Beiträge: 2
Registriert: 05.05.2023, 23:36
System: CCU

Umsetzung eines Datenlogger mit Redmatic / Anlegen von Dateiern

Beitrag von FPrausse » 05.05.2023, 23:59

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
Dateianhänge
DataLogger.zip
(3.42 KiB) 24-mal heruntergeladen

Benutzeravatar
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

Beitrag von Henke » 06.05.2023, 01:38

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.

FPrausse
Beiträge: 2
Registriert: 05.05.2023, 23:36
System: CCU

Re: Umsetzung eines Datenlogger mit Redmatic / Anlegen von Dateiern

Beitrag von FPrausse » 07.05.2023, 07:23

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

Benutzeravatar
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

Beitrag von Henke » 07.05.2023, 15:38

FPrausse hat geschrieben:
07.05.2023, 07:23
Im CSV Format wären die Daten über einen Tag so im Bereich 4-5MB, kann ein Object das handeln?
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.
Screenshot 2023-05-07 152610.jpg
Ich nutze dabei gerne das Global, da ich so schnell eine Übersicht bekomme, was gerade an Daten da ist:
Screenshot 2023-05-07 152654.jpg
und nun der hoch komplexe Flow 8)

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
    }
]
Für die Email musst du den String wohl noch in einen Buffer umwandeln.

Code: Alles auswählen

msg.buffer= Buffer.from(msg.payload);

Antworten

Zurück zu „RedMatic“