FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: matze1999 am 01 Oktober 2022, 09:41:49

Titel: [gelöst] ReadingAge funktioniert nicht
Beitrag 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:

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
Titel: Antw:ReadingAge funktioniert nicht
Beitrag von: Gisbert am 01 Oktober 2022, 13:07:47
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
Titel: Antw:ReadingAge funktioniert nicht
Beitrag von: matze1999 am 01 Oktober 2022, 13:44:51
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
Titel: Antw:ReadingAge funktioniert nicht
Beitrag von: betateilchen am 01 Oktober 2022, 13:58:04
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.
Titel: Antw:[gelöst mit notify, dummy und doif] ReadingAge funktioniert nicht
Beitrag von: betateilchen am 01 Oktober 2022, 14:14:52
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)
Titel: Antw:[gelöst mit notify, dummy und doif] ReadingAge funktioniert nicht
Beitrag von: matze1999 am 01 Oktober 2022, 14:20:12
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
Titel: Antw:[gelöst mit notify, dummy und doif] ReadingAge funktioniert nicht
Beitrag von: Gisbert am 01 Oktober 2022, 14:27:42
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
Titel: Antw:[gelöst mit notify, dummy und doif] ReadingAge funktioniert nicht
Beitrag von: betateilchen am 01 Oktober 2022, 14:32:43
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.

Titel: Antw:[gelöst mit notify, dummy und doif] ReadingAge funktioniert nicht
Beitrag von: matze1999 am 01 Oktober 2022, 14:56:36
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
Titel: Antw:[gelöst] ReadingAge funktioniert nicht
Beitrag von: betateilchen am 01 Oktober 2022, 15:04:02
ok, Du WILLST es also kompliziert haben.

Nagut, dafür ist mir mein Popcorn zu schade.
Titel: Antw:[gelöst] ReadingAge funktioniert nicht
Beitrag von: matze1999 am 01 Oktober 2022, 15:05:13
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