Hallo.
Ich nutze DOIF für eine Anwesenheitserkennung.
Abhängig von verschiedenen Zuständen sollen auch verschiedene Dinge passieren.
Das funktioniert auch wunderbar.
Um eine saubere Abfolge zu gewährleisten an einigen Stellen kurze Pause konfigurieren.
Das versuche ich mit dem Attr wait.
Hier ein List von dem Device:
Internals:
CFGFN /var/fhem/FHEM/anwesenheitserkennung.cfg
DEF ([zuhause_schalter] eq "on" and [zuhause_schalter:state:sec]>10) (
{Log 3, "zuhause_schalter on"})
(set zuhause:FILTER=STATE!=on on)
(set EG_WZ_shellyplugs:FILTER=STATE!=on on)
(set EG_WZ_HUEBridge:FILTER=STATE!=active active)
(set wol_VUPlus:FILTER=STATE!=on on)
DOELSE ({Log 3, "zuhause_schalter off"},
IF ([PC_Daniel] ne "absent") (
{Log 3, "Daniels PC ist noch an!"},
set TabletEG_Fully speak 'Daniels PC ist noch an!',
set zuhause_schalter:FILTER=STATE!=on on
),
IF ([PC_Nadine] ne "absent") (
{Log 3, "Nadines PC ist noch an!"},
set TabletEG_Fully speak 'Nadiens PC ist noch an!',
set zuhause_schalter:FILTER=STATE!=on on
),
IF ([KG_Tueren_und_Fenster] ne "closed") (
{Log 3, "Im Keller ist noch eine Tür oder ein Fenster offen!"},
set zuhause_schalter:FILTER=STATE!=on on,
set TabletEG_Fully speak 'Bitte die Fenster und Türen im Keller überprüfen!',
IF ([Anwesend_Daniel] eq "on") (
set pushmsg msg 'Zuhause' 'Im Keller ist noch eine Tür oder ein Fenster offen!' 'Apparat' 1 'siren',
),
IF ([Anwesend_Nadine] eq "on") (
set pushmsg msg 'Zuhause' 'Im Keller ist noch eine Tür oder ein Fenster offen!' 'NaddelsIPhone' 1 'siren',
)
),
IF ([EG_Tueren_und_Fenster_o_Eingang] ne "closed") (
{Log 3, "Im Erdgeschoss ist noch eine Tür oder ein Fenster offen!"},
set TabletEG_Fully speak 'Bitte die Fenster und Türen im Erdgeschoss überprüfen!',
set zuhause_schalter:FILTER=STATE!=on on,
IF ([Anwesend_Daniel] eq "on") (
set pushmsg msg 'Zuhause' 'Im Erdgeschoss ist noch eine Tür oder ein Fenster offen!' 'Apparat' 1 'siren',
),
IF ([Anwesend_Nadine] eq "on") (
set pushmsg msg 'Zuhause' 'Im Erdgeschoss ist noch eine Tür oder ein Fenster offen!' 'NaddelsIPhone' 1 'siren',
)
),
IF ([OG1_Tueren_und_Fenster] ne "closed") (
{Log 3, "Das Flurfenster Im OG1 ist noch offen!"},
set TabletEG_Fully speak 'Bitte die Fenster und Türen im ersten Obergeschoss überprüfen!',
set zuhause_schalter:FILTER=STATE!=on on,
IF ([Anwesend_Daniel] eq "on") (
set pushmsg msg 'Zuhause' 'Im ersten Obergeschoss ist noch ein Fenster offen!' 'Apparat' 1 'siren'
),
IF ([Anwesend_Nadine] eq "on") (
set pushmsg msg 'Zuhause' 'Im ersten Obergeschoss ist noch ein Fenster offen!' 'NaddelsIPhone' 1 'siren'
)
),
IF ([OG2_Tueren_und_Fenster] ne "closed") (
{Log 3, "Ein Fenster im OG2 ist noch offen!"},
set TabletEG_Fully speak 'Bitte die Fenster und Türen im zweiten Obergeschoss überprüfen!',
set zuhause_schalter:FILTER=STATE!=on on,
IF ([Anwesend_Daniel] eq "on") (
set pushmsg msg 'Zuhause' 'Im 2. Obergeschoss ist noch ein Fenster offen!' 'Apparat' 1 'siren'
),
IF ([Anwesend_Nadine] eq "on") (
set pushmsg msg 'Zuhause' 'Im 2. Obergeschoss ist noch ein Fenster offen!' 'NaddelsIPhone' 1 'siren'
)
),
IF ([PC_Daniel] eq "absent" and [PC_Nadine] eq "absent" and [KG_Tueren_und_Fenster] eq "closed" and [EG_Tueren_und_Fenster_o_Eingang] eq "closed" and [OG1_Tueren_und_Fenster] eq "closed" and [OG2_Tueren_und_Fenster] eq "closed") (
{Log 3, "Auf Wiedersehen!"},
set zuhause:FILTER=STATE!=off off,
set TabletEG_Fully speak 'Auf Wiedersehen!',
set KG_BZ_Lichtschalter:FILTER=STATE!=off off,
set EG_WZ_Terrassenlicht:FILTER=STATE!=off off,
set HUEGroup0 off,
set EG_WZ_HUEBridge:FILTER=STATE!=inactive inactive,
set EG_WZ_AV_Receiver:FILTER=STATE!=off off,
set wol_VUPlus:FILTER=STATE!=off off,
set EG_WZ_shellyplugs:FILTER=STATE!=off off)
)
FUUID 5fda260f-f33f-a5a6-17b7-dfd9ef2090390916
MODEL FHEM
NAME di.Zuhause_schalter
NOTIFYDEV zuhause_schalter,global
NR 1376
NTFY_ORDER 50-di.Zuhause_schalter
STATE cmd_2
TYPE DOIF
VERSION 27298 2023-03-05 15:15:00
eventCount 82
READINGS:
2023-04-26 07:43:11 Device zuhause_schalter
2023-04-26 07:43:16 cmd 2
2023-04-26 07:43:16 cmd_event zuhause_schalter
2023-04-26 07:43:16 cmd_nr 2
2023-04-26 07:43:11 e_zuhause_schalter_STATE off
2023-04-26 07:43:11 e_zuhause_schalter_state off
2020-12-16 16:22:27 last_cmd initialized
2023-04-25 14:25:18 mode enabled
2023-04-26 07:43:16 state cmd_2
2023-04-20 12:25:38 wait_timer no timer
Regex:
accu:
bar:
barAvg:
collect:
cond:
zuhause_schalter:
0:
&STATE ^zuhause_schalter$
state ^zuhause_schalter$:^state:
attr:
cmdState:
wait:
0:
0
0
0
120
0
1:
0
10:
0
0
0
11:
0
12:
0
13:
0
0
0
14:
0
15:
0
16:
0
0
0
0
0
0
10
0
0
600
2:
0
0
0
3:
0
0
0
4:
0
0
0
5:
0
6:
0
7:
0
0
0
8:
0
9:
0
waitdel:
condition:
0 ::InternalDoIf($hash,'zuhause_schalter','STATE') eq "on" and ::ReadingSecDoIf('zuhause_schalter','state')>10
do:
0:
0 {Log 3, "zuhause_schalter on"}
1 set zuhause:FILTER=STATE!=on on
2 set EG_WZ_shellyplugs:FILTER=STATE!=on on
3 set EG_WZ_HUEBridge:FILTER=STATE!=active active
4 set wol_VUPlus:FILTER=STATE!=on on
1:
0 {Log 3, "zuhause_schalter off"}, IF ([PC_Daniel] ne "absent") ( {Log 3, "Daniels PC ist noch an!"}, set TabletEG_Fully speak 'Daniels PC ist noch an!', set zuhause_schalter:FILTER=STATE!=on on ), IF ([PC_Nadine] ne "absent") ( {Log 3, "Nadines PC ist noch an!"}, set TabletEG_Fully speak 'Nadiens PC ist noch an!', set zuhause_schalter:FILTER=STATE!=on on ), IF ([KG_Tueren_und_Fenster] ne "closed") ( {Log 3, "Im Keller ist noch eine Tür oder ein Fenster offen!"}, set zuhause_schalter:FILTER=STATE!=on on, set TabletEG_Fully speak 'Bitte die Fenster und Türen im Keller überprüfen!', IF ([Anwesend_Daniel] eq "on") ( set pushmsg msg 'Zuhause' 'Im Keller ist noch eine Tür oder ein Fenster offen!' 'Apparat' 1 'siren', ), IF ([Anwesend_Nadine] eq "on") ( set pushmsg msg 'Zuhause' 'Im Keller ist noch eine Tür oder ein Fenster offen!' 'NaddelsIPhone' 1 'siren', ) ), IF ([EG_Tueren_und_Fenster_o_Eingang] ne "closed") ( {Log 3, "Im Erdgeschoss ist noch eine Tür oder ein Fenster offen!"}, set TabletEG_Fully speak 'Bitte die Fenster und Türen im Erdgeschoss überprüfen!', set zuhause_schalter:FILTER=STATE!=on on, IF ([Anwesend_Daniel] eq "on") ( set pushmsg msg 'Zuhause' 'Im Erdgeschoss ist noch eine Tür oder ein Fenster offen!' 'Apparat' 1 'siren', ), IF ([Anwesend_Nadine] eq "on") ( set pushmsg msg 'Zuhause' 'Im Erdgeschoss ist noch eine Tür oder ein Fenster offen!' 'NaddelsIPhone' 1 'siren', ) ), IF ([OG1_Tueren_und_Fenster] ne "closed") ( {Log 3, "Das Flurfenster Im OG1 ist noch offen!"}, set TabletEG_Fully speak 'Bitte die Fenster und Türen im ersten Obergeschoss überprüfen!', set zuhause_schalter:FILTER=STATE!=on on, IF ([Anwesend_Daniel] eq "on") ( set pushmsg msg 'Zuhause' 'Im ersten Obergeschoss ist noch ein Fenster offen!' 'Apparat' 1 'siren' ), IF ([Anwesend_Nadine] eq "on") ( set pushmsg msg 'Zuhause' 'Im ersten Obergeschoss ist noch ein Fenster offen!' 'NaddelsIPhone' 1 'siren' ) ), IF ([OG2_Tueren_und_Fenster] ne "closed") ( {Log 3, "Ein Fenster im OG2 ist noch offen!"}, set TabletEG_Fully speak 'Bitte die Fenster und Türen im zweiten Obergeschoss überprüfen!', set zuhause_schalter:FILTER=STATE!=on on, IF ([Anwesend_Daniel] eq "on") ( set pushmsg msg 'Zuhause' 'Im 2. Obergeschoss ist noch ein Fenster offen!' 'Apparat' 1 'siren' ), IF ([Anwesend_Nadine] eq "on") ( set pushmsg msg 'Zuhause' 'Im 2. Obergeschoss ist noch ein Fenster offen!' 'NaddelsIPhone' 1 'siren' ) ), IF ([PC_Daniel] eq "absent" and [PC_Nadine] eq "absent" and [KG_Tueren_und_Fenster] eq "closed" and [EG_Tueren_und_Fenster_o_Eingang] eq "closed" and [OG1_Tueren_und_Fenster] eq "closed" and [OG2_Tueren_und_Fenster] eq "closed") ( {Log 3, "Auf Wiedersehen!"}, set zuhause:FILTER=STATE!=off off, set TabletEG_Fully speak 'Auf Wiedersehen!', set KG_BZ_Lichtschalter:FILTER=STATE!=off off, set EG_WZ_Terrassenlicht:FILTER=STATE!=off off, set HUEGroup0 off, set EG_WZ_HUEBridge:FILTER=STATE!=inactive inactive, set EG_WZ_AV_Receiver:FILTER=STATE!=off off, set wol_VUPlus:FILTER=STATE!=off off, set EG_WZ_shellyplugs:FILTER=STATE!=off off)
helper:
NOTIFYDEV zuhause_schalter,global
event off
globalinit 1
last_timer 0
sleeptimer -1
timerdev zuhause_schalter
timerevent off
triggerDev zuhause_schalter
timerevents:
off
timereventsState:
state: off
triggerEvents:
off
triggerEventsState:
state: off
hmccu:
internals:
all zuhause_schalter:STATE
readings:
all zuhause_schalter:state
trigger:
uiState:
uiTable:
Attributes:
DbLogExclude .*
room Zentralsysteme->Anwesenheitserk.
wait 0,0,0,120,0:0:0,0,0:0,0,0:0,0,0:0:0:0,0,0:0:0:0,0,0:0:0:0,0,0:0:0:0,0,0,0,0,0,10,0,0,600
Irgend etwas muss ich falsch verstanden oder übersehen haben da leider keine Verzögerung stattfindet.
Wie gesagt der reine Ablauf des DOIF funktioniert es wird nur nichts verzögert.
Ich hoffe einer von Euch kann mir sagen was ich übersehe.
Gruß
Daniel
Hallo Daniel,
Du hast Block und Befehlsfolge nicht verstanden. ;)
https://fhem.de/commandref_modular_DE.html#DOIF_wait
Soweit ich sehe hast Du zwei Blöcke: DOIF () () DOELSE ()
Dazwischen gehört bei wait ein :
In Deinem wait Attribute sehe ich viel mehr vermeintliche Blöcke.
Hinweis: IF hat mit DOIF nichts zu tun, ist ein separater FHEM Befehl!
Gruß Otto
Befehlssequenzen, die durch wait innerhalb eines DOIF-Zweiges verzögert werden sollen, werden in runde Klammern gesetzt, sie werden nicht durch Komma getrennt.
Bei dir dann z. B.
...
DOELSE
({Log 3, "zuhause_schalter off"})
(IF ([PC_Daniel] ne "absent") (
{Log 3, "Daniels PC ist noch an!"},
set TabletEG_Fully speak 'Daniels PC ist noch an!',
set zuhause_schalter:FILTER=STATE!=on on)
)
(IF ...
)
...
Zitat von: Otto123 am 26 April 2023, 11:32:43Hallo Daniel,
Du hast Block und Befehlsfolge nicht verstanden. ;)
https://fhem.de/commandref_modular_DE.html#DOIF_wait
Soweit ich sehe hast Du zwei Blöcke: DOIF () () DOELSE ()
Dazwischen gehört bei wait ein :
In Deinem wait Attribute sehe ich viel mehr vermeintliche Blöcke.
Hinweis: IF hat mit DOIF nichts zu tun, ist ein separater FHEM Befehl!
Gruß Otto
Hallo Otto.
Hallo Damian.
Danke für die schnellen Antworten!
Okay wenn ich das jetzt richtig verstehe müsste das attr dann so aussehen.
attr di.Zuhause_schalter wait 0,0,0,120,0:0
Und innerhalb von den IF Abfragen arbeite ich dann mit "sleep"?
Aber wie ist da denn dann der richtige Syntax?
Bsp1: IF ([a] ne "absend") (set 1 on, sleep 3,set 2 on)
oder
Bsp2 IF ([a] ne "absend") (set 1 on;; sleep 3;; set 2 on)
Sleep solltest du im IF-Befehl immer mit einem Semikolon im Editor angeben.