Hauptmenü

[GELÖST]Alarm DOIF

Begonnen von Tabularasa, 26 April 2017, 18:46:56

Vorheriges Thema - Nächstes Thema

Tabularasa

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

Ellert

Versuch mal einen längeres Wait und DOELSEIF ([Bewohner] eq "home").

Tabularasa

#2
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

Per

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 schauen.
Nebenbei: diese Timer waren auch bei mir die Ursache für die Anfrage ;).

Ellert

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?

Tabularasa

#5
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?

Tabularasa

Zitat von: Per am 27 April 2017, 11:57:03
Ist zwar kein DOIF-Problem, kannst aber mal hier 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

Ellert

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.

Tabularasa

#8
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?

Per

Dazu müsstest du die Bedingungen aufteilen und bei einer wait 0 und der anderen wait > 0 setzen.