doif mit zusätzlicher IF im Ausführungsteil

Begonnen von bicmac, 05 Januar 2022, 17:36:29

Vorheriges Thema - Nächstes Thema

bicmac

Hi,
ich habe ein doif was mir die anzahl der offenen fenster et zusammenträgt. Ich muss dazu sagen ich bin totaler doif Anfänger und irgendwie erschliesst sich mir das ganze icht wirklich. Liegt aber sehr wahrscheinlich an mir :-P
Zeitgleich setzt es ein Reading im doif selber mit dem Status "open" oder "closed"
Das ganze klappt auch ohne probleme. Nun habe ich aber eigentlich nicht nur den status "open" und "closed" sondern zusätzlich den Status "tilted" den ein Fenster annehmen kann.
Ich wollte daher im ersten Teil des doif ein zusätzliches if einbauen um die bedinung innerhalb der ersten DOIF condition zu prüfen. Aber irgendwie aktualisiert er den Wert weder auf "opened" noch auf "tilted".

hier mal ein list des doif


Internals:
   CFGFN     
   DEF        ([#"fenster_eg_wz_.*_status$":state:"open.*|tilted"] > 0)
(
  set $SELF openWindowsCount [#"fenster_eg_wz_.*_status$":state:"open.*"],
  set $SELF notClosedWindowsCount {([#"fenster_eg_wz_.*_status$":state:"open.*"]+[#"fenster_eg_wz_.*_status$":state:"tilted"])},
  set $SELF tiltedWindowsCount [#"fenster_eg_wz_.*_status$":state:"tilted"],
  set $SELF closedWindowsCount [#"fenster_eg_wz_.*_status$":state:"closed"],
  set $SELF allWindowsCount [#"fenster_eg_wz_.*_status$":state:".*"],
IF ([#"fenster_eg_wz_.*_status$":state:"open.*"] > 0)
  (
  set $SELF openWindowsState opened
  )
  else
  (
   set $SELF openWindowsState tilted
  )
)
DOELSE
(
  set $SELF openWindowsCount 0,
  set $SELF notClosedWindowsCount 0,
  set $SELF tiltedWindowsCount 0,
  set $SELF closedWindowsCount [#"fenster_eg_wz_.*_status$":state:"closed"],
  set $SELF allWindowsCount [#"fenster_eg_wz_.*_status$":state:".*"],
  set $SELF openWindowsState closed
)
   DOIFDEV    ^global$|fenster_eg_wz_.*_status$
   FUUID      61d437df-f33f-34fb-4fac-7d1028259667396b
   MODEL      FHEM
   NAME       Monitoring_DOIF_Fenster_WZ_2
   NR         87098
   NTFY_ORDER 50-Monitoring_DOIF_Fenster_WZ_2
   STATE      open:0 <br> tilted:1 <br> closed:3 <br> gesamt:4 <br> status:closed
   TYPE       DOIF
   VERSION    25295 2021-12-04 18:13:39
   Helper:
     DBLOG:
       cmd:
         DBLogging:
           TIME       1641297887.63516
           VALUE      0
       mode:
         DBLogging:
           TIME       1641297887.63516
           VALUE      enabled
       state:
         DBLogging:
           TIME       1641297887.63516
           VALUE      initialized
   READINGS:
     2022-01-05 17:33:14   Device          fenster_eg_wz_dummy_status
     2022-01-05 17:33:14   allWindowsCount 4
     2022-01-05 17:33:14   closedWindowsCount 3
     2022-01-05 17:33:14   cmd             1
     2022-01-05 17:33:14   cmd_event       fenster_eg_wz_dummy_status
     2022-01-05 17:33:14   cmd_nr          1
     2022-01-05 17:33:14   error             IF ([#"fenster_eg_wz_.*_status$":state:"open.*"] > 0)   (    set Monitoring_DOIF_Fenster_WZ_2 openWindowsState opened   ): IF: unknown Device: #"fenster_eg_wz_.*_status$"    else   (    set Monitoring_DOIF_Fenster_WZ_2 openWindowsState tilted   ) : Unknown command else, try help.
     2022-01-05 17:33:03   mode            enabled
     2022-01-05 17:33:14   notClosedWindowsCount 1
     2022-01-05 17:33:14   openWindowsCount 0
     2022-01-05 17:29:26   openWindowsState closed
     2022-01-05 17:33:14   state           cmd_1
     2022-01-05 17:33:14   tiltedWindowsCount 1
   Regex:
     accu:
     collect:
     cond:
       :
         0:
           "fenster_eg_wz_.*_status$" fenster_eg_wz_.*_status$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::AggregateDoIf($hash,'#','fenster_eg_wz_.*_status$','state','"open.*|tilted"') > 0
   do:
     0:
       0             set Monitoring_DOIF_Fenster_WZ_2 openWindowsCount [#"fenster_eg_wz_.*_status$":state:"open.*"],   set Monitoring_DOIF_Fenster_WZ_2 notClosedWindowsCount {([#"fenster_eg_wz_.*_status$":state:"open.*"]+[#"fenster_eg_wz_.*_status$":state:"tilted"])},   set Monitoring_DOIF_Fenster_WZ_2 tiltedWindowsCount [#"fenster_eg_wz_.*_status$":state:"tilted"],   set Monitoring_DOIF_Fenster_WZ_2 closedWindowsCount [#"fenster_eg_wz_.*_status$":state:"closed"],   set Monitoring_DOIF_Fenster_WZ_2 allWindowsCount [#"fenster_eg_wz_.*_status$":state:".*"],  IF ([#"fenster_eg_wz_.*_status$":state:"open.*"] > 0)   (    set Monitoring_DOIF_Fenster_WZ_2 openWindowsState opened   )   else   (    set Monitoring_DOIF_Fenster_WZ_2 openWindowsState tilted   )
     1:
       0             set Monitoring_DOIF_Fenster_WZ_2 openWindowsCount 0,   set Monitoring_DOIF_Fenster_WZ_2 notClosedWindowsCount 0,   set Monitoring_DOIF_Fenster_WZ_2 tiltedWindowsCount 0,   set Monitoring_DOIF_Fenster_WZ_2 closedWindowsCount [#"fenster_eg_wz_.*_status$":state:"closed"],   set Monitoring_DOIF_Fenster_WZ_2 allWindowsCount [#"fenster_eg_wz_.*_status$":state:".*"],   set Monitoring_DOIF_Fenster_WZ_2 openWindowsState closed
   helper:
     DEVFILTER  ^global$|fenster_eg_wz_.*_status$
     NOTIFYDEV  global|.*fenster_eg_wz_.*_status
     event      tilted
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   fenster_eg_wz_dummy_status
     timerevent tilted
     triggerDev fenster_eg_wz_dummy_status
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: fenster_eg_wz_dummy_status
       error:   IF ([#"fenster_eg_wz_.*_status$":state:"open.*"] > 0)   (    set Monitoring_DOIF_Fenster_WZ_2 openWindowsState opened   ): IF: unknown Device: #"fenster_eg_wz_.*_status$"    else   (    set Monitoring_DOIF_Fenster_WZ_2 openWindowsState tilted   ) : Unknown command else, try help.
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: fenster_eg_wz_dummy_status
       error:   IF ([#"fenster_eg_wz_.*_status$":state:"open.*"] > 0)   (    set Monitoring_DOIF_Fenster_WZ_2 openWindowsState opened   ): IF: unknown Device: #"fenster_eg_wz_.*_status$"    else   (    set Monitoring_DOIF_Fenster_WZ_2 openWindowsState tilted   ) : Unknown command else, try help.
       state: cmd_1
     timerevents:
       tilted
       my_fensterstatus: tilted
     timereventsState:
       state: tilted
     triggerEvents:
       tilted
       my_fensterstatus: tilted
     triggerEventsState:
       state: tilted
   internals:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   alias      Status Fenster 2 (EG-WZ)
   do         always
   event-on-change-reading .*
   icon       helper_doif
   readingList openWindowsCount closedWindowsCount openWindowsState allWindowsCount tiltedWindowsCount notClosedWindowsCount
   room       SYSTEM->LOGIK->DOIF,ioBroker
   stateFormat open:openWindowsCount <br> tilted:tiltedWindowsCount <br> closed:closedWindowsCount <br> gesamt:allWindowsCount <br> status:openWindowsState
   verbose    5


Damian

IF ist ein eigener Befehl, dieser kennt die Aggregationsfunktionen nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

bicmac

mhhh ok. irgendwelche Idee wie ich alterntiv das in dem doif lösen kann? Ih habe schon probiert direkt die im Ausführungteil gesetzten Values im If wieder auszulesen. habe da aber wohl ein timingproblem das der wet noch nicht wirklich gesetzt ist zu dem zeitpunkt.
Hab auch probiert es über nur oif und doelseif zu lösen, aber da fehtl mir die idee für den trigger des doifs. Ich stehe grad echt auf dem schlauch :-(

Damian

Du kannst es im DOIF-Perl-Modus lösen:

DOIF {
if ([#"fenster_eg_wz_.*_status$":state:"open.*|tilted"] > 0) {

  set_Reading ("openWindowsCount",[?#"fenster_eg_wz_.*_status$":state:"open.*"]);
  set_Reading ...
  ...
  if ([?#"fenster_eg_wz_.*_status$":state:"open.*"] > 0) {
    set_Reading ("openWindowsState","opened");
  } else {
    set_Reading ("openWindowsState","titled");
  }
} else {
...


siehe Doku: https://wiki.fhem.de/wiki/DOIF/Perl-Modus

Du solltest beachten, dass du bei den weiteren Aggregationsabfragen mit dem Fragezeichen die Trigger rausnimmst und den Trigger nur bei der ersten Abfrage zulässt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

bicmac

danke.
jetzt scheint er den status zu setzen und ich entschuldige mich schonmal für die vielen dummen fragen. :-)
Nur wird es nun nicht automatisch aktualisiert sondern erst wenn ich einmal die seite neu lade. Auch scheint kein event oder ähnliches zu geben denn ich reiche das device auch an den IOBroker durch (der läuft als Visualisierungslayer) und dort wird der Wert nicht upgedated. Erst wenn ich in der FHEM Webansicht einmal neu lade.
Wie bekomme ich es denn hin das das doif quasi immer greift und sich updated sobald sich eines der fenster oder tuergriffe ändert.


Internals:
   CFGFN     
   DEF        {
if ([#"^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$":state:"open.*|tilted"] > 0) {

  set_Reading ("openWindowsCount",[?#"^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$":state:"open.*"]);
  set_Reading ("notClosedWindowsCount",[?#"^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$":state:"open.*|tilted"]);
  set_Reading ("tiltedWindowsCount",[?#"^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$":state:"tilted"]);
  set_Reading ("closedWindowsCount",[?#"^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$":state:"closed"]);
  set_Reading ("allWindowsCount",[?#"^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$":state:"opened|tilted|close.*"]);
  if ([?#"^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$":state:"open.*"] > 0) {
    set_Reading ("openWindowsState","opened");
  } else {
    set_Reading ("openWindowsState","tilted");
  }
} else {
  set_Reading ("openWindowsCount",[?#"^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$":state:"open.*"]);
  set_Reading ("notClosedWindowsCount",[?#"^ffenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$":state:"open.*|tilted"]);
  set_Reading ("tiltedWindowsCount",[?#"^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$":state:"titled"]);
  set_Reading ("closedWindowsCount",[?#"^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$":state:"tilted"]);
  set_Reading ("allWindowsCount",[?#"^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$":state:"open.*|titled|close.*"]);
  set_Reading ("openWindowsState","closed");
}
}
   DOIFDEV    ^global$|^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$
   FUUID      61d437df-f33f-34fb-4fac-7d1028259667396b
   MODEL      Perl
   NAME       Monitoring_DOIF_Fenster_WZ_2
   NR         87098
   NTFY_ORDER 50-Monitoring_DOIF_Fenster_WZ_2
   STATE      open:0 <br> tilted:1 <br> closed:5 <br> gesamt:6 <br> status:tilted
   TYPE       DOIF
   VERSION    25295 2021-12-04 18:13:39
   Helper:
     DBLOG:
       cmd:
         DBLogging:
           TIME       1641297887.63516
           VALUE      0
       mode:
         DBLogging:
           TIME       1641297887.63516
           VALUE      enabled
       state:
         DBLogging:
           TIME       1641297887.63516
           VALUE      initialized
   READINGS:
     2022-01-05 21:30:04   Device          fenster_eg_wz_dummy_status
     2022-01-05 21:30:04   allWindowsCount 6
     2022-01-05 21:30:04   block_01        executed
     2022-01-05 21:30:04   closedWindowsCount 5
     2022-01-05 21:26:09   mode            enabled
     2022-01-05 21:30:04   notClosedWindowsCount 1
     2022-01-05 21:30:04   openWindowsCount 0
     2022-01-05 21:30:04   openWindowsState tilted
     2022-01-05 21:26:09   state           initialized
     2022-01-05 21:30:04   tiltedWindowsCount 1
   Regex:
     accu:
     collect:
     cond:
       :
         0:
           "^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$" ^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0         
if (::AggregateDoIf($hash,'#','^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$','state','"open.*|tilted"') > 0) {

  set_Reading ("openWindowsCount",::AggregateDoIf($hash,'#','^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$','state','"open.*"'));
  set_Reading ("notClosedWindowsCount",::AggregateDoIf($hash,'#','^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$','state','"open.*|tilted"'));
  set_Reading ("tiltedWindowsCount",::AggregateDoIf($hash,'#','^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$','state','"tilted"'));
  set_Reading ("closedWindowsCount",::AggregateDoIf($hash,'#','^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$','state','"closed"'));
  set_Reading ("allWindowsCount",::AggregateDoIf($hash,'#','^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$','state','"opened|tilted|close.*"'));
  if (::AggregateDoIf($hash,'#','^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$','state','"open.*"') > 0) {
    set_Reading ("openWindowsState","opened");
  } else {
    set_Reading ("openWindowsState","tilted");
  }
} else {
  set_Reading ("openWindowsCount",::AggregateDoIf($hash,'#','^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$','state','"open.*"'));
  set_Reading ("notClosedWindowsCount",::AggregateDoIf($hash,'#','^ffenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$','state','"open.*|tilted"'));
  set_Reading ("tiltedWindowsCount",::AggregateDoIf($hash,'#','^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$','state','"titled"'));
  set_Reading ("closedWindowsCount",::AggregateDoIf($hash,'#','^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$','state','"tilted"'));
  set_Reading ("allWindowsCount",::AggregateDoIf($hash,'#','^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$','state','"open.*|titled|close.*"'));
  set_Reading ("openWindowsState","closed");
}

   helper:
     DEVFILTER  ^global$|^fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status$
     NOTIFYDEV  global|fenster_eg_wz_.*_status$|^tuer_eg_wz_.*_status
     event      closed
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev fenster_eg_wz_dummy_status
     triggerEvents:
       closed
       my_fensterstatus: closed
     triggerEventsState:
       state: closed
   internals:
   perlblock:
     0          block_01
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   alias      Status Fenster 2 (EG-WZ)
   do         always
   event-on-update-reading .*
   icon       helper_doif
   readingList openWindowsCount closedWindowsCount openWindowsState allWindowsCount tiltedWindowsCount notClosedWindowsCount
   room       SYSTEM->LOGIK->DOIF,ioBroker
   stateFormat open:openWindowsCount <br> tilted:tiltedWindowsCount <br> closed:closedWindowsCount <br> gesamt:allWindowsCount <br> status:openWindowsState
   verbose    5

Damian

Wie gut, dass ich die Doku aktualisiert habe ;) Hier kannst du nachlesen, wie du set_Reading mit einem Event nutzen kannst:

https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Reading_des_eigenen_DOIF-Devices_setzen:_set_Reading.28.29

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

bicmac

super danke :-) das war ja dann einfacher als gedacht. Jetzt scheint es zu gehen.