Hallo!
Ich habe ein recht simples DOIF welches mir sagt ob einer zu hause ist oder nicht...
DAs Abwesendsein soll 900sek verzögert werden. und ich dachte immer sobald in dieser zeit einer doch anwesend ist wird der timer gelöscht?
Hier das DOIF:
([DavidHandy] eq "absent" and [ChrissiHandy] eq "absent" and [?Haus] eq "present")
(set Haus absent)
DOELSEIF
([DavidHandy] eq "present" and [?Haus] eq "absent")
(set Haus present)
DOELSEIF
([ChrissiHandy] eq "present" and [?Haus] eq "absent")
(set Haus present)
Hier mein List wo man sieht das David_Handy present geworden ist während der Timer lief und dieser wurde nicht gelöscht.
Internals:
DEF ([DavidHandy] eq "absent" and [ChrissiHandy] eq "absent" and [?Haus] eq "present")
(set Haus absent)
DOELSEIF
([DavidHandy] eq "present" and [?Haus] eq "absent")
(set Haus present)
DOELSEIF
([ChrissiHandy] eq "present" and [?Haus] eq "absent")
(set Haus present)
FUUID 60172871-f33f-e7ed-cc03-dc921ad4b91a090c
FVERSION 98_DOIF.pm:0.256630/2022-02-09
MODEL FHEM
NAME DOIFPresence
NOTIFYDEV ChrissiHandy,global,DavidHandy
NR 68
NTFY_ORDER 50-DOIFPresence
STATE initialized
TYPE DOIF
VERSION 25663 2022-02-09 17:05:11
READINGS:
2022-03-27 08:41:36 Device DavidHandy
2022-03-27 08:30:54 cmd 0
2022-03-27 08:41:28 e_ChrissiHandy_STATE absent
2022-03-27 08:41:36 e_DavidHandy_STATE present
2022-03-27 08:30:54 mode enabled
2022-03-27 08:30:54 state initialized
2022-03-27 08:33:34 wait_timer 27.03.2022 08:43:34 cmd_1 DavidHandy
Regex:
accu:
collect:
cond:
ChrissiHandy:
0:
&STATE ^ChrissiHandy$
1:
2:
&STATE ^ChrissiHandy$
DavidHandy:
0:
&STATE ^DavidHandy$
1:
&STATE ^DavidHandy$
2:
attr:
cmdState:
wait:
0:
600
1:
0
2:
0
waitdel:
condition:
0 ::InternalDoIf($hash,'DavidHandy','STATE') eq "absent" and ::InternalDoIf($hash,'ChrissiHandy','STATE') eq "absent" and ::InternalDoIf($hash,'Haus','STATE') eq "present"
1 ::InternalDoIf($hash,'DavidHandy','STATE') eq "present" and ::InternalDoIf($hash,'Haus','STATE') eq "absent"
2 ::InternalDoIf($hash,'ChrissiHandy','STATE') eq "present" and ::InternalDoIf($hash,'Haus','STATE') eq "absent"
do:
0:
0 set Haus absent
1:
0 set Haus present
2:
0 set Haus present
3:
helper:
NOTIFYDEV ChrissiHandy,global,DavidHandy
event present,presence: present
globalinit 1
last_timer 0
sleepdevice DavidHandy
sleepsubtimer 0
sleeptimer 0
timerdev ChrissiHandy
timerevent absent,presence: absent
triggerDev DavidHandy
timerevents:
absent
presence: absent
timereventsState:
state: absent
presence: absent
triggerEvents:
present
presence: present
triggerEventsState:
state: present
presence: present
hmccu:
internals:
all DavidHandy:STATE ChrissiHandy:STATE Haus:STATE
readings:
trigger:
uiState:
uiTable:
Attributes:
DbLogExclude .*
do always
room DOIF,PRESENCE
wait 600:0:0
Was mache ich falsch? Was muss ich tun damit das Verzögerte Kommando doch nicht ausgeführt wird wenn eine von den beiden anderen Bedingungen wahr wird?
Ach mist... Ich sehe den Fehler... Meine Abfrege [?Haus] eq "absent" verhindert das löschen des Timers... Mist... ist ja klar weil es ja noch nicht absent ist solange der timer läuft...
Habe damit verhindern wollen das das cmd 2 oder 3 alle 30 Sekunden durchgeführt wird...
okay, fehler gefunden..
Aber eine Frage... WIe lege ich fest ich in diesem Fall das cmd 2 oder/und 3 ausgeführt werden NUR wenn ein Timer in diesem DOIF läuft... ???
Moin misux
versuch es mal so
([DavidHandy] eq "absent" and [ChrissiHandy] eq "absent" and [?Haus] eq "present")
()
(set Haus absent)
DOELSEIF
([DavidHandy] eq "present" and $cmd == 1.1)
(set Haus present)
DOELSEIF
([ChrissiHandy] eq "present" and $cmd == 1.1)
(set Haus present)
klappt leider nicht... er löscht so den Timer wieder nicht...
stimmt kann auch nicht.
Du musst Dein wait anpassen
0,600:0:0
Hi,
ich verstehe weder den Sinn von
and [?Haus] eq "present" noch von einem leeren Kommando
() Ich weiß auch nicht ob in dem Fall do always richtig ist?
Ich packe die Logik in eine Struktur und mache den wait Timer bei der einzelnen Person. Das "Haus" wie in deinem Fall ist wieder einfach eine Struktur aller Personen.
Sieht aufwendig aus, ist aus meiner Anfangszeit mit FHEM, läuft aber sehr flexibel und wartungsfreundlich. An ROOMMATE wollte ich nie ran ;)
- Mehrere Geräte können die Anwesenheit einer Person repräsentieren. st_Dev_Gast, Bei Gerätewechsel kommt das neue Gerät einfach in die Struktur.
- Es sind Aktionen pro Person present / absent möglich. Hier wird die Toleranz "mal kurz weg" eingebaut.
- Es sind Aktionen bei st_Bewohner present / absent möglich.
Mal mit Dummies zum testen/spielen:
defmod di_Dev_Gast DOIF ([st_Dev_Gast] eq "absent")(set PersonGast absent) DOELSEIF ([st_Dev_Gast] eq "present")(set PersonGast present)
attr di_Dev_Gast room Status
attr di_Dev_Gast wait 30
defmod PersonGast dummy
attr PersonGast userattr bewohner bewohner_map structexclude
attr PersonGast bewohner st_Bewohner
attr PersonGast devStateIcon present:10px-kreis-gruen absent:10px-kreis-rot
attr PersonGast event-on-change-reading state
attr PersonGast room Status
defmod st_Dev_Gast structure bewohner WL_Gast
attr st_Dev_Gast clientstate_behavior relative
attr st_Dev_Gast clientstate_priority present|1 absent|0
attr st_Dev_Gast event-on-change-reading state
attr st_Dev_Gast room Status
defmod WL_Gast dummy
attr WL_Gast userattr bewohner bewohner_map structexclude
attr WL_Gast devStateIcon present:10px-kreis-gruen absent:10px-kreis-rot
attr WL_Gast event-on-change-reading state
attr WL_Gast room Status
attr WL_Gast setList absent present
attr WL_Gast webCmd present:absent
Gruß Otto
Hab ja geschrieben das es Dumm war die Abfrage ?Haus zu setzen... Der Gedanke war das nicht alle 30sek den set befehl auszuführen wenn Haus present ist sondern nur ein mal.
Dennoch vielen Dank @Otto123 für dein Beispiel!
Naja, wie dem auch sei...
Das Teil mit attr wait 0,600:0:0 funktioniert hervorragent! Ist einfach und in einem DOIF übersichtlich... und erlaubt kurze abwesenheiten von 15 Minuten ohne das der abwesenheitsmodus gestaret wird.
"Haus" ist übrigens ein Dummy auf den viele andere Dinge triggern wenn er aktiv oder nicht aktiv ist...
Zitat von: Stelaku am 27 März 2022, 09:24:20
Moin misux
versuch es mal so
([DavidHandy] eq "absent" and [ChrissiHandy] eq "absent" and [?Haus] eq "present")
()
(set Haus absent)
DOELSEIF
([DavidHandy] eq "present" and $cmd == 1.1)
(set Haus present)
DOELSEIF
([ChrissiHandy] eq "present" and $cmd == 1.1)
(set Haus present)