[gelöst] ReadingAge funktioniert nicht

Begonnen von matze1999, 01 Oktober 2022, 09:41:49

Vorheriges Thema - Nächstes Thema

matze1999

Hallo, ich möchte an einem Fenstersensor mittels Readingsage auswerten, wie lange er offen ist, und nach einer bestimmten Zeit eine Aktion auslösen:

defmod SchlafzimmerAlarm.di DOIF $MyoffenAge=ReadingsAge(HUESensor45,state,0)\
([$MyoffenAge] > 10 and [?Heizperiode] eq "Ja" and ([?HUESensor50] eg "offen" )) (\
set Lampe on)
attr SchlafzimmerAlarm.di repeatcmd 300
attr SchlafzimmerAlarm.di repeatsame 3


funktioniert aber nicht.

kann mir bitte jemand auf die Sprünge helfenß

matze1999

Gisbert

Hallo matze1999,

du kannst doch gleich so abfragen:
ReadingsAge('HUESensor45','state','0') > 10
Es fehlen außerdem einfache oder doppelte Gänsefüßchen.

Es fehlt (wahrscheinlich) das Attribut do always.

Damit der Zweig eintritt, ist es nötig, dass state ein Event erzeugt. Dies kannst du im Event-Monitor verfolgen. Kein Event = keine Ausführung des DOIFs.

Zu guter Letzt, was heißt funktioniert nicht? Was steht im DOIF+Device, was steht im log?

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

matze1999

#2
Hallo,

defmod SchlafzimmerAlarm.di DOIF ([HUESensor45] eq "open" and [ReadingsAge('HUESensor45','state','0')] > 10 and [?Heizperiode] eq "Ja" and ([?HUESensor45:state] eq "open" or [?HUESensor50:state] eq "open")) (\
set MQTT2_DVES_486458 blink 3 3)


ergibt:

timer_01_c01

error: Wrong timespec ReadingsAge('HUESensor45','state',0): either HH:MM:SS or {perlcode}


EDIT, kann auch nicht funktioneiren, weil bei Eintritt der Bedingung [HUESensor45] eq "open" das ReadingsAge immer < 10 ist

Lösung für mich:

ein notify, was einen dummy on-for-timer einschaltet, wenn dieser dummy dann "off" geht, wird mit einem doif geprüft, ob das Fenster nach der Zeit immer noch auf ist und wenn ja, wird eine Meldung abgegeben.

Das bedeutet, für eine Meldung, dass ein Fenster nach 15 Min immer noch auf ist, benötige ich z.Zt.:

einen Dummy der durch ein notify vom Fenstersensor getriggert wird und dann mit on-for-timer die 15 Min überbrückt
wenn dieser dummy dann nach 15 Min off geht gibt es ein  DOIF, was auswertet, ob das Fenster immer noch offen ist, und dann eine Meldung abgibt.

Ich benötige für dieses also

ein notify
ein Dummy Device
ein DOIF

matze

betateilchen

#3
Zitat von: matze1999 am 01 Oktober 2022, 13:44:51
ein notify
ein Dummy Device
ein DOIF

Ich behaupte, die Aufgabe würde sich auch mit einem einzigen notify umsetzen lassen...

Wenn man ein notify braucht, damit ein DOIF funktioniert, hat man das Problem nicht weit genug abstrahiert, um das möglichst einfach in FHEM umzusetzen.
Und dummy-devices halte ich ja ohnehin für komplett entbehrlich - genau wie Fußpilz.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#4
Zitat von: matze1999 am 01 Oktober 2022, 09:41:49
Hallo, ich möchte an einem Fenstersensor mittels Readingsage auswerten, wie lange er offen ist, und nach einer bestimmten Zeit eine Aktion auslösen:

Alternativer Ansatz: Schonmal über die Verwendung eines watchdog devices nachgedacht?

ZitatStart an arbitrary FHEM command if after <timespec> receiving an event matching <regexp1> no event matching <regexp2> is received.

Also wenn nach dem Öffnen eines Fensters nicht innerhalb einer vorgegebenen Zeit das Schließen kommt (nach einer bestimmten Zeit eine Aktion...),
ist das Fenster immer noch offen. Und dann soll der watchdog irgendwas tun. (Aktion auslösen)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

matze1999

Hallo,

das stimmt natürlich:

defmod SchlafzimmerAlarm.di DOIF ([?Heizperiode] eq "Ja" and ([HUESensor45:state] eq "open" or [HUESensor50:state] eq "open")) (\
set MQTT2_DVES_486458 blink 1 1)
attr SchlafzimmerAlarm.di repeatcmd 10
attr SchlafzimmerAlarm.di repeatsame 3
attr SchlafzimmerAlarm.di wait 10



matze

Gisbert

Hallo matze,

das Alter eines Readings kann man laut commandref auch in einem DOIF so abfragen:
Zitat
Zeitspanne eines Readings seit der letzten Änderung

Bei Readingangaben kann die Zeitspanne mit [<Device>:<Reading>:sec] in Sekunden seit der letzten Änderung bestimmt werden.

Anwendungsbeispiel: Überwachung eines Temperatursensors

define di_monitor DOIF ([+01:00] and [?sensor:temperature:sec]>3600)(set pushbullet message sensor failed)
attr di_monitor do always

Wenn der Temperatursensor seit über einer Stunde keinen Temperaturwert geliefert hat, dann soll eine Nachricht erfolgen.

Die eckige Klammer um das ReadingsAge() hab ich nicht vorgegeben; vermutlich ist das falsch.

Ansonsten bitte daran denken, dass ein Event vorhanden sein muss - das gilt sowohl für notify als auch DOIF. Wie betateilchen sagte, versuch das ganze in einem Device zu erledigen.

Ein watchdog Device klingt für die Überwachung einer Fensteröffnung plausibel.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

betateilchen

Zitat von: Gisbert am 01 Oktober 2022, 14:27:42
Ein watchdog Device klingt für die Überwachung einer Fensteröffnung plausibel.

Solche Konstrukte habe ich bei mir mehrfach im Einsatz. Zwar nicht, um Fenster zu überwachen, aber zum Beispiel im Bad, um den Lüfter dort nur einzuschalten, wenn das Licht länger als 1 Minute an ist.


defmod wd_bd_Ventilator watchdog bd_Licht_Decke:on 00:01 bd_Licht_Decke:off set bd_Ventilator on-for-timer 3600
attr wd_bd_Ventilator autoRestart 1


Die "Zusatzbedingungen" wie beisipelsweise "Heizperiode?" würde man dann einfach im Ausführungsteil abfragen.

Und wenn man mehrere Sensoren hat (wie hier im Thread), packt man diese in eine structure und setzt den watchdog zur Überwachung der structure ein.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

matze1999

#8
Hallo,

ok, ok, aber mir reicht mein doif  mit attr wait, wenn jetzt noch die Meldungswiederholung (repeatcmd/-same) aufhören würde, wenn die Bedingung nicht mehr erfüllt ist, das wäre super. Das sollte doch eigentlich (lt. WIKI) so sein?

Edit

Das funktioniert natürlich mit einem extra DOELSE:

defmod SchlafzimmerAlarm.di DOIF ([?Heizperiode] eq "Ja" and ([HUESensor45:state] eq "open" or [HUESensor50:state] eq "open")) (\
set MQTT2_DVES_486458 blink 1 1)\
DOELSE
attr SchlafzimmerAlarm.di do always
attr SchlafzimmerAlarm.di repeatcmd 10
attr SchlafzimmerAlarm.di repeatsame 3
attr SchlafzimmerAlarm.di wait 10


matze

betateilchen

ok, Du WILLST es also kompliziert haben.

Nagut, dafür ist mir mein Popcorn zu schade.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

matze1999

#10
ich finde das nicht sehr kompliziert, nur noch ein DOIF mit dem ich das jetzt realisiere, Fenster auf, wenn nach 15 Min das Fenster immer noch auf ist, gibt es eine Meldung, die 3 mal wiederholt wird, oder das Fenster wird vorher zu gemacht:

defmod SchlafzimmerAlarm.di DOIF ([?Heizperiode] eq "Ja" and ([HUESensor45:state] eq "open" or [HUESensor50:state] eq "open")) (\
set MQTT2_DVES_486458 blink 1 1)\
DOELSE
attr SchlafzimmerAlarm.di do always
attr SchlafzimmerAlarm.di repeatcmd 10
attr SchlafzimmerAlarm.di repeatsame 3
attr SchlafzimmerAlarm.di wait 900


matze