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

AndyMu

Hallo,

ich hänge hier mit einem eigentlich ganz einfachen DOIF, aber irgendwie löst es einfach nicht aus...
Internals:
   CFGFN
   DEF        ([HomeStatus_test:"undefined"])(
set HomeStatus_test KurzWeg
)
DOELSE
   NAME       Abwesend
   NR         645
   NTFY_ORDER 50-Abwesenheit
   STATE      initialize
   TYPE       DOIF
   READINGS:
     2017-09-16 18:14:58   mode            enable
     2017-09-16 18:14:35   state           initialize
   condition:
     0          EventDoIf('HomeStatus_test',$hash,'undefined',1)
   devices:
     0           HomeStatus_test
     all         HomeStatus_test
   do:
     0:
       0            set HomeStatus_test KurzWeg
     1:
       0
   helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
     bm:
       DOIF_Attr:
         cnt        1
         dmx        0
         mAr
         mTS
         max        0
         tot        0
       DOIF_Notify:
         cnt        171
         dmx        0
         mAr
         mTS
         max        0
         tot        0
       DOIF_Set:
         cnt        31
         dmx        0
         mTS        16.09. 18:14:35
         max        12
         tot        23
         mAr:
           HASH(0x36fb090)
           Abwesend
           initialize
   itimer:
   regexp:
     all:
   state:
     STATE:
   trigger:
     all         HomeStatus_test
Attributes:
   do         always
   room       Anwesenheit
   wait       900


Wenn ich HomeStatus_test händisch von nem anderen Wert auf "undefined" stelle, sollte doch eigentlich der WAIT mit 900 loslaufen und dann irgendwann das HomeStatus_test auf "Zuhause" setzen... passiert nur leider gar nicht.

Das HomeStatus_test sieht so aus:
Internals:
   CHANGED
   NAME       HomeStatus_test
   NR         364
   STATE      undefined
   TYPE       dummy
   READINGS:
     2017-09-16 18:15:12   state           undefined
   helper:
     bm:
       dummy_Set:
         cnt        126
         dmx        0
         mTS        16.09. 17:30:03
         max        26
         tot        284
         mAr:
           HASH(0x2cd7dc0)
           HomeStatus_test
           undefined
Attributes:
   event-on-change-reading STATE
   room       Anwesenheit
   setList    Zuhause KurzWeg LangWeg Party undefined


Irgendwie stehe ich gerade aufm Schlauch, wer kann mir helfen?

Danke!

Ellert

#1
Wie sieht das Event aus, das zu Deiner Aktion erzeugt wird?

Übrigens, STATE ist kein Reading sondern ein Internal.

AndyMu

Blöde Frage... was meinst Du? ;)

Ellert

Was genau hast Du an meiner Frage nicht verstanden?

AndyMu

Vorab: Nicht dass Du das "Blöde Frage..." auf Dich gesehen hast, es war auf mich als Anfänger gesehen.

Ausgelöst werden soll das DOIF, wenn folgendes DOIF den Status von HomeStatus_test ändert:
Internals:
   CFGFN
   DEF        ([th_ug_bm_Motion:"motion"])(
set HomeStatus_test Zuhause
)
DOELSEIF
([ug_eb_fk:"closed"])(
set HomeStatus_test undefined
)
   NAME       Anwesend
   NR         382
   NTFY_ORDER 50-Anwesenheit
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2017-09-16 19:02:44   Device          th_ug_bm_Motion
     2017-09-16 19:01:55   cmd             1
     2017-09-16 19:01:55   cmd_event       th_ug_bm_Motion
     2017-09-16 19:01:55   cmd_nr          1
     2017-09-16 19:02:44   e_th_ug_bm_Motion_events motion: off,motionDuration: 65,noMotion
     2017-09-16 19:01:47   e_ug_eb_fk_events battery: ok,contact: closed (to vccu),closed,trigger_cnt: 240
     2017-09-16 19:01:55   state           cmd_1
   condition:
     0          EventDoIf('th_ug_bm_Motion',$hash,'motion',1)
     1          EventDoIf('ug_eb_fk',$hash,'closed',1)
   devices:
     0           th_ug_bm_Motion
     1           ug_eb_fk
     all         th_ug_bm_Motion ug_eb_fk
   do:
     0:
       0            set HomeStatus_test Zuhause
     1:
       0            set HomeStatus_test undefined
     2:
   helper:
     event      motion: off
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   th_ug_bm_Motion
     timerevent motion: off
     triggerDev th_ug_bm_Motion
     bm:
       DOIF_Attr:
         cnt        3
         dmx        0
         mAr
         mTS
         max        0
         tot        0
       DOIF_Notify:
         cnt        2248
         dmx        0
         mTS        16.09. 19:01:55
         max        51
         tot        570
         mAr:
           HASH(0x2565b38)
           HASH(0x2e22938)
       DOIF_Set:
         cnt        64
         dmx        0
         mAr
         mTS
         max        0
         tot        0
     timerevents:
       motion: off
       motionDuration: 65
       noMotion
     timereventsState:
       motion: off
       motionDuration: 65
       state: noMotion
     triggerEvents:
       motion: off
       motionDuration: 65
       noMotion
     triggerEventsState:
       motion: off
       motionDuration: 65
       state: noMotion
   internals:
   itimer:
   readings:
   regexp:
     0:
     1:
     all:
   state:
     STATE:
   trigger:
     all         th_ug_bm_Motion ug_eb_fk
Attributes:
   room       Anwesenheit
   selftrigger all

AndyMu

Das event-on-change-reading habe ich wieder rausgenommen, dann nochmal in der Commandline
set HomeStatus_test undefined
eingegeben, jetzt hat komischerweise das DOIF gezogen.

Ich beobachte mal...

AndyMu

Was ich eigentlich möchte:

Ich habe einen Bewegungsmelder sowie einen Türkontakt an der Haustüre.
Wenn jetzt die Haustüre auf- und wieder zugemacht wird, soll ein timer von 900 sec loslaufen, der sollte er durch eine Motion über den Bewegungsmelder nicht unterbrochen werden, den HomeStatus auf "KurzWeg" stellen soll.
Der BWM stellt jedesmal, wenn er ausgelöst wird, den HomStatus auf "Zuhause".

Ellert

Habe ich das richtig verstanden?

Haustür auf, dann Haustür zu, Timer startet, nach Ablauf des Timers soll der set-Befehl "KurzWeg" ausgeführt werden.

Wenn "KurzWeg" gesetzt ist, soll bei erkannter Bewegung "Zuhause" gesetzt werden.

AndyMu

#8
Fast... wenn während des Timers eine Bewegung erkannt wird, soll der Timer beendet und HomeStatus auf "Zuhause" gesetzt bleiben.
Das "Tür auf" braucht nicht berücksichtigt werden, ein "closed" reicht natürlich.

Das DOIF zur Überprüfung von Motion im BWM hab ich so abgeändert, dass es nicht bei jedem motion den HomeStatus auf "Zuhause" setzt, sondern nur wenn er ungleich "Zuhause" ist.

AndyMu

Ich glaub, darüber hab ich es jetzt hinbekommen:
Internals:
   DEF        ([th_ug_bm_Motion:"motion"] and [HomeStatus_test] ne "Zuhause")(
set HomeStatus_test Zuhause
)
DOELSEIF
([ug_eb_fk:"closed"])(
set HomeStatus_test undefined
)
   NAME       Anwesend
   NR         365
   NTFY_ORDER 50-Anwesend
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2017-09-16 20:14:14   Device          HomeStatus_test
     2017-09-16 20:14:14   cmd             1
     2017-09-16 20:14:14   cmd_event       th_ug_bm_Motion
     2017-09-16 20:14:14   cmd_nr          1
     2017-09-16 20:14:14   e_HomeStatus_test_STATE Zuhause
     2017-09-16 20:14:14   e_HomeStatus_test_events Zuhause
     2017-09-16 20:14:14   e_th_ug_bm_Motion_events brightness: 0,motion: on (to vccu),motionCount: 5_next:240s,motion,trigger_cnt: 5
     2017-09-16 20:13:38   e_ug_eb_fk_events closed
     2017-09-16 20:14:14   state           cmd_1
   condition:
     0          EventDoIf('th_ug_bm_Motion',$hash,'motion',1) and InternalDoIf($hash,'HomeStatus_test','STATE') ne "Zuhause"
     1          EventDoIf('ug_eb_fk',$hash,'closed',1)
   devices:
     0           th_ug_bm_Motion HomeStatus_test
     1           ug_eb_fk
     all         th_ug_bm_Motion HomeStatus_test ug_eb_fk
   do:
     0:
       0            set HomeStatus_test Zuhause
     1:
       0            set HomeStatus_test undefined
     2:
   helper:
     event      Zuhause
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   th_ug_bm_Motion
     timerevent motion: on (to vccu)
     triggerDev HomeStatus_test
     bm:
       DOIF_Notify:
         cnt        317
         dmx        0
         mTS        16.09. 20:05:52
         max        50
         tot        149
         mAr:
           HASH(0x29b4ed0)
           HASH(0x29acf90)
       DOIF_Set:
         cnt        17
         dmx        0
         mAr
         mTS
         max        0
         tot        0
     timerevents:
       brightness: 0
       motion: on (to vccu)
       motionCount: 5_next:240s
       motion
       trigger_cnt: 5
     timereventsState:
       brightness: 0
       motion: on (to vccu)
       motionCount: 5_next:240s
       state: motion
       trigger_cnt: 5
     triggerEvents:
       Zuhause
     triggerEventsState:
       state: Zuhause
   internals:
     0           HomeStatus_test:STATE
     all         HomeStatus_test:STATE
   itimer:
   readings:
   regexp:
     0:
     1:
     all:
   state:
     STATE:
   trigger:
     all         th_ug_bm_Motion ug_eb_fk
Attributes:
   do         always
   room       Anwesenheit
   selftrigger all


Internals:
   DEF        ([HomeStatus_test:"undefined"])(
set HomeStatus_test KurzWeg
)
DOELSE
   NAME       Abwesend
   NR         367
   NTFY_ORDER 50-Abwesend
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2017-09-16 20:14:14   Device          HomeStatus_test
     2017-09-16 20:05:52   cmd             2
     2017-09-16 20:05:52   cmd_event       HomeStatus_test
     2017-09-16 20:05:52   cmd_nr          2
     2017-09-16 20:14:14   e_HomeStatus_test_events Zuhause
     2017-09-16 18:14:58   mode            enable
     2017-09-16 20:05:52   state           cmd_2
     2017-09-16 20:14:14   wait_timer      no timer
   condition:
     0          EventDoIf('HomeStatus_test',$hash,'undefined',1)
   devices:
     0           HomeStatus_test
     all         HomeStatus_test
   do:
     0:
       0            set HomeStatus_test KurzWeg
     1:
       0
   helper:
     event      Zuhause
     globalinit 1
     last_timer 0
     sleepdevice HomeStatus_test
     sleepsubtimer 0
     sleeptimer -1
     timerdev   HomeStatus_test
     timerevent Zuhause
     triggerDev HomeStatus_test
     bm:
       DOIF_Attr:
         cnt        1
         dmx        0
         mAr
         mTS
         max        0
         tot        0
       DOIF_Notify:
         cnt        1892
         dmx        0
         mTS        16.09. 20:05:52
         max        18
         tot        127
         mAr:
           HASH(0x27a3ff8)
           HASH(0x27a34e0)
       DOIF_Set:
         cnt        28
         dmx        0
         mAr
         mTS
         max        0
         tot        0
     timerevents:
       Zuhause
     timereventsState:
       state: Zuhause
     triggerEvents:
       Zuhause
     triggerEventsState:
       state: Zuhause
   internals:
   itimer:
   readings:
   regexp:
     0:
     all:
   state:
     STATE:
   trigger:
     all         HomeStatus_test
Attributes:
   room       Anwesenheit
   wait       900


Brauch ich das "selftrigger all" Attribut eigentlich noch?

AndyMu

Ich würde gerne noch den Status "undefined" vom HomeStatus wegbekommen... vielleicht über einen "Zwischen-Dummy"?

Ellert

Eine recht zuvelässige Methode die Anwesendheit festzustellen, ist die Butzung von G-Tag über PRESENCE, das soll sogar Raum/Stockwerk bezogen funktionieren, ohne undefinierte Zustände.

AndyMu

Hatte ich auch schon mal ausprobiert und dann wieder bleiben lassen.
Ich hatte die PebbleBee ausprobiert, aber da ist schon innerhalb des Zimmers der Kontakt zum BT-Dongle am Raspberry hinterm Fernseher abgerissen, wenn der Schlüsselanhänger in einer Tasche auf der anderen Seite des Zimmers war. Und ich bekomme meine Familie einfach nicht dazu, ihre Schlüssel am Schlüsselbrett aufzuhängen.

Rolfg

Hallo,

ich habe mal einen etwas anderen Ansatz gerade ausprobiert. Ich habe auf den Türkontakt ein Watchdog gesetzt. Allerdings auf das open Event. Wenn dann nach x Zeit kein Bewegungsmeder:motion kommt setze Dummy auf abwesend.


Türkontakt:open.* 00:00:15 Bewegung:motion.* set dummy_Anwesend Abwesend;

Als Attribut bei Watchdog autoRestart 1

Und als Notify oder Doif. Wenn Bewegung erkannt und Dummy_Anwesend ungleich Anwesend setzte ihn auf Anwesend. Den Code muß du selber basteln. Ich würde halt auf open Triggern. Vielleicht kannst du ja damit was anfangen.

Gruß Rolf

AndyMu

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.