Variablenzustand über ein Intervall überwachen

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

Moderator: Co-Administratoren

Andii
Beiträge: 70
Registriert: 07.02.2019, 10:08
Wohnort: Willich
Danksagung erhalten: 3 Mal

Variablenzustand über ein Intervall überwachen

Beitrag von Andii » 03.03.2019, 19:40

Guten Abend,

ich möchte, dass in Redmatic bestimmte Aktivitäten ausgelöst werden, wenn die Abwesenheitsvariable seit einer bestimmten Zeit unverändert auf "abwesend" steht.

Folgenden (sehr holprigren) Workaround habe ich gebastelt:
anwesend.PNG
anwesend.PNG (14.81 KiB) 2937 mal betrachtet
Das Problem dabei ist, dass der Flow bereits dann durchläuft, wenn die Variable jetzt und genau vor 11 Minuten auf "abwesend" war. Was ist der Zwischenzeit passiert ist, findet bei dieser Lösung keine Beachtung. Ich suche eine Lösung, bei der die Aktionen nur dann ausgelöst werden, wenn die Variable durchgängig auf abwesend stand.

Wahrscheinlich ist die Lösung ganz einfach und mir fehlt einfach noch der Durchblick... :?

ptweety
Beiträge: 522
Registriert: 07.01.2017, 16:48
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 48 Mal
Danksagung erhalten: 66 Mal

Re: Variablenzustand über ein Intervall überwachen

Beitrag von ptweety » 03.03.2019, 20:23

Hi Andii,

was du wahrscheinlich willst, ist genau eine Auslösung bei Abwesenheit (false) nach Zeit x (zum testen hier 11sec), außer es wird durch Anwesenheit (true) unterbrochen:

Bildschirmfoto 2019-03-03 um 20.19.23.png

Code: Alles auswählen

[{"id":"72e8bcbb.cec9bc","type":"inject","z":"26c1324d.aa616e","name":"true","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":170,"y":1720,"wires":[["bcc0d722.e62ea"]]},{"id":"d96d37ee.dd3bc8","type":"inject","z":"26c1324d.aa616e","name":"false","topic":"","payload":"false","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":170,"y":1760,"wires":[["bcc0d722.e62ea"]]},{"id":"988a97ff.8a3b7","type":"debug","z":"26c1324d.aa616e","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":650,"y":1740,"wires":[]},{"id":"e91c781a.fe3798","type":"trigger","z":"26c1324d.aa616e","op1":"","op2":"false","op1type":"nul","op2type":"bool","duration":"11","extend":false,"units":"s","reset":"true","bytopic":"all","name":"","x":490,"y":1740,"wires":[["988a97ff.8a3b7"]]},{"id":"bcc0d722.e62ea","type":"rbe","z":"26c1324d.aa616e","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":330,"y":1740,"wires":[["e91c781a.fe3798"]]}]

hobbyquaker
Beiträge: 3978
Registriert: 12.07.2009, 20:01
Hat sich bedankt: 17 Mal
Danksagung erhalten: 176 Mal
Kontaktdaten:

Re: Variablenzustand über ein Intervall überwachen

Beitrag von hobbyquaker » 03.03.2019, 20:43

Eine weitere Möglichkeit: jede Message enthält neben dem Zeitpunkt der letzten Aktualisierung ("ts") auch den Zeitpunkt der letzten Änderung ("lc"). Wenn man die einfach subtrahiert sieht man seit wann ein Zustand anliegt. In einem Function Node ungefährt so (ungetestet):

Code: Alles auswählen

msg.minuten = (msg.ts - msg.lc) / (60 * 1000);
return msg;
Und dahinter könntest dann mit einem Switch Node die Nachricht je nachdem ob msg.minuten > 11 ist oder nicht auf zwei verschiedene Ausgänge ausgeben.

Andii
Beiträge: 70
Registriert: 07.02.2019, 10:08
Wohnort: Willich
Danksagung erhalten: 3 Mal

Re: Variablenzustand über ein Intervall überwachen

Beitrag von Andii » 03.03.2019, 23:54

ptweety hat geschrieben:
03.03.2019, 20:23
Hi Andii,

was du wahrscheinlich willst, ist genau eine Auslösung bei Abwesenheit (false) nach Zeit x (zum testen hier 11sec), außer es wird durch Anwesenheit (true) unterbrochen:


Bildschirmfoto 2019-03-03 um 20.19.23.png

Code: Alles auswählen

[{"id":"72e8bcbb.cec9bc","type":"inject","z":"26c1324d.aa616e","name":"true","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":170,"y":1720,"wires":[["bcc0d722.e62ea"]]},{"id":"d96d37ee.dd3bc8","type":"inject","z":"26c1324d.aa616e","name":"false","topic":"","payload":"false","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":170,"y":1760,"wires":[["bcc0d722.e62ea"]]},{"id":"988a97ff.8a3b7","type":"debug","z":"26c1324d.aa616e","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":650,"y":1740,"wires":[]},{"id":"e91c781a.fe3798","type":"trigger","z":"26c1324d.aa616e","op1":"","op2":"false","op1type":"nul","op2type":"bool","duration":"11","extend":false,"units":"s","reset":"true","bytopic":"all","name":"","x":490,"y":1740,"wires":[["988a97ff.8a3b7"]]},{"id":"bcc0d722.e62ea","type":"rbe","z":"26c1324d.aa616e","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":330,"y":1740,"wires":[["e91c781a.fe3798"]]}]
Vielen Dank, das funktioniert gut. Ich muss nur vor dem RBE-Node true/false noch invertieren. Der Trigger soll ja aktiviert werden, wenn vorne ein "false" injected wird.

@hobbyquaker: Mit deinem Vorschlag bin ich nicht weitergekommen. ts und lc sind innerhalb jeder Message identisch, auch wenn der Payload sich gegenüber der vorangegangenen Message nicht verändert hat. Woran kann das liegen?

hobbyquaker
Beiträge: 3978
Registriert: 12.07.2009, 20:01
Hat sich bedankt: 17 Mal
Danksagung erhalten: 176 Mal
Kontaktdaten:

Re: Variablenzustand über ein Intervall überwachen

Beitrag von hobbyquaker » 04.03.2019, 00:08

Andii hat geschrieben:
03.03.2019, 23:54
@hobbyquaker: Mit deinem Vorschlag bin ich nicht weitergekommen. ts und lc sind innerhalb jeder Message identisch, auch wenn der Payload sich gegenüber der vorangegangenen Message nicht verändert hat. Woran kann das liegen?
Oh, das ist dann ein Bug den ich fixen muss. lc "sollte" sich nur dann ändern wenn sich auch der payload geändert hat.

hobbyquaker
Beiträge: 3978
Registriert: 12.07.2009, 20:01
Hat sich bedankt: 17 Mal
Danksagung erhalten: 176 Mal
Kontaktdaten:

Re: Variablenzustand über ein Intervall überwachen

Beitrag von hobbyquaker » 04.03.2019, 18:48

In node-red-contrib-ccu@1.16.4 sollte das `lc` Attribut nun funktionieren. Allerdings gibt es noch eine Sache die man beachten muss. Wird der Node neugestartet (nach Node-RED Neustart oder Deploy) und hat man kein persistenten Storage im CCU-Connection Node konfiguriert existiert das Attribut noch nicht da der letzte Change dann unbekannt ist, das muss man also noch abfangen in dem function Node, z.B. so:

Code: Alles auswählen

msg.minuten = (msg.ts - (msg.lc || 0)) / (60 * 1000);
return msg; 
Bis es ein neues RedMatic Release gibt kannst Du node-red-contrib-ccu auch vorab über den Palette Manager updaten (Node-RED Neustart danach nötig).

Andii
Beiträge: 70
Registriert: 07.02.2019, 10:08
Wohnort: Willich
Danksagung erhalten: 3 Mal

Re: Variablenzustand über ein Intervall überwachen

Beitrag von Andii » 04.03.2019, 19:48

Danke! Ich habe jetzt allerdings erstmal die Lösung von ptweety implementiert. Da habe ich als Node-Red-N00b gleich noch was über den RBE- und den Trigger-Node gelernt :D

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

Re: Variablenzustand über ein Intervall überwachen

Beitrag von Shawn26 » 04.02.2023, 20:19

Hallo,

ich komme irgendwie mit den Erklärungen nicht klar.

Ich füge das "rbe" und "trigger" Node ein und es funktioniert nicht (hier nicht verbunden nur um anzuzeigen was ich will - sie waren bei den Versuchen genau da eingebunden wo der Pfeil es anzeigt). Allerdings ist mir aktuell auch
noch nicht klar was ich bei dem rbe-node bzw. trigger-node ggfs. noch eintragen muss.

Mein Wunsch ist es das, sobald die Abwesenheitsvariable für mindestens 5 Minuten auf "false" steht, das dann der weitere Flow "abgearbeitet" wird.
Sollte innerhalb von 5 Minuten die Abwesenheitsvariable wieder auf "true" stehen dann passiert nichts.
Wenn die Abwesenheitsvariable sich wieder auf "true" ändert sollen keine 5 Minuten abgewartet werden.

Sage schon einmal Danke für jede Unterstützung.

Shawn26
Dateianhänge
Trigger.jpg
Trigger Node
RBE.jpg
RBE Node
Flow.jpg
Der Flow

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

Re: Variablenzustand über ein Intervall überwachen

Beitrag von Henke » 05.02.2023, 06:51

KISS, keep it simple

Zum Testen habe ich die Dauer auf 10 sec gesetzt. Die Anpassung kriegst du hin.

Code: Alles auswählen

[
    {
        "id": "344f11e5506b2f49",
        "type": "trigger",
        "z": "dfdb2036.ae7008",
        "name": "",
        "op1": "",
        "op2": "",
        "op1type": "nul",
        "op2type": "payl",
        "duration": "10",
        "extend": false,
        "overrideDelay": false,
        "units": "s",
        "reset": "true",
        "bytopic": "all",
        "topic": "channel",
        "outputs": 1,
        "x": 1530,
        "y": 4200,
        "wires": [
            [
                "ef1c78518583094e"
            ]
        ]
    },
    {
        "id": "10cd093ecfa8200b",
        "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": 4180,
        "wires": [
            [
                "344f11e5506b2f49"
            ]
        ]
    },
    {
        "id": "e1f50cfa6fda79f5",
        "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": 4240,
        "wires": [
            [
                "344f11e5506b2f49"
            ]
        ]
    },
    {
        "id": "ef1c78518583094e",
        "type": "debug",
        "z": "dfdb2036.ae7008",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "counter",
        "x": 1685,
        "y": 4200,
        "wires": [],
        "l": false
    }
]

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

Re: Variablenzustand über ein Intervall überwachen

Beitrag von Shawn26 » 05.02.2023, 09:15

Aber das ist genau die Frage.

Den Code hatte ich in den anderen Beiträgen auch gesehen, aber wo füge ich ihn ein? In der rbe-node oder in einen function.code oder in den trigger-node?

Da blicke ich noch nicht durch?!

Weiterhin vielen Dank.

Shawn26

Antworten

Zurück zu „RedMatic“