DOIF: Probleme mit dem attr wait

Begonnen von WhyTea, 26 April 2023, 10:29:38

Vorheriges Thema - Nächstes Thema

WhyTea

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

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

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 ...
)
...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

WhyTea

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)



Damian

Sleep solltest du im IF-Befehl immer mit einem Semikolon im Editor angeben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF