Frage: doif sofort aktualisieren + nach X Minuten ein Set ausführen.

Begonnen von bicmac, 27 Oktober 2020, 10:01:25

Vorheriges Thema - Nächstes Thema

bicmac

Hallo,
ich nutze momentan folgenden doof der mir den Status meiner Fenster im Erdgeschoss nennt.


Internals:
   CFGFN     
   DEF        ([#"fenster_eg_.*_status$":state:"open.*|tilted"] > 0)
(
  set $SELF openWindowsCount [#"fenster_eg_.*_status$":state:"open.*|tilted"],
  set $SELF closedWindowsCount [#"fenster_eg_.*_status$":state:"closed"],
  set $SELF allWindowsCount [#"fenster_eg_.*_status$":state:".*"],
  set $SELF openWindowsState "not-closed"
)
DOELSE
(
  set $SELF openWindowsCount 0,
  set $SELF closedWindowsCount [#"fenster_eg_.*_status$":state:"closed"],
  set $SELF openWindowsState closed,
  set $SELF allWindowsCount [#"fenster_eg_.*_status$":state:".*"],
)
   DOIFDEV    ^global$|fenster_eg_.*_status$
   FUUID      5f95ac63-f33f-34fb-48d8-a17c4d0987a6977c
   MODEL      FHEM
   NAME       Monitoring.DOIF.Fenster
   NR         2897
   NTFY_ORDER 50-Monitoring.DOIF.Fenster
   STATE      open:0 <br> closed:4 <br> gesamt:4
   TYPE       DOIF
   VERSION    22913 2020-10-04 21:46:02
   Helper:
     DBLOG:
       cmd:
         DBLogging:
           TIME       1603644515.92808
           VALUE      0
       mode:
         DBLogging:
           TIME       1603644515.92808
           VALUE      enabled
       state:
         DBLogging:
           TIME       1603644515.92808
           VALUE      initialized
   OLDREADINGS:
   READINGS:
     2020-10-27 08:35:31   Device          fenster_eg_kz_strasse_status
     2020-10-27 09:47:40   allWindowsCount 4
     2020-10-27 09:47:40   closedWindowsCount 4
     2020-10-27 09:47:40   cmd             2
     2020-10-27 09:47:40   cmd_event       Monitoring.DOIF.Fenster
     2020-10-27 09:47:40   cmd_nr          2
     2020-10-26 10:17:35   mode            enabled
     2020-10-27 09:47:40   openWindowsCount 0
     2020-10-27 09:47:40   openWindowsState closed
     2020-10-27 09:47:40   state           cmd_2
   Regex:
     accu:
     cond:
       :
         0:
           "fenster_eg_.*_status$" fenster_eg_.*_status$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::AggregateDoIf($hash,'#','fenster_eg_.*_status$','state','"open.*|tilted"') > 0
   do:
     0:
       0             set Monitoring.DOIF.Fenster openWindowsCount [#"fenster_eg_.*_status$":state:"open.*|tilted"],   set Monitoring.DOIF.Fenster closedWindowsCount [#"fenster_eg_.*_status$":state:"closed"],   set Monitoring.DOIF.Fenster allWindowsCount [#"fenster_eg_.*_status$":state:".*"],   set Monitoring.DOIF.Fenster openWindowsState "not-closed"
     1:
       0             set Monitoring.DOIF.Fenster openWindowsCount 0,   set Monitoring.DOIF.Fenster closedWindowsCount [#"fenster_eg_.*_status$":state:"closed"],   set Monitoring.DOIF.Fenster openWindowsState closed,   set Monitoring.DOIF.Fenster allWindowsCount [#"fenster_eg_.*_status$":state:".*"],
   helper:
     DEVFILTER  ^global$|fenster_eg_.*_status$
     NOTIFYDEV  global|.*fenster_eg_.*_status
     event      closed
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   
     timerevent closed
     timerevents
     timereventsState
     triggerDev
     DOIF_eventa:
       cmd_nr: 2
       cmd: 2
       cmd_event: Monitoring.DOIF.Fenster
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: Monitoring.DOIF.Fenster
       state: cmd_2
   internals:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   alias      Status Fenster (EG)
   do         always
   event-on-change-reading .*
   icon       helper_doif
   readingList openWindowsCount closedWindowsCount openWindowsState allWindowsCount
   room       SYSTEM->LOGIK->DOIF
   stateFormat open:openWindowsCount <br> closed:closedWindowsCount <br> gesamt:allWindowsCount


Nun würde ich das ganze gern so erweitern das er zusätzlich wenn irgendein Fenster geöffnet öde gekippt ist er nach 2 Minuten ein Set Befehl auf ein anderes Device ausführt. Falls in den X Minuten Wartezeit oder später wieder alle Fenster geschlossen werden soll wieder ein anderer "set" Befehl ausgeführt werden.
Die Readings im Doif bezüglich der geöffneten / geschlossenen Fenster sollen jedoch immer sofort aktualisiert werden.
Geht das überhaupt im selben doof oder muss ich dafür ein zweites doif nehmen.

Damian

Dafür gibt es das wait-Attribut:

DOIF (...)
(set sofort irgendetwas)
(set später irgendetwas)
DOELSE ...
wait 0,120
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

bicmac

Zitat von: Damian am 27 Oktober 2020, 14:54:04
Dafür gibt es das wait-Attribut:

DOIF (...)
(set sofort irgendetwas)
(set später irgendetwas)
DOELSE ...
wait 0,120


Wie genau sähe das dann in meinem Beispiel aus?
Ich habe ja schon quasi eine Fallunterscheidung drinnen die auch immer sofort gemacht werden muss. Es soll halt nur zusätzlich im ersten fall noch ein zusätzlicher Set gemacht werden. Dieser aber erst nach einer Warte Zeit.
Kannst Du mir das mal beispielhaft mit meinem doif erklären so das ich es als doif DAU auch verstehe?

bicmac

ich hab es jetzt mit einem 2. doif gelöst was den status vom ersten überwacht. im 2. hab ich dann mit dem wait attribut auch die verzögerung eingebaut.