FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: rallye am 16 Dezember 2020, 14:28:44

Titel: Lampe mit DOIF und Anwesenheit schalten
Beitrag von: rallye am 16 Dezember 2020, 14:28:44
Ich habe folgende "Labor"-Situation:
defmod sw1 dummy
attr sw1 room Development
attr sw1 webCmd on:off

defmod t_pers ROOMMATE
attr t_pers devStateIcon .*home:user_available@green:absent .*absent:user_away@orange:home .*gone:user_ext_away@red:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown:home
attr t_pers group t_pers
attr t_pers icon people_sensor
attr t_pers room Development
attr t_pers rr_locationHome home
attr t_pers rr_locations home
attr t_pers rr_realname group
attr t_pers rr_states home,absent,gone
attr t_pers webCmd state

und
defmod t_timer DOIF ([?14:00-14:45] and [t_pers:"home"])\
    (set sw1 on-till 23:45,\
     )
attr t_timer room Development


Wenn t_pers um 14:00 Uhr bereits daheim (status ist "home") ist wird sw1 nicht geschaltet (ist so gewünscht) aber vor 14:45 daheim verlässt (status geht von "home" auf "absent") schaltet sw1 - und das ist natürlich nicht so gewünscht. Entweder es handelt sich hier um einen Fehler im DOIF oder um einen Fehler in meinem Gedankengang. Ich würde erwarten, dass auch im letzten Fall sw1 nicht geschaltet wird, da ich eben einen trigger auf "home" setze - und nicht auf "absent".

Kann mich bitte jemand erleuchten ? Danke
Titel: Antw:Lampe mit DOIF und Anwesenheit schalten
Beitrag von: rabehd am 16 Dezember 2020, 14:53:44
Der Ansatz klingt kompliziert.

Warum reicht nicht:
Wenn jemand nach Hause kommt und es zwischen 14:00 und 14:45 ist...

Zitatvor 14:45 daheim verlässt (status geht von "home" auf "absent") schaltet sw1 -
Dann würde ich das hier mal prüfen
Zitat[t_pers:"home"]
Titel: Antw:Lampe mit DOIF und Anwesenheit schalten
Beitrag von: rallye am 16 Dezember 2020, 15:19:55
Der Ansatz ist ganz einfach. Ich möchte erreichen, dass ausschließlich wenn t_pers zwischen 14:00 und 14:45 heim kommt sw1 schaltet. Das habe ich mit meinem Beispiel erreicht. Das Problem ist, dass sw1 auch schaltet, wenn t_pers zwischen 14:00 und 14:45 fort geht.
Titel: Antw:Lampe mit DOIF und Anwesenheit schalten
Beitrag von: rabehd am 16 Dezember 2020, 15:33:09
ZitatDas habe ich mit meinem Beispiel erreicht.
Echt?
ZitatDas Problem ist, dass sw1 auch schaltet, wenn

Wenn etwas nicht geschaltet werden soll, dann ist es keine Anforderung, sondern in der Beschreibung überflüssig.
Titel: Antw:Lampe mit DOIF und Anwesenheit schalten
Beitrag von: xenos1984 am 16 Dezember 2020, 15:37:34
Was sagt denn ein List des DOIF, wenn es fälschlicherweise geschaltet hat?
Titel: Antw:Lampe mit DOIF und Anwesenheit schalten
Beitrag von: amenomade am 17 Dezember 2020, 00:26:50
Wenn t_pers auf absent geht, werden folgende Events generiert:

2020-12-17 00:24:06 ROOMMATE t_pers lastState: home
2020-12-17 00:24:06 ROOMMATE t_pers absent
2020-12-17 00:24:06 ROOMMATE t_pers lastMood: calm
2020-12-17 00:24:06 ROOMMATE t_pers mood: -
2020-12-17 00:24:06 ROOMMATE t_pers presence: absent
2020-12-17 00:24:06 ROOMMATE t_pers lastLocation: home
2020-12-17 00:24:06 ROOMMATE t_pers location: underway
2020-12-17 00:24:06 ROOMMATE t_pers lastDeparture: 2020-12-17 00:24:06
2020-12-17 00:24:06 ROOMMATE t_pers lastDurPresence: 00:00:13
2020-12-17 00:24:06 ROOMMATE t_pers lastDurPresence_cr: 0
2020-12-17 00:25:06 ROOMMATE t_pers durTimerAbsence_cr: 1
2020-12-17 00:25:06 ROOMMATE t_pers durTimerAbsence: 00:01:00


[t_pers:"home"]triggert auf:
2020-12-17 00:24:06 ROOMMATE t_pers lastState: home
2020-12-17 00:24:06 ROOMMATE t_pers lastLocation: home

weil Du auf Events triggerst.

Ich würde entweder auf einem genauen Event triggern (lass dir die Regex vom Eventmonitor generieren, Du wirst sehen, dass ^ und $ fehlen)
Oder auf Zustand: DOIF ([?14:00-14:45] and [Status:presence] eq "home") (set sw1 on-till 23:45) DOELSE
Titel: Antw:Lampe mit DOIF und Anwesenheit schalten
Beitrag von: rallye am 17 Dezember 2020, 12:10:18
Zitat von: xenos1984 am 16 Dezember 2020, 15:37:34
Was sagt denn ein List des DOIF, wenn es fälschlicherweise geschaltet hat?

Anbei das list (mit veränderten Zeiten, da ich sonst bis 14:15 warten müsste ;) )
DEF        ([?12:08-14:45] and [t_pers:"home"])
    (set sw1 on-till 23:45,
     set sw2 on-till 23:45,
     )
   FUUID      5fd9ed2f-f33f-55a1-fcf3-ae9c2666da7ac4b5
   MODEL      FHEM
   NAME       t_timer
   NOTIFYDEV  global,t_pers
   NR         284
   NTFY_ORDER 50-t_timer
   STATE      cmd_1
   TYPE       DOIF
   VERSION    23235 2020-11-25 22:42:28
   .attraggr:
   .attrminint:
   READINGS:
     2020-12-17 12:08:08   Device          t_pers
     2020-12-17 12:08:08   cmd             1
     2020-12-17 12:08:08   cmd_event       t_pers
     2020-12-17 12:08:08   cmd_nr          1
     2020-12-17 12:08:08   e_t_pers_events lastState: home,absent,lastMood: calm,mood: -,presence: absent,lastLocation: home,location: underway,lastDeparture: 2020-12-17 12:08:08,lastDurPresence: 00:00:59,lastDurPresence_cr: 1
     2020-12-17 12:07:24   mode            enabled
     2020-12-17 12:08:08   state           cmd_1
     2020-12-17 12:07:24   timer_01_c01    17.12.2020 12:08:00
     2020-12-17 12:07:24   timer_02_c01    17.12.2020 14:45:00
   Regex:
     accu:
     cond:
       t_pers:
         0:
           &STATE     ^t_pers$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and ::EventDoIf('t_pers',$hash,'home',1)
   days:
   do:
     0:
       0          set sw1 on-till 23:45,      set sw2 on-till 23:45,     
     1:
   helper:
     DEVFILTER  ^global$|^t_pers$
     NOTIFYDEV  global|t_pers
     event      lastState: home
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   t_pers
     timerevent lastState: home
     triggerDev t_pers
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: t_pers
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: t_pers
       state: cmd_1
     timerevents:
       lastState: home
       absent
       lastMood: calm
       mood: -
       presence: absent
       lastLocation: home
       location: underway
       lastDeparture: 2020-12-17 12:08:08
       lastDurPresence: 00:00:59
       lastDurPresence_cr: 1
     timereventsState:
       lastState: home
       state: absent
       lastMood: calm
       mood: -
       presence: absent
       lastLocation: home
       location: underway
       lastDeparture: 2020-12-17 12:08:08
       lastDurPresence: 00:00:59
       lastDurPresence_cr: 1
     triggerEvents:
       lastState: home
       absent
       lastMood: calm
       mood: -
       presence: absent
       lastLocation: home
       location: underway
       lastDeparture: 2020-12-17 12:08:08
       lastDurPresence: 00:00:59
       lastDurPresence_cr: 1
     triggerEventsState:
       lastState: home
       state: absent
       lastMood: calm
       mood: -
       presence: absent
       lastLocation: home
       location: underway
       lastDeparture: 2020-12-17 12:08:08
       lastDurPresence: 00:00:59
       lastDurPresence_cr: 1
   internals:
   interval:
     0          -1
     1          0
   intervalfunc:
   intervaltimer:
   localtime:
     0          1608203280
     1          1608212700
   readings:
   realtime:
     0          12:08:00
     1          14:45:00
   time:
     0          12:08:00
     1          14:45:00
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
   trigger:
     all         t_pers
   triggertime:
     1608212700:
       localtime  1608212700
       hash:
   uiState:
   uiTable:
Attributes:
   room       Development
Titel: Antw:Lampe mit DOIF und Anwesenheit schalten
Beitrag von: rallye am 17 Dezember 2020, 12:34:17
Zitat von: amenomade am 17 Dezember 2020, 00:26:50
Ich würde entweder auf einem genauen Event triggern (lass dir die Regex vom Eventmonitor generieren, Du wirst sehen, dass ^ und $ fehlen)

Ich konnte das oben geschriebene im Eventmonitor nachvollziehen.
Ich muss auf Event triggern, denn wenn ich auf Status gehe, dann schaltet sw1 auch wenn t_pers am Beginn des Zeitfensters bereits "home" ist (hab ich schon alles probiert).

Da ich nicht so der Experte mit RegEx bin: kannst du mir bitte weiterhelfen (oder einen Link zum Nachlesen geben) was ich mit den fehlenden "^" und "$" auf sich hat ? Ich stehe da etwas verloren im Wald.

Am Ende des Tages möchte ich genau auf jenen Event triggern der generiert wird wenn ich t_pers von "absent" auf "home" schalte (aber nicht von "home" auf" "absent"). D.h., wenn initial t_pers "absent" ist und ich auf "home" schalte erhalte ich den Event
2020-12-17 12:34:57 ROOMMATE t_pers home

Und wenn ich dann zurück auf "absent" stelle sieht es so aus:
2020-12-17 12:35:09 ROOMMATE t_pers absent

Und genau auf den 1. Event möchte ich reagieren.

Danke



Edit: mit lesen und probieren hab ich'2 nun geschafft und die Lampe schaltet nur, wenn t_pers innerhalb des Zeitfensters von einem Status <> "home" auf "home" geht. das ist mir ganz einfach durch
([?13:08-14:45] and [t_pers:"^home"])
gelungen.
Ehrlich: verstanden hab ich es nicht. Ich habe lediglich die Bedeutung von "^"nachgelesen. Würde es wirklich gerne verstehen .....
Titel: Antw:Lampe mit DOIF und Anwesenheit schalten
Beitrag von: rabehd am 17 Dezember 2020, 12:42:11
Zitatweil Du auf Events triggerst.

Ich würde entweder auf einem genauen Event triggern (lass dir die Regex vom Eventmonitor generieren, Du wirst sehen, dass ^ und $ fehlen)

amenomade hat es doch genau geschrieben.
Einzahl (Event) - Mehrzahl (Events) beachten
Titel: Antw:Lampe mit DOIF und Anwesenheit schalten
Beitrag von: amenomade am 18 Dezember 2020, 00:44:35
Zitatwenn ich auf Status gehe, dann schaltet sw1 auch wenn t_pers am Beginn des Zeitfensters bereits "home" ist
Stimmt nicht. Mit "?" in [?12:08-14:45], triggert die Zeit nicht.


Zitatdie Lampe schaltet nur, wenn t_pers innerhalb des Zeitfensters von einem Status <> "home" auf "home" geht
Mit ([?13:08-14:45] and [t_pers:"^home"]) schaltet die Lampe wenn innerhalb des Zeitfensters  t_pers ein Event generiert, das mit "home" anfängt. Z.B.
2020-12-17 12:34:57 ROOMMATE t_pers home
aber auch
2020-12-17 12:34:57 ROOMMATE t_pers home WasAuchImmer Was Danach Kommt

Mit ([?13:08-14:45] and [t_pers:"^home$"]) schaltet die Lampe wenn innerhalb des Zeitfensters  t_pers ein Event generiert, das mit "home" anfängt und mit "home" endet.

Um ein DOIF zu kreieren, das auf einem bestimmten Event triggert, markiert man die ganze Zeile des Events im Eventmonitor und klickt man auf "Create/modify device" dann auf "DOIF" ind der Liste. Das habe ich gemeint mit "lass dir die Regex vom Eventmonitor generieren".

Mit DOIF ([?14:00-14:45] and [t_pers:presence] eq "home") (set sw1 on-till 23:45) DOELSE schaltet die Lampe wenn innerhalb des Zeitfensters das Reading presence vom Device t_pers auf "home" wechselt.