Servus. Ich habe ein DOIF für eine einfache Alarmanlage. Bisher dachte ich immer, dass es funktioniert aber seitdem ich mal genauer drauf geschaut habe, ist dem wohl nicht so. Internals:
DEF ([Bewohner] ne "home" and ([Taster_BM_Motion:"motion: on"] or [Kellertuer] eq "open")) (set Sonos_Mobil Speak 60 de |Hund| |Polizei| |Sirene| , set Telegram msg ACHTUNG der Alarm wurde ausgelöst)
NAME di_Sleep_Alarm
NR 159
NTFY_ORDER 50-di_Sleep_Alarm
STATE cmd_2
TYPE DOIF
Readings:
2017-04-26 18:09:31 Device Taster_BM_Motion
2017-04-25 17:21:42 cmd 2
2017-04-25 17:21:42 cmd_event Taster_BM_Motion
2017-04-25 17:21:42 cmd_nr 2
2017-04-26 18:09:31 e_Taster_BM_Motion_events motion: off,noMotion
2017-04-25 17:21:42 state cmd_2
2017-04-26 18:08:56 wait_timer no timer
Condition:
0 InternalDoIf($hash,'Bewohner','STATE') ne "home" and (EventDoIf('Taster_BM_Motion',$hash,'motion: on',1) or InternalDoIf($hash,'Kellertuer','STATE') eq "open")
Devices:
0 Bewohner Taster_BM_Motion Kellertuer
all Bewohner Taster_BM_Motion Kellertuer
Do:
0:
0 set Sonos_Mobil Speak 60 de |Hund| |Polizei| |Sirene| , set Telegram msg ACHTUNG der Alarm wurde ausgelöst
1:
Helper:
event motion: off,noMotion
globalinit 1
last_timer 0
sleeptimer -1
timerdev Taster_BM_Motion
timerevent motion: off,noMotion
triggerDev Taster_BM_Motion
timerevents:
motion: off
noMotion
timereventsState:
motion: off
state: noMotion
triggerEvents:
motion: off
noMotion
triggerEventsState:
motion: off
state: noMotion
Internals:
0 Bewohner:STATE Kellertuer:STATE
all Bewohner:STATE Kellertuer:STATE
Itimer:
Readings:
Regexp:
0:
All:
State:
State:
Trigger:
all Taster_BM_Motion
Attributes:
wait 14
Also die Probleme sind wie folgt. Durch die Handys wird der Homestatus festgelegt. Wenn nun aber das Handy sich später einloggt als ich den BM passiere geht der Alarm los. Soweit auch richtig. Der BM triggert alle 15 Sekunden weshalb ich ein wait von 14 Sekunden eingefügt habe.
Falls ich aber in den 14 Sekunden eingeloggt werde, geht der Alarm trotzdem los. Und bei der Kellertür geht der Alarm nur los wenn sie offen bleibt.
1. Wie müsste ich das DOIF verändern, dass der Alarm nicht los geht falls ich in den 14 Sekunden eingeloggt werde?
2. Kann ich den wait timer auch höher stellen (30 Sekunden) und ich durch den BM laufe aber der nicht den timer neu startet?
3. Wie löse ich das mit der Kellertür, dass wenn die zugemacht wird der Alarm trotzdem auslost sofern ich nicht innerhalb des timers eingeloggt werde?
Muss ich das DOIF ggf in mehrere Zweige auftrennen? Danke
Versuch mal einen längeres Wait und DOELSEIF ([Bewohner] eq "home")
.
Also so richtig verstehe ich deinen Ansatz nicht. Weil wenn der DOELSEIF Strang ausgeführt wird und wir zuhause sind dann soll doch kein Alarm auslösen? Und beim längeren wait wird der Timer ja vom BM allein wieder deaktiviert weil der nach 15 Sekunden wieder noMotion als state hat.
Jetzt wo ich das gerade schreibe ist mir aufgefallen, dass ich bei Bewohner(=Residents) damals mal ein attr event-on-change-reading 1 eingefügt hatte, weil sonst jede Minute im event monitor durTimerPresence aufgetaucht war, was vorher meine ich nicht so war. Das habe ich jetzt wieder entfernt und somit hat sich Frage 1 schonmal erledigt, da das jetzt wider funktioniert. Allerdings taucht ja jetzt wieder jede Minute das durTimerPresence auf. Kann ich das unterbinden? Bleibt also noch Frage 2 und 3.
Also das DOIF soll innerhalb der z.B 30 Sekunden nich auf den BM(noMotion) oder die Kellertür(closed) reagieren sondern nur wenn Bewohner=home wird, dann soll der Alarm nicht auslösen. Danke
Zitat von: Tabularasa am 27 April 2017, 09:29:16Allerdings taucht ja jetzt wieder jede Minute das durTimerPresence auf. Kann ich das unterbinden?
Ist zwar kein DOIF-Problem, kannst aber mal hier (https://forum.fhem.de/index.php/topic,49574.0.html) schauen.
Nebenbei: diese Timer waren auch bei mir die Ursache für die Anfrage ;).
Zitat von: Tabularasa am 27 April 2017, 09:29:16
Also so richtig verstehe ich deinen Ansatz nicht. Weil wenn der DOELSEIF Strang ausgeführt wird und wir zuhause sind dann soll doch kein Alarm auslösen? Und beim längeren wait wird der Timer ja vom BM allein wieder deaktiviert weil der nach 15 Sekunden wieder noMotion als state hat.
Jetzt wo ich das gerade schreibe ist mir aufgefallen, dass ich bei Bewohner(=Residents) damals mal ein attr event-on-change-reading 1 eingefügt hatte, weil sonst jede Minute im event monitor durTimerPresence aufgetaucht war, was vorher meine ich nicht so war. Das habe ich jetzt wieder entfernt und somit hat sich Frage 1 schonmal erledigt, da das jetzt wider funktioniert. Allerdings taucht ja jetzt wieder jede Minute das durTimerPresence auf. Kann ich das unterbinden? Bleibt also noch Frage 2 und 3.
Also das DOIF soll innerhalb der z.B 30 Sekunden nich auf den BM(noMotion) oder die Kellertür(closed) reagieren sondern nur wenn Bewohner=home wird, dann soll der Alarm nicht auslösen. Danke
ZitatBleibt also noch Frage 2 und 3.
Sollte auch erledigt sein.
Also so richtig verstehe ich deinen Ansatz nicht. Der Ansatz nutzt das Standardverhalten des DOIF,s. https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen
und aus der Commandref
ZitatDas DOIF-Modul arbeitet mit Zuständen. Jeder Ausführungszweig DOIF/DOELSEIF..DOELSEIF/DOELSE stellt einen eigenen Zustand dar (cmd_1, cmd_2, usw.). Das Modul merkt sich den zuletzt ausgeführten Ausführungszweig und wiederholt diesen standardmäßig nicht. Ein Ausführungszweig wird erst dann wieder ausgeführt, wenn zwischenzeitlich ein anderer Ausführungszweig ausgeführt wurde, also ein Zustandswechsel stattgefunden hat. Dieses Verhalten ist sinnvoll, um zu verhindern, dass zyklisch sendende Sensoren (Temperatur, Feuchtigkeit, Helligkeit, usw.) zu ständiger Wiederholung des selben Befehls oder Befehlsabfolge führen.
ZitatWeil wenn der DOELSEIF Strang ausgeführt wird und wir zuhause sind dann soll doch kein Alarm auslösen?
Wie glaubst Du, wird damit ein Alarm ausgelöst?
Zitat von: Ellert am 26 April 2017, 19:50:06
Versuch mal einen längeres Wait und DOELSEIF ([Bewohner] eq "home")
.
ZitatWie glaubst Du, wird damit ein Alarm ausgelöst?
Also wenn ich dein Ansatz richtig verstanden habe dann sieht ja das DOIF so aus
([Bewohner] ne "home" and ([Taster_BM_Motion:"motion: on"] or [Kellertuer] eq "open")) DOELSEIF ([Bewohner] eq "home") (set Sonos_Mobil Speak 60 de |Hund| |Polizei| |Sirene| , set Telegram msg ACHTUNG der Alarm wurde ausgelöst)
Nur wenn dann der DOELSEIF Strang wahr wird dann sind wir ja zuhause und dann löst ja der Alarm aus, was er ja nicht soll.
Und wenn wer einbrechen sollte und macht die Kellertür auf wird ja die erste Bedingung wahr, der wait timer läuft und wenn er hinter sich die Tür schließt, dann ist sie ja nicht mehr wahr und der Alarm wird nicht ausgelöst und so verhält es sich ja auch mit dem BM. Oder stehe ich jetzt aufm Schlauch?
Zitat von: Per am 27 April 2017, 11:57:03
Ist zwar kein DOIF-Problem, kannst aber mal hier (https://forum.fhem.de/index.php/topic,49574.0.html) schauen.
Nebenbei: diese Timer waren auch bei mir die Ursache für die Anfrage ;).
Ja danke. Habe mich zwischenzeitlich auch dafür entschieden einfach nur die readings anzugeben die ich auch benutze, aber auch gut zu wissen wie man einzelne ausschließt
Zitat von: Tabularasa am 27 April 2017, 17:15:51
Also wenn ich dein Ansatz richtig verstanden habe dann sieht ja das DOIF so aus
([Bewohner] ne "home" and ([Taster_BM_Motion:"motion: on"] or [Kellertuer] eq "open")) DOELSEIF ([Bewohner] eq "home") (set Sonos_Mobil Speak 60 de |Hund| |Polizei| |Sirene| , set Telegram msg ACHTUNG der Alarm wurde ausgelöst)
Nur wenn dann der DOELSEIF Strang wahr wird dann sind wir ja zuhause und dann löst ja der Alarm aus, was er ja nicht soll.
Und wenn wer einbrechen sollte und macht die Kellertür auf wird ja die erste Bedingung wahr, der wait timer läuft und wenn er hinter sich die Tür schließt, dann ist sie ja nicht mehr wahr und der Alarm wird nicht ausgelöst und so verhält es sich ja auch mit dem BM. Oder stehe ich jetzt aufm Schlauch?
Nein, mein Vorschlag war, Dein DOIF um
DOELSEIF ([Bewohner] eq "home")
zu ergänzen, damit nichts passiert, wenn Bewohner "home" wird.
Asche auf mein Haupt ;D ja du hattest nätürlich recht, nur ich falsch verstanden, ich habe es jetzt noch mit einem do always
ergänzt, da sonst der Alarm nur einmal losgeht, aber falls Kellertür und BM ansprechen kann er ruhig mehrmals ertönen :D
Großes DANKE
P.S. Ginge es denn auch das nur beim ersten mal verzögert wird? Also wenn er drin ist dann gleich bei Bewegung der Alarm ertönt?
Dazu müsstest du die Bedingungen aufteilen und bei einer wait 0 und der anderen wait > 0 setzen.