Zustand einer Systemvariablen zeitlich erfassen
Moderator: Co-Administratoren
-
- Beiträge: 322
- Registriert: 25.11.2016, 19:52
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 20 Mal
Zustand einer Systemvariablen zeitlich erfassen
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
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
- Baxxy
- Beiträge: 10847
- Registriert: 18.12.2018, 15:45
- System: Alternative CCU (auf Basis OCCU)
- Hat sich bedankt: 610 Mal
- Danksagung erhalten: 2229 Mal
Re: Zustand einer Systemvariablen zeitlich erfassen
Du kannst doch das CUxD State-Monitor Device parallel zu deiner SysVar per Scriptchen EIN/AUSschalten.
Grüße... Baxxy
- Raspberry Pi 4 als Homematic-Zentrale - Tipps und Informationen
- Analysescript für genutzte Funk-Adressen, Funkmodul-Hardware und Zentralen Hardware
- NANO CUL 868MHz - Stick zum AskSin Analyzer XS umflashen (Anleitung für ArduinoIDE unter Windows)
- Firmware Updates für IP-Aktoren / Sensoren... Info's, Tipps und Sonstiges
- CCU funkt nicht - CarrierSense (CS) Probleme erkennen und lösen
-
- Beiträge: 322
- Registriert: 25.11.2016, 19:52
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 20 Mal
Re: Zustand einer Systemvariablen zeitlich erfassen
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
Gruss AF
-
- Beiträge: 9684
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 700 Mal
- Danksagung erhalten: 1627 Mal
Re: Zustand einer Systemvariablen zeitlich erfassen
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 +++
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 +++
-
- Beiträge: 322
- Registriert: 25.11.2016, 19:52
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 20 Mal
Re: Zustand einer Systemvariablen zeitlich erfassen
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
Ich hoffe, es ist ausreichend beschrieben, AF
- Baxxy
- Beiträge: 10847
- Registriert: 18.12.2018, 15:45
- System: Alternative CCU (auf Basis OCCU)
- Hat sich bedankt: 610 Mal
- Danksagung erhalten: 2229 Mal
Re: Zustand einer Systemvariablen zeitlich erfassen
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.
Damit "schaltet" sich das CUxD Gerät genauso EIN/AUS als wäre es mit einem realen Aktor verbunden.
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);
Grüße... Baxxy
- Raspberry Pi 4 als Homematic-Zentrale - Tipps und Informationen
- Analysescript für genutzte Funk-Adressen, Funkmodul-Hardware und Zentralen Hardware
- NANO CUL 868MHz - Stick zum AskSin Analyzer XS umflashen (Anleitung für ArduinoIDE unter Windows)
- Firmware Updates für IP-Aktoren / Sensoren... Info's, Tipps und Sonstiges
- CCU funkt nicht - CarrierSense (CS) Probleme erkennen und lösen
-
- 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
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.
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.
- Henke
- Beiträge: 1526
- Registriert: 27.06.2022, 20:51
- System: CCU
- Hat sich bedankt: 141 Mal
- Danksagung erhalten: 306 Mal
Re: Zustand einer Systemvariablen zeitlich erfassen
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"
]
]
}
]
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.
-
- 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
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.
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.