Zeit der Fensteröffnungen dokumetieren

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

Moderator: Co-Administratoren

Shawn26
Beiträge: 55
Registriert: 21.10.2017, 18:10
Hat sich bedankt: 19 Mal
Danksagung erhalten: 1 Mal

Zeit der Fensteröffnungen dokumetieren

Beitrag von Shawn26 » 05.02.2023, 15:43

Hallo Zusammen,

da ich noch sehr neu im Thema Node-Red (auf einem raspberrymatic ccu3) bin versuche ich mich so langsam hineinzudenken und -arbeiten.
Es ist mir noch nicht immer sehr "selbsterklärend" aber durch einige Beispiele und sehr guter Hilfe hier im Forum lerne ich dazu.

Bei dem jetzigen Thema aber stehe ich noch auf dem Schlauch. Ich möchte gerne meine Fensterkontakte "monitoren" und

a. die Zeit in denen das Fenster geöffnet ist in eine Variable schreiben und pro Tag festhalten
b. auf dem Dashboard einen "roten" Kreis für Fenster offen und einen "grünen" Kreis für Fenster geschlossen darstellen.

Ich denke mal die Zeit in denen die Fenster geöffnet sind frage ich mit einer "function" ab, aber da fehlt mir noch der Inhalt der function und vor allem wenn es überhaupt möglich ist wie ich es dann so speichere das es pro Tag (1 Woche würde reichen "Montag bis Sonntag" danach kann überschrieben werden) protokolliert wird.

Bei der Dashboard Darstellung fehlt mir grundsätzlich der Ansatz. Ich wüsste nämlich nicht wie ich rote / grüne Kreise für einen bestimmten Zustand darstelle.

Vielen Dank für jede Hilfe oder Gedankenansatz.

Shawn26

Benutzeravatar
Henke
Beiträge: 1520
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 140 Mal
Danksagung erhalten: 306 Mal

Re: Zeit der Fensteröffnungen dokumetieren

Beitrag von Henke » 05.02.2023, 16:18

Laufzeit ist etwas komplexer, aber da habe ich schon einen Subflow fertig.
Aufaddieren musst du schon selber...

Code: Alles auswählen

[
    {
        "id": "9c1fb25108b10ee8",
        "type": "subflow",
        "name": "Laufzeit",
        "info": "",
        "category": "",
        "in": [
            {
                "x": 60,
                "y": 100,
                "wires": [
                    {
                        "id": "541b7399c755f316"
                    }
                ]
            }
        ],
        "out": [
            {
                "x": 600,
                "y": 280,
                "wires": [
                    {
                        "id": "62bf429dced2f2cf",
                        "port": 0
                    }
                ]
            },
            {
                "x": 600,
                "y": 360,
                "wires": [
                    {
                        "id": "62bf429dced2f2cf",
                        "port": 1
                    }
                ]
            }
        ],
        "env": [
            {
                "name": "Raster",
                "type": "num",
                "value": "1",
                "ui": {
                    "type": "input",
                    "opts": {
                        "types": [
                            "num"
                        ]
                    }
                }
            },
            {
                "name": "Einheit",
                "type": "str",
                "value": "min",
                "ui": {
                    "type": "select",
                    "opts": {
                        "opts": [
                            {
                                "l": {
                                    "de": "sec"
                                },
                                "v": "sec"
                            },
                            {
                                "l": {
                                    "de": "Minuten"
                                },
                                "v": "min"
                            },
                            {
                                "l": {
                                    "de": "Stunde"
                                },
                                "v": "h"
                            }
                        ]
                    }
                }
            }
        ],
        "meta": {},
        "color": "#d580d5",
        "icon": "node-red-contrib-sun-position/clock-timer-white.svg",
        "status": {
            "x": 320,
            "y": 260,
            "wires": [
                {
                    "id": "462592acd0cb3688",
                    "port": 0
                }
            ]
        }
    },
    {
        "id": "62bf429dced2f2cf",
        "type": "unsafe-function",
        "z": "9c1fb25108b10ee8",
        "name": "Laufzeit",
        "func": "let payIn = msg.payload;\nlet fName = \"Laufzeit\";\nlet off = { ts: 0, on: false };\nlet start = flow.get(fName) || off;\nif (msg._input) {\n\n    if (msg.payload) {\n        start = { ts: msg.ts, on: true };\n        flow.set(fName, start);\n    }\n    else {\n        if (!start.on)\n            return;\n        flow.set(fName, off);\n\n    }\n    msg._input = false;\n}\n\nlet raster = Number(env.get(\"Raster\") || 1);\nlet einheit = env.get(\"Einheit\") || \"min\";\nlet einheitSec = 60;\nswitch (einheit) {\n    case \"sec\":\n        einheitSec = 1;\n        break;\n    case \"min\":\n        einheitSec = 60;\n        break;\n    case \"h\":\n        einheitSec = 60 * 60;\n        break;\n    default:\n        node.log(\"falsche Einheit\");\n        break;\n}\nmsg.delay = 1000 * raster * einheitSec;\nmsg.runSec = Math.round((msg.ts - start.ts) / 1000);\nmsg.payload = Math.round(msg.runSec / einheitSec * 100) / 100;\nmsg.runMili = msg.ts - start.ts;\n\nlet text = msg.payload + \" \" + einheit;\nnode.status({ fill: \"blue\", shape: \"ring\", text: text });\nif (!payIn)\n    return [null, msg];\nreturn msg;",
        "outputs": 2,
        "noerr": 0,
        "x": 420,
        "y": 100,
        "wires": [
            [
                "220b4faaf9197e20"
            ],
            [
                "519e5d85c5f7a5a5"
            ]
        ]
    },
    {
        "id": "220b4faaf9197e20",
        "type": "trigger",
        "z": "9c1fb25108b10ee8",
        "name": "",
        "op1": "",
        "op2": "true",
        "op1type": "nul",
        "op2type": "bool",
        "duration": "30",
        "extend": false,
        "overrideDelay": true,
        "units": "s",
        "reset": "",
        "bytopic": "all",
        "topic": "topic",
        "outputs": 1,
        "x": 690,
        "y": 140,
        "wires": [
            [
                "573f5ef88a6fd91c"
            ]
        ]
    },
    {
        "id": "573f5ef88a6fd91c",
        "type": "change",
        "z": "9c1fb25108b10ee8",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "ts",
                "pt": "msg",
                "to": "",
                "tot": "date"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 410,
        "y": 200,
        "wires": [
            [
                "62bf429dced2f2cf"
            ]
        ]
    },
    {
        "id": "519e5d85c5f7a5a5",
        "type": "change",
        "z": "9c1fb25108b10ee8",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "reset",
                "pt": "msg",
                "to": "true",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 700,
        "y": 100,
        "wires": [
            [
                "220b4faaf9197e20"
            ]
        ]
    },
    {
        "id": "462592acd0cb3688",
        "type": "status",
        "z": "9c1fb25108b10ee8",
        "name": "",
        "scope": [
            "62bf429dced2f2cf"
        ],
        "x": 160,
        "y": 260,
        "wires": [
            []
        ]
    },
    {
        "id": "541b7399c755f316",
        "type": "change",
        "z": "9c1fb25108b10ee8",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "_input",
                "pt": "msg",
                "to": "true",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 190,
        "y": 100,
        "wires": [
            [
                "a7d228d235100b22"
            ]
        ]
    },
    {
        "id": "cab19745f777b63a",
        "type": "switch",
        "z": "9c1fb25108b10ee8",
        "name": "",
        "property": "ts",
        "propertyType": "msg",
        "rules": [
            {
                "t": "istype",
                "v": "number",
                "vt": "number"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 150,
        "y": 180,
        "wires": [
            [
                "62bf429dced2f2cf"
            ],
            [
                "573f5ef88a6fd91c"
            ]
        ]
    },
    {
        "id": "a7d228d235100b22",
        "type": "unsafe-function",
        "z": "9c1fb25108b10ee8",
        "name": "Clone Message",
        "func": "let newMsg = RED.util.cloneMessage(msg);\nreturn newMsg;\n",
        "outputs": 1,
        "noerr": 0,
        "x": 180,
        "y": 140,
        "wires": [
            [
                "cab19745f777b63a"
            ]
        ]
    },
    {
        "id": "5bbd69abfd80a8f7",
        "type": "subflow:9c1fb25108b10ee8",
        "z": "dfdb2036.ae7008",
        "name": "",
        "env": [
            {
                "name": "Einheit",
                "value": "sec",
                "type": "str"
            }
        ],
        "x": 1520,
        "y": 4060,
        "wires": [
            [
                "325d3f7d7f8929e5"
            ],
            [
                "de134009545732e7"
            ]
        ]
    },
    {
        "id": "e103fdf65ec15ad8",
        "type": "inject",
        "z": "dfdb2036.ae7008",
        "name": "true",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "true",
        "payloadType": "bool",
        "x": 1290,
        "y": 4040,
        "wires": [
            [
                "5bbd69abfd80a8f7"
            ]
        ]
    },
    {
        "id": "0e40d7161e19abf1",
        "type": "inject",
        "z": "dfdb2036.ae7008",
        "name": "false",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "false",
        "payloadType": "bool",
        "x": 1290,
        "y": 4100,
        "wires": [
            [
                "5bbd69abfd80a8f7"
            ]
        ]
    },
    {
        "id": "325d3f7d7f8929e5",
        "type": "debug",
        "z": "dfdb2036.ae7008",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "counter",
        "x": 1705,
        "y": 4020,
        "wires": [],
        "l": false
    },
    {
        "id": "de134009545732e7",
        "type": "debug",
        "z": "dfdb2036.ae7008",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "runSec",
        "statusType": "msg",
        "x": 1705,
        "y": 4080,
        "wires": [],
        "l": false
    }
]
Für die Kreise nutze ich: LINK https://flows.nodered.org/node/node-red ... 9bbb563976

Shawn26
Beiträge: 55
Registriert: 21.10.2017, 18:10
Hat sich bedankt: 19 Mal
Danksagung erhalten: 1 Mal

Re: Zeit der Fensteröffnungen dokumetieren

Beitrag von Shawn26 » 06.02.2023, 08:16

Kann das sein das es bei mir der Import nicht funktioniert?
Erhalte nur diesen Flow und das erscheint mir etwas zu "einfach" und nicht wie von Dir angekündigt "komplex".
Flow.png
Flow.png (13.46 KiB) 488 mal betrachtet
Ich erhalte die Fehlermeldung. "Importierte Typ nicht erkannt - Unsafe Function"

Weiterhin vielen Dank.

Shawn26

Benutzeravatar
Henke
Beiträge: 1520
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 140 Mal
Danksagung erhalten: 306 Mal

Re: Zeit der Fensteröffnungen dokumetieren

Beitrag von Henke » 06.02.2023, 08:50

LINK https://flows.nodered.org/node/node-red ... e-function
über Palette installieren

Nun ja, wenn dir jemand, wie ich, die Arbeit abnimmt und einen Subflow programmiert, wird aus komplex einfach.
Sieh dir mal den Subflow Laufzeit an.

Shawn26
Beiträge: 55
Registriert: 21.10.2017, 18:10
Hat sich bedankt: 19 Mal
Danksagung erhalten: 1 Mal

Re: Zeit der Fensteröffnungen dokumetieren

Beitrag von Shawn26 » 06.02.2023, 16:36

@Henke:

Ok jetzt habe ich Deinen Flow mal getestet und er liefert mir die Öffnungszeit in Sekunden in den Payload.
Kann ich jetzt einfach statt der Debugausgabe dahinter eine SysVar packen und die Sekunden dann dort reinschreiben lassen?
Wie könnte ich es denn umsetzten das die Sekunden in den jeweiligen Wochentag geschrieben werden? Damit würden sich ja die Sekunden automatisch addieren.

Bzw. wie kann ich mit Node-Red den Wochentag bzw. das Datum abfragen? Weil dann könnte ich einen Switch mit 7 Ausgängen nutzen um in die entsprechende Variable zu schreiben.
Wären nur bei 7 Fenstern und 7 Wochentagen sehr viele Variablen. :?:


Die Auswertung kann ich nämlich dann via CCU-Historian sehr schön gestalten.

Sage schon einmal Danke!

Benutzeravatar
Henke
Beiträge: 1520
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 140 Mal
Danksagung erhalten: 306 Mal

Re: Zeit der Fensteröffnungen dokumetieren

Beitrag von Henke » 06.02.2023, 18:20

Shawn26 hat geschrieben:
06.02.2023, 16:36
Die Auswertung kann ich nämlich dann via CCU-Historian sehr schön gestalten.
Die kannst du auch direkt mit den Auf/Zu Daten auswerten, die er wahrscheinlich schon hat. Dafür brauchst du keine Zeit.

Genauso kann eine tägliche Anzeige im Dashboard ziemlich schnell erledigt werden. Auch ohne Zeit.
Screenshot 2023-02-06 175542.jpg
Von NodeRed aus schreibe ich, außer den Alarmvariablen, nichts mehr in die Systemvariablen der CCU. Warum auch, wenn es in NodeRed strukturiert geht und jede Stunde gesichert wird.

Die Laufzeit Node nutze ich um die Ausgabe direkt in das Log zu schreiben, die letzte evtl. im Dashboard anzuzeigen bzw. für Berechnungen.
Das Gegenstück dazu ist eine Timer Node, mit der ich z.B. die Sperrzeiten der Solepumpe steuere oder eine Warnung rausgebe, wenn das Lüften eines Raums beendet ist, es draußen kalt ist und nach 10 Minuten immer noch das Fenster offen ist.

Bitte nicht mit Konzepten anfangen, die 49 Systemvariablen benötigen. Eine, außer den Alarmvariablen, ist für mich schon eine zu viel.

Zur Not kannst du auch direkt Werte in den Historian schreiben, aber das habe ich über virtuelle Jack Geräte erledigt.

Was willst du eigentlich genau mit der täglichen Fenster offen Zeit herausbekommen oder erreichen?
Vielleicht habe ich da die richtige Idee.

Shawn26
Beiträge: 55
Registriert: 21.10.2017, 18:10
Hat sich bedankt: 19 Mal
Danksagung erhalten: 1 Mal

Re: Zeit der Fensteröffnungen dokumetieren

Beitrag von Shawn26 » 06.02.2023, 18:58

@Henke:

Aber ich bekomme doch im CCU-Historian nicht die Zeiten / Dauer der geöffneten Zeiten auf einen Blick angezeigt, oder habe ich das einfach nur noch nicht herausgefunden? Dann wäre ich da für eine Hilfe sehr dankbar.

Kann ich mit Deiner Laufzeit denn ggfs. im Dashboard die geöffneten / geschlossenen Fenster mit roten / grünen Symbolen (Punkten, oder oder oder) anzeigen lassen?
Oder was machst Du mit den Logs auf dem Dashboard.
Ich möchte Öffnungszeit und Luftfeuchtigkeit bei Außentemperatur / Außenluftfeuchtigkeit vergleichen um auf lange Sicht eine richtige Zeit / Dauer zum Öffnen der Fenster herauszufinden.

Also dann verwerfe ich die Idee mit Node-Red für die Öffnungszeiten wenn ich wenigstens anzeigen lassen kann (in rot und grünen Symbolen) welches Fenster offen bzw. geschlossen ist.
Und für einen Tipp um die Öffnungsdauer (außer manuelles Ablesen) der einzelnen Fenster im CCU-Historian herauszufinden wäre ich ebenfalls sehr dankbar.

Shawn26

Benutzeravatar
Henke
Beiträge: 1520
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 140 Mal
Danksagung erhalten: 306 Mal

Re: Zeit der Fensteröffnungen dokumetieren

Beitrag von Henke » 06.02.2023, 19:33

Historian:
Screenshot 2023-02-06 190411.jpg
Raumklima:
Und das ist es, was du glaube ich willst. Etwas komplexer und leider noch nicht soweit, das ich es frei gebe.
Eine Steuerung der Wandthermostate aller Räume mit Anzeige der Werte, Temperaturverläufe und Ventilstellungen. Berechnung einer Tagesdurchschnittstemperatur und mit dieser und den berechneten absoluten Feuchten und Taupunkten wird aufgrund eines eingegebenen rGes Wertes die kritische Feuchte an den kritischen Stellen der Wand berechnet. Daraus erfolgt am Ausgang entweder eine direkte Steuerung des Lüfters oder wie bei mir eine Anzeige im Dashboard und LED-Lichtschalten sowie, wenn die Fenster zu lange auf sind, eine WhatsUp.
Und das ganze ziemlich PlugAndPlay...
Screenshot 2023-02-06 193119.jpg

Shawn26
Beiträge: 55
Registriert: 21.10.2017, 18:10
Hat sich bedankt: 19 Mal
Danksagung erhalten: 1 Mal

Re: Zeit der Fensteröffnungen dokumetieren

Beitrag von Shawn26 » 07.02.2023, 13:45

@henke

Ok vielen Dank für die Info. Dann warte ich mal ab bis Du das ggfs. veröffentlichst. Aber Du hast Recht das ist genau das was ich suche.
Habe da noch eine Frage bzgl. Deines Laufzeit Nodes mit (Subflow).

Ich würde gerne die Information aus Deinem Laufzeit Node auf dem Dashboard anzeigen.
Sprich
Arbeitszimmer (Datum) (Öffnungsdauer in Minuten).
Wie bekomme ich es hin diese beiden Informationen aus dem Dashboard hintereinander anzuzeigen? Die Sekunden erhalte ich ja durch Dein msg. RunSec, aber wie mache ich darauf Minuten? Eine Funktion mit msg.Dauer = (msg.RunSec / 60) ergab eine sehr komische Zahl und woher erhalte ich das Datum an dem das Fenster geöffnet wurde.

Vielen Dank für jede Info

Shawn26

EDIT:


Ok das Umrechnen in Stunden, Minuten, Sekunden habe ich realisiert bekommen. Jetzt bräuchte ich nur das Datum davor.
ergebnis.jpg
ergebnis.jpg (10.6 KiB) 340 mal betrachtet

Benutzeravatar
Henke
Beiträge: 1520
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 140 Mal
Danksagung erhalten: 306 Mal

Re: Zeit der Fensteröffnungen dokumetieren

Beitrag von Henke » 07.02.2023, 15:19

Hmmm, du hast nicht gesehen, das man in der Node die Zeiteinheit einstellen kann?

Die Laufzeit Subnode habe ich erweitert, da kommen auch die Start und Endzeiten. Das zu formatieren ist etwas trickreich, daher als Beispiel mit dabei.
Eine Textausgabe ist trivial und da ich dabei war, etwas erweitert. Lass das Fenster mal 5 Minuten offen... :D

Code: Alles auswählen

[
    {
        "id": "41e065dd0d9db59a",
        "type": "subflow",
        "name": "Timer",
        "info": "",
        "category": "",
        "in": [
            {
                "x": 60,
                "y": 100,
                "wires": [
                    {
                        "id": "b6be82ce71d50f2e"
                    }
                ]
            }
        ],
        "out": [
            {
                "x": 900,
                "y": 80,
                "wires": [
                    {
                        "id": "52189109032f4e72",
                        "port": 0
                    },
                    {
                        "id": "0144c50db0631860",
                        "port": 0
                    }
                ]
            },
            {
                "x": 1000,
                "y": 380,
                "wires": [
                    {
                        "id": "ee1f9faafbf5c0ee",
                        "port": 0
                    }
                ]
            }
        ],
        "env": [
            {
                "name": "Raster",
                "type": "num",
                "value": "60",
                "ui": {
                    "label": {
                        "de": "CountDown"
                    },
                    "type": "input",
                    "opts": {
                        "types": [
                            "num"
                        ]
                    }
                }
            },
            {
                "name": "Einheit",
                "type": "str",
                "value": "sec",
                "ui": {
                    "type": "select",
                    "opts": {
                        "opts": [
                            {
                                "l": {
                                    "de": "sec"
                                },
                                "v": "sec"
                            },
                            {
                                "l": {
                                    "de": "Minuten"
                                },
                                "v": "min"
                            },
                            {
                                "l": {
                                    "de": "Stunde"
                                },
                                "v": "h"
                            }
                        ]
                    }
                }
            }
        ],
        "meta": {},
        "color": "#d580d5",
        "icon": "node-red/timer.svg",
        "status": {
            "x": 360,
            "y": 420,
            "wires": [
                {
                    "id": "66b8aa21a518647e",
                    "port": 0
                }
            ]
        }
    },
    {
        "id": "52189109032f4e72",
        "type": "unsafe-function",
        "z": "41e065dd0d9db59a",
        "name": "Timer",
        "func": "let payIn = msg.payload;\n\nlet start = flow.get(\"CounterStart\");\nif (msg._input) {\n    if (msg.payload) {\n        start = msg.ts;\n        flow.set(\"CounterStart\", start);\n    }\n    else\n    {\n        node.status({ fill: \"red\", shape: \"ring\", text: \"stopped\" });\n        msg.OK = false;\n        return [null, msg];\n    }\n    msg._input = false;\n}\n\nlet einheit = env.get(\"Einheit\") || \"min\";\nlet einheitSec = 60;\nswitch (einheit) {\n    case \"sec\":\n        einheitSec = 1;\n        break;\n    case \"min\":\n        einheitSec = 60;\n        break;\n    case \"h\":\n        einheitSec = 60 * 60;\n        break;\n    default:\n        node.log(\"falsche Einheit\");\n        break;\n}\nif (typeof msg.timeout !== 'number')\n    msg.timeout = Number(env.get(\"Raster\"));\n\nmsg.delay = 1000 * einheitSec;\nmsg.runSec = Math.round((msg.ts - start) / 1000);\n\nlet toRun = Math.round( (msg.timeout - msg.runSec / einheitSec) * 100) / 100;\nmsg.payload = Math.round ( toRun);\n\nlet text = toRun + \" \" + einheit;\nnode.status({ fill: \"blue\", shape: \"ring\", text: text });\nif (!payIn || (toRun <= 0)) {\n    msg.OK = payIn;\n    return [null, msg];\n}\nreturn msg;",
        "outputs": 2,
        "noerr": 0,
        "x": 570,
        "y": 200,
        "wires": [
            [
                "f06d6c847a25c15b"
            ],
            [
                "0aae46b333eed932",
                "c2b246482a0f5b23",
                "0144c50db0631860"
            ]
        ]
    },
    {
        "id": "f06d6c847a25c15b",
        "type": "trigger",
        "z": "41e065dd0d9db59a",
        "name": "",
        "op1": "",
        "op2": "true",
        "op1type": "nul",
        "op2type": "bool",
        "duration": "30",
        "extend": false,
        "overrideDelay": true,
        "units": "s",
        "reset": "",
        "bytopic": "all",
        "topic": "topic",
        "outputs": 1,
        "x": 850,
        "y": 240,
        "wires": [
            [
                "c6d3faced5056668"
            ]
        ]
    },
    {
        "id": "c6d3faced5056668",
        "type": "change",
        "z": "41e065dd0d9db59a",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "ts",
                "pt": "msg",
                "to": "",
                "tot": "date"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 570,
        "y": 300,
        "wires": [
            [
                "52189109032f4e72"
            ]
        ]
    },
    {
        "id": "66b8aa21a518647e",
        "type": "status",
        "z": "41e065dd0d9db59a",
        "name": "",
        "scope": [
            "52189109032f4e72"
        ],
        "x": 200,
        "y": 420,
        "wires": [
            []
        ]
    },
    {
        "id": "b6be82ce71d50f2e",
        "type": "change",
        "z": "41e065dd0d9db59a",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "_input",
                "pt": "msg",
                "to": "true",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 210,
        "y": 100,
        "wires": [
            [
                "8e9df6b929ecfa17"
            ]
        ]
    },
    {
        "id": "d402e8af08941609",
        "type": "switch",
        "z": "41e065dd0d9db59a",
        "name": "",
        "property": "ts",
        "propertyType": "msg",
        "rules": [
            {
                "t": "istype",
                "v": "number",
                "vt": "number"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 190,
        "y": 320,
        "wires": [
            [
                "52189109032f4e72"
            ],
            [
                "c6d3faced5056668"
            ]
        ]
    },
    {
        "id": "0aae46b333eed932",
        "type": "switch",
        "z": "41e065dd0d9db59a",
        "name": "",
        "property": "OK",
        "propertyType": "msg",
        "rules": [
            {
                "t": "true"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 790,
        "y": 320,
        "wires": [
            [
                "ee1f9faafbf5c0ee"
            ]
        ]
    },
    {
        "id": "ee1f9faafbf5c0ee",
        "type": "change",
        "z": "41e065dd0d9db59a",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "true",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 850,
        "y": 380,
        "wires": [
            []
        ]
    },
    {
        "id": "8e9df6b929ecfa17",
        "type": "unsafe-function",
        "z": "41e065dd0d9db59a",
        "name": "Clone Message",
        "func": "let newMsg = RED.util.cloneMessage(msg);\nreturn newMsg;\n",
        "outputs": 1,
        "noerr": 0,
        "x": 200,
        "y": 160,
        "wires": [
            [
                "d402e8af08941609"
            ]
        ]
    },
    {
        "id": "c2b246482a0f5b23",
        "type": "change",
        "z": "41e065dd0d9db59a",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "reset",
                "pt": "msg",
                "to": "true",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 860,
        "y": 200,
        "wires": [
            [
                "f06d6c847a25c15b"
            ]
        ]
    },
    {
        "id": "0144c50db0631860",
        "type": "change",
        "z": "41e065dd0d9db59a",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "0",
                "tot": "num"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 710,
        "y": 80,
        "wires": [
            []
        ]
    },
    {
        "id": "9c1fb25108b10ee8",
        "type": "subflow",
        "name": "Laufzeit",
        "info": "",
        "category": "",
        "in": [
            {
                "x": 60,
                "y": 100,
                "wires": [
                    {
                        "id": "541b7399c755f316"
                    }
                ]
            }
        ],
        "out": [
            {
                "x": 600,
                "y": 280,
                "wires": [
                    {
                        "id": "62bf429dced2f2cf",
                        "port": 0
                    }
                ]
            },
            {
                "x": 600,
                "y": 360,
                "wires": [
                    {
                        "id": "62bf429dced2f2cf",
                        "port": 1
                    }
                ]
            }
        ],
        "env": [
            {
                "name": "Raster",
                "type": "num",
                "value": "1",
                "ui": {
                    "type": "input",
                    "opts": {
                        "types": [
                            "num"
                        ]
                    }
                }
            },
            {
                "name": "Einheit",
                "type": "str",
                "value": "min",
                "ui": {
                    "type": "select",
                    "opts": {
                        "opts": [
                            {
                                "l": {
                                    "de": "sec"
                                },
                                "v": "sec"
                            },
                            {
                                "l": {
                                    "de": "Minuten"
                                },
                                "v": "min"
                            },
                            {
                                "l": {
                                    "de": "Stunde"
                                },
                                "v": "h"
                            }
                        ]
                    }
                }
            }
        ],
        "meta": {},
        "color": "#d580d5",
        "icon": "node-red-contrib-sun-position/clock-timer-white.svg",
        "status": {
            "x": 320,
            "y": 260,
            "wires": [
                {
                    "id": "462592acd0cb3688",
                    "port": 0
                }
            ]
        }
    },
    {
        "id": "62bf429dced2f2cf",
        "type": "unsafe-function",
        "z": "9c1fb25108b10ee8",
        "name": "Laufzeit",
        "func": "let payIn = msg.payload;\nlet fName = \"Laufzeit\";\nlet off = { ts: 0, on: false };\nlet start = flow.get(fName) || off;\nif (msg._input) {\n\n    if (msg.payload) {\n        start = { ts: msg.ts, on: true };\n        flow.set(fName, start);\n    }\n    else {\n        if (!start.on)\n            return;\n        flow.set(fName, off);\n\n    }\n    msg._input = false;\n}\n\nlet raster = Number(env.get(\"Raster\") || 1);\nlet einheit = env.get(\"Einheit\") || \"min\";\nlet einheitSec = 60;\nswitch (einheit) {\n    case \"sec\":\n        einheitSec = 1;\n        break;\n    case \"min\":\n        einheitSec = 60;\n        break;\n    case \"h\":\n        einheitSec = 60 * 60;\n        break;\n    default:\n        node.log(\"falsche Einheit\");\n        break;\n}\nmsg.delay = 1000 * raster * einheitSec;\nmsg.runSec = Math.round((msg.ts - start.ts) / 1000);\nmsg.payload = Math.round(msg.runSec / einheitSec * 100) / 100;\nmsg.Start = start.ts;\nmsg.End = msg.ts;\nmsg.runMili = msg.ts - start.ts;\n\nlet text = msg.payload + \" \" + einheit;\nnode.status({ fill: \"blue\", shape: \"ring\", text: text });\nif (!payIn)\n    return [null, msg];\nreturn msg;",
        "outputs": 2,
        "noerr": 0,
        "x": 420,
        "y": 100,
        "wires": [
            [
                "220b4faaf9197e20"
            ],
            [
                "519e5d85c5f7a5a5"
            ]
        ]
    },
    {
        "id": "220b4faaf9197e20",
        "type": "trigger",
        "z": "9c1fb25108b10ee8",
        "name": "",
        "op1": "",
        "op2": "true",
        "op1type": "nul",
        "op2type": "bool",
        "duration": "30",
        "extend": false,
        "overrideDelay": true,
        "units": "s",
        "reset": "",
        "bytopic": "all",
        "topic": "topic",
        "outputs": 1,
        "x": 690,
        "y": 140,
        "wires": [
            [
                "573f5ef88a6fd91c"
            ]
        ]
    },
    {
        "id": "573f5ef88a6fd91c",
        "type": "change",
        "z": "9c1fb25108b10ee8",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "ts",
                "pt": "msg",
                "to": "",
                "tot": "date"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 410,
        "y": 200,
        "wires": [
            [
                "62bf429dced2f2cf"
            ]
        ]
    },
    {
        "id": "519e5d85c5f7a5a5",
        "type": "change",
        "z": "9c1fb25108b10ee8",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "reset",
                "pt": "msg",
                "to": "true",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 700,
        "y": 100,
        "wires": [
            [
                "220b4faaf9197e20"
            ]
        ]
    },
    {
        "id": "462592acd0cb3688",
        "type": "status",
        "z": "9c1fb25108b10ee8",
        "name": "",
        "scope": [
            "62bf429dced2f2cf"
        ],
        "x": 160,
        "y": 260,
        "wires": [
            []
        ]
    },
    {
        "id": "541b7399c755f316",
        "type": "change",
        "z": "9c1fb25108b10ee8",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "_input",
                "pt": "msg",
                "to": "true",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 190,
        "y": 100,
        "wires": [
            [
                "a7d228d235100b22"
            ]
        ]
    },
    {
        "id": "cab19745f777b63a",
        "type": "switch",
        "z": "9c1fb25108b10ee8",
        "name": "",
        "property": "ts",
        "propertyType": "msg",
        "rules": [
            {
                "t": "istype",
                "v": "number",
                "vt": "number"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 150,
        "y": 180,
        "wires": [
            [
                "62bf429dced2f2cf"
            ],
            [
                "573f5ef88a6fd91c"
            ]
        ]
    },
    {
        "id": "a7d228d235100b22",
        "type": "unsafe-function",
        "z": "9c1fb25108b10ee8",
        "name": "Clone Message",
        "func": "let newMsg = RED.util.cloneMessage(msg);\nreturn newMsg;\n",
        "outputs": 1,
        "noerr": 0,
        "x": 180,
        "y": 140,
        "wires": [
            [
                "cab19745f777b63a"
            ]
        ]
    },
    {
        "id": "5bbd69abfd80a8f7",
        "type": "subflow:9c1fb25108b10ee8",
        "z": "dfdb2036.ae7008",
        "name": "",
        "x": 900,
        "y": 4000,
        "wires": [
            [
                "325d3f7d7f8929e5",
                "b873d656505f0f6a"
            ],
            [
                "de134009545732e7",
                "b873d656505f0f6a"
            ]
        ]
    },
    {
        "id": "e103fdf65ec15ad8",
        "type": "inject",
        "z": "dfdb2036.ae7008",
        "name": "true",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "true",
        "payloadType": "bool",
        "x": 690,
        "y": 4000,
        "wires": [
            [
                "5bbd69abfd80a8f7",
                "ce25eb89d818057f"
            ]
        ]
    },
    {
        "id": "0e40d7161e19abf1",
        "type": "inject",
        "z": "dfdb2036.ae7008",
        "name": "false",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "false",
        "payloadType": "bool",
        "x": 690,
        "y": 4060,
        "wires": [
            [
                "5bbd69abfd80a8f7",
                "ce25eb89d818057f"
            ]
        ]
    },
    {
        "id": "325d3f7d7f8929e5",
        "type": "debug",
        "z": "dfdb2036.ae7008",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "counter",
        "x": 1075,
        "y": 3940,
        "wires": [],
        "l": false
    },
    {
        "id": "de134009545732e7",
        "type": "debug",
        "z": "dfdb2036.ae7008",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "runSec",
        "statusType": "msg",
        "x": 1075,
        "y": 4040,
        "wires": [],
        "l": false
    },
    {
        "id": "b3d1d36dd03e2f76",
        "type": "ui_text",
        "z": "dfdb2036.ae7008",
        "group": "1b2f8d0aa186085d",
        "order": 2,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Arbeitszimmer:",
        "format": "{{msg.payload}} min - {{msg.StText}}",
        "layout": "row-left",
        "className": "",
        "x": 1360,
        "y": 4000,
        "wires": []
    },
    {
        "id": "ce25eb89d818057f",
        "type": "subflow:41e065dd0d9db59a",
        "z": "dfdb2036.ae7008",
        "name": "",
        "env": [
            {
                "name": "Raster",
                "value": "5",
                "type": "num"
            },
            {
                "name": "Einheit",
                "value": "min",
                "type": "str"
            }
        ],
        "x": 890,
        "y": 4060,
        "wires": [
            [],
            [
                "6f609891e777d8b0"
            ]
        ]
    },
    {
        "id": "6540322dced5c93f",
        "type": "ui_audio",
        "z": "dfdb2036.ae7008",
        "name": "",
        "group": "1b2f8d0aa186085d",
        "voice": "Microsoft Katja - German (Germany)",
        "always": true,
        "x": 1340,
        "y": 4100,
        "wires": []
    },
    {
        "id": "6f609891e777d8b0",
        "type": "change",
        "z": "dfdb2036.ae7008",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "Fenster bitte schließen!",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1150,
        "y": 4100,
        "wires": [
            [
                "6540322dced5c93f"
            ]
        ]
    },
    {
        "id": "b873d656505f0f6a",
        "type": "change",
        "z": "dfdb2036.ae7008",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "StText",
                "pt": "msg",
                "to": "$fromMillis(Start, '[M01]/[D01]/[Y0001] [H01]:[m01]')\t",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1150,
        "y": 4000,
        "wires": [
            [
                "b3d1d36dd03e2f76"
            ]
        ]
    },
    {
        "id": "1b2f8d0aa186085d",
        "type": "ui_group",
        "name": "Ausgabe",
        "tab": "db8b9453.95a468",
        "order": 3,
        "disp": true,
        "width": "14",
        "collapse": true,
        "className": ""
    },
    {
        "id": "db8b9453.95a468",
        "type": "ui_tab",
        "name": "Test",
        "icon": "dashboard",
        "order": 1,
        "disabled": false,
        "hidden": false
    }
]
Screenshot 2023-02-07 151839.jpg

Antworten

Zurück zu „RedMatic“