FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Christian Uhlmann am 24 Januar 2017, 13:42:22

Titel: [gelöst]: DOIF für mehrere Geräte mit wait Timer
Beitrag von: Christian Uhlmann am 24 Januar 2017, 13:42:22
Hallo zusammen,

ich habe hier mehrere Bewegungsmelder, welche nur ein Reading namens "reading" besitzen, in denen dann entweder "on" oder "off" steht.
Diese haben alle die gleiche Namensgebung (BMK im Namen), so dass ich für alle ein DOIF schreiben wollte, womit ich mir state setzen lassen wie z.B.: bei den Homematic Bewegungsmeldern.

reading = on
setze state auf motion

readiing = off
setze state auf noMotion (aber erst nach 60 Sekunden)

So sieht mein DOIF aus:


define doif.10.XX.yy.BMK.state DOIF (["BMK"] and [$DEVICE:reading] eq "on") \
    (setreading $DEVICE state motion) \
DOELSEIF \
(["BMK"] and [$DEVICE:reading] eq "off") \
    (setreading $DEVICE state noMotion)
attr doif.10.XX.yy.BMK.state do always
attr doif.10.XX.yy.BMK.state room Versorgungsraum
attr doif.10.XX.yy.BMK.state wait :60


Und dazu das List des Devices:

Internals:
   CFGFN
   DEF        (["BMK"] and [$DEVICE:reading] eq "on")
    (setreading $DEVICE state motion)
DOELSEIF
(["BMK"] and [$DEVICE:reading] eq "off")
    (setreading $DEVICE state noMotion)
   NAME       doif.10.XX.yy.BMK.state
   NR         269664
   NTFY_ORDER 50-doif.10.XX.yy.BMK.state
   STATE      cmd_1
   TYPE       DOIF
   Helper:
     Dblog:
       Cmd:
         Sys.dblog:
           TIME       1485261325.10009
           VALUE      1
       Cmd_event:
         Sys.dblog:
           TIME       1485261325.10009
           VALUE      EG.fl.BMK.Flur_Motion
       Cmd_nr:
         Sys.dblog:
           TIME       1485261325.10009
           VALUE      1
       Last_cmd:
         Sys.dblog:
           TIME       1485259600.9926
           VALUE      initialized
       Mode:
         Sys.dblog:
           TIME       1485259603.70012
           VALUE      enable
       State:
         Sys.dblog:
           TIME       1485261325.10009
           VALUE      cmd_1
       Wait_timer:
         Sys.dblog:
           TIME       1485261340.96835
           VALUE      24.01.2017 13:36:40 cmd_2 EG.fl.BMK.Flur_Motion
   Readings:
     2017-01-24 13:35:40   Device          EG.fl.BMK.Flur_Motion
     2017-01-24 13:35:25   cmd             1
     2017-01-24 13:35:25   cmd_event       EG.fl.BMK.Flur_Motion
     2017-01-24 13:35:25   cmd_nr          1
     2017-01-24 13:35:40   matched_event_c1_1 reading: off,motion: off
     2017-01-24 13:35:40   matched_event_c2_1 reading: off,motion: off
     2017-01-24 13:35:25   state           cmd_1
     2017-01-24 13:35:40   wait_timer      24.01.2017 13:36:40 cmd_2 EG.fl.BMK.Flur_Motion
   Condition:
     0          EventDoIf('BMK',$hash,'',0) and ReadingValDoIf($hash,'$DEVICE','reading') eq "on"
     1          EventDoIf('BMK',$hash,'',0) and ReadingValDoIf($hash,'$DEVICE','reading') eq "off"
   Devices:
   Do:
     0:
       0          setreading $DEVICE state motion
     1:
       0          setreading $DEVICE state noMotion
     2:
   Helper:
     event      reading: off,motion: off
     globalinit 1
     last_timer 0
     sleepdevice EG.fl.BMK.Flur_Motion
     sleepsubtimer 0
     sleeptimer 1
     timerdev   EG.fl.BMK.Flur_Motion
     timerevent reading: off,motion: off
     triggerDev EG.fl.BMK.Flur_Motion
     timerevents:
       reading: off
       motion: off
     timereventsState:
       reading: off
       motion: off
     triggerEvents:
       reading: off
       motion: off
     triggerEventsState:
       reading: off
       motion: off
   Internals:
   Itimer:
   Readings:
     0           $DEVICE:reading
     1           $DEVICE:reading
     all         $DEVICE:reading $DEVICE:reading
   Regexp:
     0:
       0          BMK
     1:
       0          BMK
     All:
       0          BMK
   State:
   Trigger:
Attributes:
   do         always
   room       Versorgungsraum
   wait       :60


Für einzelne Bewegungen funktioniert das auch, sobald aber zwei Bewegungsmelder hintereinander im reading auf off gehen, dann wird der erste Timer vom zweiten überschrieben.
Der erste Bewegungsmelder bleibt auf motion, der zweite schaltet korrekt nach 60 Sekunden auf noMotion.

Hier das List so eines Bewegungsmelders:

Internals:
   CFGFN
   DEF        4
   IODev      SYS.gw.AE.Versorgungsraum
   NAME       EG.ku.BMK.Kueche_Motion
   NR         676
   PIN        4
   STATE      off
   TYPE       FRM_IN
   Helper:
     Dblog:
       Logstate:
         Sys.dblog:
           TIME       1485260016.14683
           VALUE      motion
       Motion:
         Sys.dblog:
           TIME       1485261311.99207
           VALUE      off
       Reading:
         Sys.dblog:
           TIME       1485261311.99207
           VALUE      off
       State:
         Sys.dblog:
           TIME       1485168816.5425
           VALUE      Initialized
   Readings:
     2017-01-24 13:35:11   logstate        motion
     2017-01-24 13:35:11   motion          off
     2017-01-24 13:35:11   reading         off
     2017-01-24 13:35:06   state           motion
Attributes:
   HomeModeAlarmActive armaway
   HomeSensorLocation inside
   IODev      SYS.gw.AE.Versorgungsraum
   alias      Bewegung
   event-on-change-reading .*
   genericDeviceType MotionSensor
   group      Schalter
   homebridge active
   homebridgeMapping MotionDetected=state,values=/motion/:1;;/noMotion/:0
   icon       people_sensor
   room       Kueche,Versorgungsraum
   showtime   1
   stateFormat reading
   subType    motionDetector
   userReadings motion { ReadingsVal($name,"reading","off") },logstate { ReadingsVal($name,"state","unknown") }
   userattr   HomeModeAlarmActive HomeOpenTamperReadings HomeOpenTamperVal HomeSensorLocation:inside,outside showtime:1,0 subType:motionDetector


Hat jemand eine Idee, wie ich das mit einem DOIF korrekt abbilden kann?


Danke und Grüße

Christian
Titel: Antw:DOIF für mehrere Geräte mit wait Timer
Beitrag von: Damian am 24 Januar 2017, 13:54:55
In einem DOIF-Modul gibt es nur einen Wait Timer. Wenn du etwas verallgemeinern (generalisieren) willst und gleichzeitig mit Verzögerungen arbeiten willst, dann brauchst du pro Device einen eigenen Verzögerungstimer.

Das kannst du z. B. so lösen:

Auszug aus der Commandref zu DOIF:

ZitatVerzögerte "Fenster offen"-Meldung

define di_window_open DOIF ["^window_:open|tilted"])
(defmod at_$DEVICE at +00:05 set send window $DEVICE open)
DOELSEIF (["^window_:closed"])
(delete at_$DEVICE)

attr di_window_open do always

Alternative mit sleep

define di_window_open DOIF ["^window_:open|tilted"])
(sleep 300 $DEVICE quiet;set send window $DEVICE open)
DOELSEIF (["^window_:closed"])
(cancel $DEVICE quiet)

attr di_window_open do always

In den obigen beiden Beispielen ist eine Verzögerung über das Attribut wait nicht sinnvoll, da pro Fenster ein eigener Timer (hier mit Hilfe von at/sleep) gesetzt werden muss.
Titel: Antw:DOIF für mehrere Geräte mit wait Timer
Beitrag von: Christian Uhlmann am 24 Januar 2017, 14:15:43
Alles klar, vielen Dank. Hat geklappt  :D

Habe die variante mit sleep verwendet, gibt es da ggf. Probleme, wenn es zu viele davon gibt?

Ebenso die Frage, was ist, wenn während des sleep für eines der Devices erneut Bewegung erkannt wird:
Im Detail:
14:10:10 readings = on DOIF schaltet state auf motion
14:10:20 readings = off DOIF startet sleep für 60 sekunden um dann state auf noMotion zu schalten
14:10:50 readings = on DOIF schaltet state auf motion

kommt dann um
14:11:20 das sleep aus dem DOIF und schaltet auf noMotion?

Ich merk schon, da muss ich noch überlegen, wie das am besten geht.


Grüße

Christian

Titel: Antw:DOIF für mehrere Geräte mit wait Timer
Beitrag von: Damian am 24 Januar 2017, 22:38:26
Zitat von: Christian Uhlmann am 24 Januar 2017, 14:15:43
Alles klar, vielen Dank. Hat geklappt  :D

Habe die variante mit sleep verwendet, gibt es da ggf. Probleme, wenn es zu viele davon gibt?

Ebenso die Frage, was ist, wenn während des sleep für eines der Devices erneut Bewegung erkannt wird:
Im Detail:
14:10:10 readings = on DOIF schaltet state auf motion
14:10:20 readings = off DOIF startet sleep für 60 sekunden um dann state auf noMotion zu schalten
14:10:50 readings = on DOIF schaltet state auf motion

kommt dann um
14:11:20 das sleep aus dem DOIF und schaltet auf noMotion?

Ich merk schon, da muss ich noch überlegen, wie das am besten geht.


Grüße

Christian

Du kannst beliebig viele sleeps verwenden. Wenn motion mehrfach hintereinander kommt, dann musst du vorher dein sleep löschen mit
cancel <sleepname> quiet bevor du einen neuen setzt.
Titel: Antw:DOIF für mehrere Geräte mit wait Timer
Beitrag von: Christian Uhlmann am 25 Januar 2017, 09:42:23
Hi Damian,

vielen Dank, damit hab ich es nun korrekt lösen können.


Grüße

Christian