Frage zu DOIF und WAIT / Anwesenheitserkennung über Türkontakt und Bewegungsmeld

Begonnen von AndyMu, 16 September 2017, 18:18:08

Vorheriges Thema - Nächstes Thema

CoolTux

Dein ganzer Ansatz ist großer Käse. Wie kommt man nur auf so ein Konstrukt wo doch die Commandref sowas von ausführlich ist.

([ug_eb_fk:"closed"]) (set HomeStatus_test:FILTER=STATE!=KurzWeg KurzWeg) DOELSEIF ([th_ug_bm_Motion:"motion"]) (set HomeStatus_test:FILTER=STATE!=Zuhause Zuhause)

attr wait 900

Wenn der Türkontakt ein closed liefert läuft ein Timer. Wird binnen 15min keine Bewegung ausgelöst wird HomeStatus auf KurzWeg gesetzt ansonsten wird HomeStatus auf Zuhause gesetzt.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

AndyMu

Äh... wow.
Das ist es, und sogar ganz einfach zu lesen und zu verstehen!
Ich hab mich da anscheinend echt total verrannt, dazu kommt dann noch zuwenig Erfahrung mit der Optimierung z.B. mit den Filtern

Es kann alles so einfach sein, wenn man weiß was man zu machen hat...

Vielen Dank!

Ellert

Zitat von: AndyMu am 17 September 2017, 15:21:48
Ich hab es mir jetzt einfacher gemacht...

Erstmal ein DOIF, das loslegt sobald die Haustüre geschlossen wird:
([ug_eb_fk:"closed"])(
{fhem("delete AbwesendWAIT");
fhem("define AbwesendWAIT at +00:15:00 {fhem('set HomeStatus_test KurzWeg') }");
fhem("attr AbwesendWAIT room Anwesenheit")}
)
DOELSE


Dann, wenn der BWM etwas erkennt, löscht er das at wieder:
([th_ug_bm_Motion:"motion"])(
{fhem ("set HomeStatus_test Zuhause");
fhem ("delete AbwesendWAIT")}
)
DOELSE


Funktioniert grundsätzlich gut, ich bekomme aber Fehlermeldungen ins Log, wenn sowohl beim ersten als zweiten DOIF das AT beim "delete" nicht vorhanden ist.
Da jetzt noch eine Möglichkeit zu erkennen, ob es überhaupt existiert wäre toll.
Und dann noch beim "set HomeStatus..." vorher eine Abfrage, ob der Status nicht evtl. schon auf Zuhause steht.
Ich stehe etwas mit den unterschiedlichen Syntaxen in den Befehlsfolgen auf dem Kriegsfuß, bekomm da ein "if..." nicht zum Laufen.
Du könntest ein benanntes sleep nehmen, das kannst Du über seinen Namen löschen, auch wenn es nicht mehr existiert, ohne Fehlermeldung, s.

https://fhem.de/commandref_DE.html#sleep
https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events dort Alternative mit sleep

AndyMu

Zitat von: CoolTux am 17 September 2017, 15:34:28
Dein ganzer Ansatz ist großer Käse. Wie kommt man nur auf so ein Konstrukt wo doch die Commandref sowas von ausführlich ist.

([ug_eb_fk:"closed"]) (set HomeStatus_test:FILTER=STATE!=KurzWeg KurzWeg) DOELSEIF ([th_ug_bm_Motion:"motion"]) (set HomeStatus_test:FILTER=STATE!=Zuhause Zuhause)

attr wait 900

Wenn der Türkontakt ein closed liefert läuft ein Timer. Wird binnen 15min keine Bewegung ausgelöst wird HomeStatus auf KurzWeg gesetzt ansonsten wird HomeStatus auf Zuhause gesetzt.
Muss ich da noch das "do always" Attribut setzen?

AndyMu

Zitat von: Ellert am 17 September 2017, 16:22:00
Du könntest ein benanntes sleep nehmen, das kannst Du über seinen Namen löschen, auch wenn es nicht mehr existiert, ohne Fehlermeldung, s.

https://fhem.de/commandref_DE.html#sleep
https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events dort Alternative mit sleep
Ok, damit hatte ich mich noch nicht beschäftigt, sieht aber auch elegant aus.
Danke!

CoolTux

Zitat von: AndyMu am 17 September 2017, 17:15:39
Muss ich da noch das "do always" Attribut setzen?

Ohne jetzt weitere Voraussetzungen zu kennen sage ich mal nein. Wieso?
Du kommst oder gehst ja schließlich nur einmal.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

AndyMu

So, meine Anwesenheitssteuerung ist (in meinen Augen) sauber komprimiert und bezieht nun div. auslösende Ereignisse im Haus mit ein, um einen möglichst schnellen Wechsel auf "Zuhause" zu erreichen, falls die Haustüre geschlossen wird.
Dazu zählen das Schalten von Licht, Umschalten am Receiver, öffnen einiger Fenster (die ein potentieller Einbrecher nicht erreichen kann) und natürlich auch Bewegungsmelder. Beim Receiver wurde der Zeitraum 18:45 ausgeklammert, weil hier eine automatische Umschaltung des Programms passiert.

([ug_eb_fk] eq "closed")
(set HomeStatus:FILTER=STATE!=KurzWeg KurzWeg,set Marc:FILTER=STATE!=absent absent,set Eltern:FILTER=STATE!=absent absent)
DOELSEIF ((![18:44-18:46] and [SATReceiver:channel])
or [th_eg_bm_Motion] eq "motion"
or [SichereFenster]
or [":Btn"])
(set HomeStatus:FILTER=STATE!=Zuhause Zuhause,set Eltern:FILTER=STATE!=present present)

AndyMu

Ich hab hier leider doch noch ein Thema...

Beim Bewegungsmelder ug_marc_bm möchte ich eine Aktion auslösen, sobald eine Bewegung erkannt wird.
Dafür habe ich ein eigenes DOIF erstellt:
([ug_marc_bm_Motion:"motion"])
(set HomeStatus:FILTER=STATE!=Zuhause Zuhause,set Marc:FILTER=STATE!=present present)
DOELSEIF ([ug_marc_bm_Motion:"noMotion"])
(set Marc:FILTER=STATE!=absent absent)

Das funktioniert soweit auch, im zweiten Fall soll, wenn der BM keine Bewegung mehr erkennt, nach x Sekunden der Status auf "absent" gesetzt werden.
Irgendwie aber startet cmd1, wenn der BM auf "noMotion" geht. Was übersehe ich?

Das list vom DOIF:
Internals:
   CFGFN
   DEF        ([ug_marc_bm_Motion:"motion"])
(set HomeStatus:FILTER=STATE!=Zuhause Zuhause,set Marc:FILTER=STATE!=present present)
DOELSEIF ([ug_marc_bm_Motion:"noMotion"])
(set Marc:FILTER=STATE!=absent absent)
   NAME       DOIF_SteuerungAnwesenheitMarc
   NR         813
   NTFY_ORDER 50-DOIF_SteuerungAnwesenheitMarc
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2017-10-03 12:07:08   Device          ug_marc_bm_Motion
     2017-10-03 12:07:08   cmd             1
     2017-10-03 12:07:08   cmd_event       ug_marc_bm_Motion
     2017-10-03 12:07:08   cmd_nr          1
     2017-10-03 12:07:08   e_ug_marc_bm_Motion_events motion: off,motionDuration: 242,noMotion
     2017-10-03 12:07:08   state           cmd_1
   condition:
     0          EventDoIf('ug_marc_bm_Motion',$hash,'motion',1)
     1          EventDoIf('ug_marc_bm_Motion',$hash,'noMotion',1)
   devices:
     0           ug_marc_bm_Motion
     1           ug_marc_bm_Motion
     all         ug_marc_bm_Motion
   do:
     0:
       0          set HomeStatus:FILTER=STATE!=Zuhause Zuhause,set Marc:FILTER=STATE!=present present
     1:
       0          set Marc:FILTER=STATE!=absent absent
     2:
   helper:
     event      motion: off
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   ug_marc_bm_Motion
     timerevent motion: off
     triggerDev ug_marc_bm_Motion
     bm:
       DOIF_Attr:
         cnt        1
         dmx        0
         mAr
         mTS
         max        0
         tot        0
       DOIF_Notify:
         cnt        239
         dmx        0
         mTS        03.10. 12:07:08
         max        52
         tot        52
         mAr:
           HASH(0x4c06240)
           HASH(0x3b83fd8)
       DOIF_Set:
         cnt        37
         dmx        0
         mTS        03.10. 12:04:23
         max        337
         tot        337
         mAr:
           HASH(0x4c06240)
           DOIF_SteuerungAnwesenheitMarc
           cmd_1
     timerevents:
       motion: off
       motionDuration: 242
       noMotion
     timereventsState:
       motion: off
       motionDuration: 242
       state: noMotion
     triggerEvents:
       motion: off
       motionDuration: 242
       noMotion
     triggerEventsState:
       motion: off
       motionDuration: 242
       state: noMotion
   internals:
   itimer:
   readings:
   regexp:
     0:
     all:
   state:
     STATE:
   trigger:
     all         ug_marc_bm_Motion
Attributes:
   do         always
   room       Anwesenheit
   wait       0:60

Rolfg

Hallo,
nur ein Versuch. Bei mir funktioniert das: ([ug_marc_bm_Motion:"motion"]) meistens auch nicht.
Ich schreibe das immer so: ([ug_marc_bm_Motion] eq "motion").
Vielleicht geht's.


AndyMu

Ja, so funktioniert es... danke!
([ug_marc_bm_Motion:state] eq "motion")
(set HomeStatus:FILTER=STATE!=Zuhause Zuhause,set Marc:FILTER=STATE!=present present)
DOELSEIF ([ug_marc_bm_Motion] eq "noMotion")
(set Marc:FILTER=STATE!=absent absent)