Hallo zusammen,
ich dachte ich bastel mal wieder etwas rum und baue mir ein DOIF welches auf die beiden "Bewohner" Simone und Jan auslöst. Soll heißen: Nachricht per Telegramm wenn einer daheim ist, wenn beide daheim sind und wenn keiner mehr zu Hause ist.
Die Anwesenheit läuft über presence und wird mittels der Anfrage der MAC's auf der Fritzbox ermittelt (eigene sub in der myutils).
Für die gemeinsame Anwesenheit habe ich mir eine Structure angelegt:
Internals:
ATTR presence
CFGFN
CHANGEDCNT 5953
DEF presence Handy_Jan Handy_Simone
NAME Struc_Anwesenheit
NR 31897
NTFY_ORDER 50-Struc_Anwesenheit
STATE present
TYPE structure
READINGS:
2018-11-20 08:45:36 LastDevice Handy_Jan
2018-11-20 08:45:36 LastDevice_Abs Handy_Jan
2018-11-20 08:45:36 state present
Attributes:
clientstate_behavior relative
clientstate_priority attr Anwesenheit clientstate_priority present absent
room zAnwesenheit
Soweit alles gut. Leider wird bei meinem Handy (Jan) relativ schnell auf der Fritzbox ein "inactive" gesetzt. Dieses geht nach ein paar Minuten aber wieder af angemeldet zurück (ein Event mit Sendestärke wird ausgelöst). Somit darf ein "Jan ist nicht mehr daheim" nur verzögert ausgelöst werden.
Hier nun mein Versuch des DOIF's:
Internals:
CFGFN
DEF ([Struc_Anwesenheit] eq "absent") (set SteuerBot _msg Es ist keiner mehr zu Hause!)
DOELSEIF ([Struc_Anwesenheit] eq "present") (set SteuerBot _msg einer ist daheim!)
DOELSEIF (([Handy_Jan] eq "present") and ([Handy_Simone] eq "absent")) (set SteuerBot _msg Jan ist jetzt daheim!)
DOELSEIF (([Handy_Jan] eq "absent") and ([Handy_Simone] eq "present")) (set SteuerBot _msg Simone ist jetzt daheim!)
MODEL FHEM
NAME di_Anwesenheit
NR 31934
NTFY_ORDER 50-di_Anwesenheit
STATE cmd_2
TYPE DOIF
READINGS:
2018-11-20 08:50:37 Device Handy_Jan
2018-11-19 22:07:16 cmd 2
2018-11-19 22:07:16 cmd_event Struc_Anwesenheit
2018-11-19 22:07:16 cmd_nr 2
2018-11-20 08:50:37 e_Handy_Jan_STATE absent
2018-11-20 08:50:37 e_Struc_Anwesenheit_STATE present
2018-11-19 22:06:40 mode enabled
2018-11-19 22:07:16 state cmd_2
2018-11-20 08:50:37 wait_timer 20.11.2018 09:05:37 cmd_4 Handy_Jan
Regex:
attr:
cmdState:
wait:
0:
0
1:
0
2:
900
3:
900
waitdel:
condition:
0 ::InternalDoIf($hash,'Struc_Anwesenheit','STATE') eq "absent"
1 ::InternalDoIf($hash,'Struc_Anwesenheit','STATE') eq "present"
2 (::InternalDoIf($hash,'Handy_Jan','STATE') eq "present") and (::InternalDoIf($hash,'Handy_Simone','STATE') eq "absent")
3 (::InternalDoIf($hash,'Handy_Jan','STATE') eq "absent") and (::InternalDoIf($hash,'Handy_Simone','STATE') eq "present")
devices:
0 Struc_Anwesenheit
1 Struc_Anwesenheit
2 Handy_Jan Handy_Simone
3 Handy_Jan Handy_Simone
all Struc_Anwesenheit Handy_Jan Handy_Simone
do:
0:
0 set SteuerBot _msg Es ist keiner mehr zu Hause!
1:
0 set SteuerBot _msg einer ist daheim!
2:
0 set SteuerBot _msg Jan ist jetzt daheim!
3:
0 set SteuerBot _msg Simone ist jetzt daheim!
4:
helper:
event absent,presence: absent
globalinit 1
last_timer 0
sleepdevice Handy_Jan
sleepsubtimer 0
sleeptimer 3
timerdev Handy_Jan
timerevent absent,presence: absent
triggerDev Handy_Jan
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: Struc_Anwesenheit
state: cmd_2
timerevents:
absent
presence: absent
timereventsState:
state: absent
presence: absent
triggerEvents:
absent
presence: absent
triggerEventsState:
state: absent
presence: absent
internals:
0 Struc_Anwesenheit:STATE
1 Struc_Anwesenheit:STATE
2 Handy_Jan:STATE Handy_Simone:STATE
3 Handy_Jan:STATE Handy_Simone:STATE
all Struc_Anwesenheit:STATE Handy_Jan:STATE Handy_Simone:STATE
itimer:
readings:
trigger:
uiState:
uiTable:
Attributes:
room zDo_if
wait 0:0:900:900
Ergebnis: ich bekomme alle paar Minuten Nachrichten "Simone ist jetzt daheim" und "beide sind daheim". Ist ja auch klar, mein Handy switched ja immer mal für ein paar Minuten auf " Absent"
Wie kann ich das nun anders lösen? Ich möchte ja nur eine Nachricht, wenn sich der Status für längere Zeit ändert. Ein Wechsel von present auf absent , der sich innerhalb weniger Minuten wieder zurückändert, soll keine Nachrich auslösen.
Ideen? :)
Danke!
Entweder passt Du Dein konstrukt an und benutzt zusätzlich einen watchdog, oder Du veränderst das DOIF so das wiederholtes Triggern der Presence Devices nicht zum auslösen führt...
( event-on-change )
Zitat von: der-Lolo am 20 November 2018, 09:13:40
Entweder passt Du Dein konstrukt an und benutzt zusätzlich einen watchdog, oder Du veränderst das DOIF so das wiederholtes Triggern der Presence Devices nicht zum auslösen führt...
( event-on-change )
Super danke für die fixe Antwort. Ich würde das gerne möglichst mit einem Konstrukt (in diesem Fall DOIF) lösen (falls möglich).
Den Hinweis mit event-on-change verstehe ich nicht. Wie kann ich das nutzen um das wiederholte Triggern zu verhindern? Denn event-on-change-reading .* habe ich schon bei presence gesetzt. Trotzdem switched mein Handy ja alle paar Minuten kurz auf absent, dass lässt sich ja nicht verhindern. Ich möchte halt das mein DOIF nur dann reagiert, wenn es innerhalb von X Sekunden wieder auf den alten wert geht (hatte da mal mit wait experimentiert).
Gruß
Könnte event-min-interval helfen?
Zitat von: Neuhier am 20 November 2018, 09:47:29
Könnte event-min-interval helfen?
Nein. Damit kann ich ja events erzeugen.
ZitatMit dem Attribut event-min-interval kann für Readings eines Gerätes festgelegt werden, dass nach einer bestimmten Zeit ein Event, auch ohne Wertänderung ausgelöst wird.
PRESENCE hat Attribute mit dem Schwellen fürs Umschalten festgelegt werden können.
Zitat von: Ellert am 20 November 2018, 13:19:14
PRESENCE hat Attribute mit dem Schwellen fürs Umschalten festgelegt werden können.
Danke das hat mir geholfen :)