Zustand einer Systemvariablen zeitlich erfassen

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

AF-Mobil
Beiträge: 322
Registriert: 25.11.2016, 19:52
Hat sich bedankt: 4 Mal
Danksagung erhalten: 20 Mal

Zustand einer Systemvariablen zeitlich erfassen

Beitrag von AF-Mobil » 07.03.2023, 06:56

Hallo in die Runde!
Vornweg eine kurze Beschreibung der Situation:
Über ein HmIP-PCBS-BAT in einer DV mit einer virtuellen Taste gebe ich einen Impuls an ein externes Gerät (das mir auch keine Rückgabe über seinen Zustand liefert) womit dieses ein- und ausgeschaltet wird. Zur "Abschätzung" des zu erwartenen Zustandes lasse ich eine SV jeweils den Zustand wechseln. Zwar keine perfekte Lösung - funktioniert jedoch seit geraumer Zeit sehr zuverlässig.
Nun zur Frage:
Gibt es über CUxD die Möglichkeit, vergleichbar dem Universal Wrapper Device auf einen Gerätekanal, mit dem ich die Verweildauer einer SV in einem bestimmten Zustand erfassen kann?
Leider konnte ich dazu weder im Forum noch in der CUxD-Dokumentation etwas finden. Möglicherweise weil das gar nicht geht.
Im voraus Dank für alle Hinweise, AF


AF-Mobil
Beiträge: 322
Registriert: 25.11.2016, 19:52
Hat sich bedankt: 4 Mal
Danksagung erhalten: 20 Mal

Re: Zustand einer Systemvariablen zeitlich erfassen

Beitrag von AF-Mobil » 08.03.2023, 15:44

Hallo noch mal und bitte Nachsicht haben, falls ich das missverstanden habe oder etwas träge beim verstehen bin. Das State-Monitor-Device benutze ich schon mehrfach als Betriebsstundenzähler auf Aktorkanäle. Hier möchte ich jedoch die Zeit zwischen zwei Impulsen (jeweils ca. 1Sek. lang) messen. Nachdem ich nun ordentlich experiementiert habe, brauch ich doch noch einmal einen Hinweis, mit welchen Einstellungen die Zeit zwischen den Schaltimpulsen eines Kanals mit dem State-Monitor oder wie ich die Zeit zwischen den Zustandsänderungen der SV damit erfassen kann?
Gruss AF

MichaelN
Beiträge: 9656
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1617 Mal

Re: Zustand einer Systemvariablen zeitlich erfassen

Beitrag von MichaelN » 08.03.2023, 16:36

Vielleicht etwas mehr Input geben. Was willst Du mit der Zeit machen, wenn nicht als Betriebsstunden zählen?
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

AF-Mobil
Beiträge: 322
Registriert: 25.11.2016, 19:52
Hat sich bedankt: 4 Mal
Danksagung erhalten: 20 Mal

Re: Zustand einer Systemvariablen zeitlich erfassen

Beitrag von AF-Mobil » 08.03.2023, 17:50

Ich will schon die Betriebsstunden ermitteln, aber nicht die des impulsgebenen Kanals, sondern die des damit ein- und ausgeschalteten externen Nicht-Homematic-Gerätes für den ich einen Tastendruck (potentialfreier Kontakt eines Relais) am Gerät simuliere. Erster Druck/Impuls = Gerät an zweiter Druck/Impuls = Gerät aus. Und die Zeit zwischen Ein- und Ausimpuls ist die Betriebsdauer die ich erfassen will. Für die CCU lasse ich eben die Variable umswitchen. Deshalb war mein ursprünglicher Gedanke die Verweildauer der SV auszuwerten.
Ich hoffe, es ist ausreichend beschrieben, AF

Benutzeravatar
Baxxy
Beiträge: 10789
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 604 Mal
Danksagung erhalten: 2208 Mal

Re: Zustand einer Systemvariablen zeitlich erfassen

Beitrag von Baxxy » 08.03.2023, 18:34

Wenn du schon eine SysVar hast die den Status des Gerätes repräsentiert, dann kannst du doch mit einem weiteren Programm auf die SysVar reagieren und damit das State-Monitor-Device per Script EIN/AUSschalten.

Code: Alles auswählen

WENN
SysVar = true bei Änderung
DANN
Script
channels.Get ("CUxD-State-Device:1").DPByHssDP ("SET_STATE").State(1);

Sonst, wenn...
SysVar = false bei Änderung
DANN
Script
channels.Get ("CUxD-State-Device:1").DPByHssDP ("SET_STATE").State(0);
Damit "schaltet" sich das CUxD Gerät genauso EIN/AUS als wäre es mit einem realen Aktor verbunden.

AF-Mobil
Beiträge: 322
Registriert: 25.11.2016, 19:52
Hat sich bedankt: 4 Mal
Danksagung erhalten: 20 Mal

Re: Zustand einer Systemvariablen zeitlich erfassen

Beitrag von AF-Mobil » 09.03.2023, 06:26

Funktioniert, Danke.

Digihotte
Beiträge: 40
Registriert: 23.01.2022, 07:53
System: CCU
Wohnort: Hua Hin / Thailand
Hat sich bedankt: 10 Mal
Danksagung erhalten: 5 Mal

Re: Zustand einer Systemvariablen zeitlich erfassen

Beitrag von Digihotte » 08.04.2023, 08:51

Hallo zusammen,
ich hänge mich mal hier rein, weil ich ein ähnliches Problem habe:
Es geht um die Reinigung des Filter von AirCondition's
Alle Betriebszustände der AC's frage ich über Sensibo API in Node Red ab.
Nur mit dem Filterstatus bzw. dem Reinigungsstatus habe ich ein Problem, weil ich die Bezeichnung (Aufruf) des Datenpunktes nicht finden kann.
Hier mal ein Beispiel für den Funktions Node zur Abfrage der Soll-Temperatur (targetTemperature) :

var AC_Soll_Temp = msg.result.acState.targetTemperature;
msg.payload ={"svalue":AC_Soll_Temp};
return msg;

Weil ich da einfach nicht weiterkomme, hatte ich die Idee über die zu erfassende Betriebszeit der AC eine endsprechende Funktionalität nachzubauen. Eine SYSvar für den Status Läuft/Läuft nicht habe ich.
Was mir fehlt ist: Ein Timer den man anhalten kann (bei läuft nicht) und weiterlaufen lassen kann bei (Läuft).
Er soll ein Event entweder bei 0, wenn er als Countdown definiert ist, oder bei Erreichen eine bestimmten Laufzeit auslösen.
Uwe schreibt über einen "CUxD Gerät (90) Universal Wrapper Device - State Monitor" - wie wird der verwendet?
Und noch etwas: die einstellbare Zeitspanne kann bis zu 2000 Stunden betragen.

Könnt ihr mir bitte auf die "Sprünge" helfen? Entweder bei Node RED oder mit den Betriebszeiten?
Vielen Dank.

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

Re: Zustand einer Systemvariablen zeitlich erfassen

Beitrag von Henke » 08.04.2023, 09:12

Screenshot 2023-04-08 091018.jpg

Code: Alles auswählen

[
    {
        "id": "9c1fb25108b10ee8",
        "type": "subflow",
        "name": "Laufzeit",
        "info": "",
        "category": "",
        "in": [
            {
                "x": 60,
                "y": 140,
                "wires": [
                    {
                        "id": "a7d228d235100b22"
                    }
                ]
            }
        ],
        "out": [
            {
                "x": 760,
                "y": 40,
                "wires": [
                    {
                        "id": "62bf429dced2f2cf",
                        "port": 0
                    }
                ]
            },
            {
                "x": 760,
                "y": 200,
                "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": 760,
            "y": 260,
            "wires": [
                {
                    "id": "62bf429dced2f2cf",
                    "port": 2
                }
            ]
        }
    },
    {
        "id": "62bf429dced2f2cf",
        "type": "unsafe-function",
        "z": "9c1fb25108b10ee8",
        "name": "Laufzeit",
        "func": "const Input = msg._input;\nconst Pay = msg.payload;\n\nconst fName = \"Laufzeit\";\nlet start = flow.get(fName);\n\nif (Input) {\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        start.on = false;\n        flow.set(fName, start);\n    }\n    msg._input = false;\n}\n\nconst Raster = Number(env.get(\"Raster\") || 1);\nconst 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 StatusMsg = {};\nStatusMsg.payload = { fill: \"blue\", shape: \"ring\", text: msg.payload + \" \" + Einheit };\nif (Input && !Pay)\n    return [null, msg, StatusMsg];\nreturn [msg, null, StatusMsg];",
        "outputs": 3,
        "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": "a7d228d235100b22",
        "type": "unsafe-function",
        "z": "9c1fb25108b10ee8",
        "name": "check",
        "func": "let newMsg = {};\nnewMsg._input = true;\nnewMsg.payload = msg.payload;\nnewMsg.ts = msg.ts;\nmsg = {};\n\nif (typeof newMsg.ts == 'number')\n    return newMsg;\nreturn [null,newMsg];\n",
        "outputs": 2,
        "noerr": 0,
        "x": 150,
        "y": 140,
        "wires": [
            [
                "62bf429dced2f2cf"
            ],
            [
                "573f5ef88a6fd91c",
                "519e5d85c5f7a5a5"
            ]
        ]
    },
    {
        "id": "82aa16687266ed21",
        "type": "inject",
        "z": "9c1fb25108b10ee8",
        "name": "Start",
        "props": [],
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "topic": "",
        "x": 170,
        "y": 40,
        "wires": [
            [
                "21e1abdc23a87aae"
            ]
        ]
    },
    {
        "id": "21e1abdc23a87aae",
        "type": "unsafe-function",
        "z": "9c1fb25108b10ee8",
        "name": "set flow",
        "func": "let fName = \"Laufzeit\";\nlet off = { ts: 0, on: false };\nflow.set(fName, off);\n",
        "outputs": 2,
        "noerr": 0,
        "x": 420,
        "y": 40,
        "wires": [
            [
                "519e5d85c5f7a5a5"
            ],
            []
        ]
    },
    {
        "id": "18cb7fbe21ca9781",
        "type": "inject",
        "z": "427fc89b.e34038",
        "name": "",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "true",
        "payloadType": "bool",
        "x": 570,
        "y": 2280,
        "wires": [
            [
                "ba609f51a12295ad"
            ]
        ]
    },
    {
        "id": "055d00a603ea3522",
        "type": "inject",
        "z": "427fc89b.e34038",
        "name": "",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "false",
        "payloadType": "bool",
        "x": 570,
        "y": 2340,
        "wires": [
            [
                "ba609f51a12295ad"
            ]
        ]
    },
    {
        "id": "ba609f51a12295ad",
        "type": "subflow:9c1fb25108b10ee8",
        "z": "427fc89b.e34038",
        "name": "",
        "x": 740,
        "y": 2300,
        "wires": [
            [
                "d5ce232805a47cc2"
            ],
            [
                "3c8f8de0caab841f"
            ]
        ]
    },
    {
        "id": "d5ce232805a47cc2",
        "type": "debug",
        "z": "427fc89b.e34038",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "payload",
        "statusType": "msg",
        "x": 885,
        "y": 2260,
        "wires": [],
        "l": false
    },
    {
        "id": "b66931c2726ba872",
        "type": "debug",
        "z": "427fc89b.e34038",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "payload",
        "statusType": "msg",
        "x": 1105,
        "y": 2380,
        "wires": [],
        "l": false
    },
    {
        "id": "3c8f8de0caab841f",
        "type": "function",
        "z": "427fc89b.e34038",
        "name": "Summe, Check",
        "func": "const MaxSumInSec = 2 * 60; // Test 2 Minuten\nconst Name = \"LaufZeitSumme\";\n\nif ( msg.reset )\n{\n    flow.set(Name, 0, \"file\");    \n    return;\n}\n\nlet summe = flow.get(Name, \"file\") || 0;\nsumme += msg.runMili;\nflow.set(Name, summe, \"file\");\n\nmsg.summe = summe;\nmsg.Ueberlauf = (summe >= MaxSumInSec *1000);\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 960,
        "y": 2320,
        "wires": [
            [
                "ea997dc36cc1d95e",
                "b66931c2726ba872"
            ]
        ]
    },
    {
        "id": "ea997dc36cc1d95e",
        "type": "switch",
        "z": "427fc89b.e34038",
        "name": "",
        "property": "Ueberlauf",
        "propertyType": "msg",
        "rules": [
            {
                "t": "true"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 1130,
        "y": 2320,
        "wires": [
            [
                "886ad2a95b607721"
            ]
        ]
    },
    {
        "id": "886ad2a95b607721",
        "type": "debug",
        "z": "427fc89b.e34038",
        "name": "Filter wechseln",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 1225,
        "y": 2320,
        "wires": [],
        "l": false
    },
    {
        "id": "b9031f33a82c6c17",
        "type": "inject",
        "z": "427fc89b.e34038",
        "name": "",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "true",
        "payloadType": "bool",
        "x": 570,
        "y": 2420,
        "wires": [
            [
                "b8efd26c5fc5e64c"
            ]
        ]
    },
    {
        "id": "b8efd26c5fc5e64c",
        "type": "change",
        "z": "427fc89b.e34038",
        "name": "Reset",
        "rules": [
            {
                "t": "set",
                "p": "reset",
                "pt": "msg",
                "to": "true",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 730,
        "y": 2360,
        "wires": [
            [
                "3c8f8de0caab841f"
            ]
        ]
    }
]
Bei Summe/Check den Wert anpassen. Zum Testen habe ich den auf 2 Minuten gesetzt.
Mit Reset wird wird die Summe wieder auf 0 gesetzt. Z.b. bei Filter wurde gewechselt.

Edit: Summe auf File Kontext geändert. Bei 2000h sollte ein Reboot die Variable speichern.

Digihotte
Beiträge: 40
Registriert: 23.01.2022, 07:53
System: CCU
Wohnort: Hua Hin / Thailand
Hat sich bedankt: 10 Mal
Danksagung erhalten: 5 Mal

Re: Zustand einer Systemvariablen zeitlich erfassen

Beitrag von Digihotte » 09.04.2023, 08:57

Hallo Henke
Vielen Dank für deine Hilfe. Den Flow verstehe ich - von der Funktionalität. Leider bin ich aber noch nicht auf dem Level um den Code und seine Verwendung zu verstehen. Wenn du Lust und Zeit hast würde ich mich sehr über ein paar erklärende Angaben freuen. Für mich sieht es so aus als wären es debag-Meldungen zu den Nodes - aber wie gesagt - noch zu wenig Kenntnisse aber begierig es zu verstehen.
Schon mal herzlichen Dank für deine Bemühungen.

Antworten

Zurück zu „HomeMatic allgemein“