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)
- Wenn t_pers um 14:00 nicht daheim (status "absent") ist wird sw1 nicht geschaltet (ist so gewünscht), und wenn t_pers vor 14:45 heim kommt (status geht von "absent" auf "home") schaltet sw1 (ist so gewünscht)
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
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"]
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.
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.
Was sagt denn ein List des DOIF, wenn es fälschlicherweise geschaltet hat?
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
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
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 .....
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
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.