FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Christian80 am 13 November 2020, 16:12:07

Titel: [gelöst] offene Fenster zählen und auflisten
Beitrag von: Christian80 am 13 November 2020, 16:12:07
Hallo zusammen,

ich habe hier im Forum ein DOIF gefunden, welches offene Fenster zählt und habe es für mein Setup angepasst.


defmod d_FK_Anzahl DOIF ([#"Fensterkontakt_.*":state:"open"] > 0)\
(\
  set $SELF openWindowsCount [#"Fensterkontakt_.*":state:"open"],\
  set $SELF openWindowsState open\
)\
DOELSE\
(\
  set $SELF openWindowsCount 0,\
  set $SELF openWindowsState closed\
)
attr d_FK_Anzahl alias d_FK_Anzahl
attr d_FK_Anzahl do always
attr d_FK_Anzahl group Fensterkontakte
attr d_FK_Anzahl readingList openWindowsCount  openWindowsState
attr d_FK_Anzahl room Logik
attr d_FK_Anzahl stateFormat openWindowsState (openWindowsCount)

setstate d_FK_Anzahl open (1)
setstate d_FK_Anzahl 2020-11-13 16:02:02 Device Fensterkontakt_Wohnen1
setstate d_FK_Anzahl 2020-11-13 16:02:02 cmd 1
setstate d_FK_Anzahl 2020-11-13 16:02:02 cmd_event Fensterkontakt_Wohnen1
setstate d_FK_Anzahl 2020-11-13 16:02:02 cmd_nr 1
setstate d_FK_Anzahl 2020-09-05 11:12:44 mode enabled
setstate d_FK_Anzahl 2020-11-13 16:02:02 openWindowsCount 1
setstate d_FK_Anzahl 2020-11-13 16:02:02 openWindowsState open
setstate d_FK_Anzahl 2020-11-13 16:02:02 state cmd_1


Das funktioniert auch soweit.

Gibt es eine Möglichkeit die Namen aller offenen Fenster aufzulisten und in einem Reading zu schreiben?

Danke und schöne Grüße
Christian
Titel: Antw:offene Fenster zählen und auflisten
Beitrag von: Damian am 13 November 2020, 18:01:18
siehe:

https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Visualisierung:_offene_Fenster
Titel: Antw:offene Fenster zählen und auflisten
Beitrag von: xenos1984 am 13 November 2020, 18:04:43
Macht das nicht genau das Beispiel aus der CommandRef?

http://fhem.de/commandref_DE.html#DOIF_aggregation

define di_Fenster DOIF (["^Window:open"])
(push "Fenster $DEVICE wurde geöffnet. Es sind folgende Fenster offen: [@"^Window":state:"open"]")
DOELSEIF ([#"^Window:closed":state:"open"] == 0)
(push "alle Fenster geschlossen")

attr di_Fenster do always
attr di_Fenster cmdState [$SELF:Device] zuletzt geöffnet|alle geschlossen


Titel: Antw:offene Fenster zählen und auflisten
Beitrag von: Christian80 am 20 Dezember 2020, 13:12:26
Ich habe mir nun folgendes DOIF gebaut:


Internals:
   DEF        ([#"Fensterkontakt_.*":state:"open"] > 0)
(
  set $SELF openWindowsCount [#"Fensterkontakt_.*":state:"open"],
  set $SELF openWindowsState open
)
DOELSE
(
  set $SELF openWindowsCount 0,
  set $SELF openWindowsState closed
)
   DOIFDEV    ^global$|Fensterkontakt_.*
   FUUID      5f53445e-f23f-dffb-48d3-87603c
   MODEL      FHEM
   NAME       d_FK_Anzahl
   NR         273
   NTFY_ORDER 50-d_FK_Anzahl
   STATE      open (2)
   TYPE       DOIF
   VERSION    23235 2020-11-25 22:42:28
   CHANGED:
     windows: Fensterkontakt_Essen2 Fensterkontakt_Wohnen3
   CHANGEDWITHSTATE:
     windows: Fensterkontakt_Essen2 Fensterkontakt_Wohnen3
   DOIF_Readings:
     windows    ::AggregateDoIf($hash,'@as( )','Fensterkontakt_.*','state','"open"','"keine"')
   READINGS:
     2020-12-20 13:04:52   Device          Fensterkontakt_Essen2
     2020-12-20 13:04:52   cmd             1
     2020-12-20 13:04:52   cmd_event       Fensterkontakt_Essen2
     2020-12-20 13:04:52   cmd_nr          1
     2020-09-05 11:12:44   mode            enabled
     2020-12-20 13:04:52   openWindowsCount 2
     2020-12-20 13:04:52   openWindowsState open
     2020-12-20 13:04:52   room_FK         Fensterkontakt_Essen2 Fensterkontakt_Wohnen3
     2020-12-20 13:04:52   state           cmd_1
     2020-12-20 13:04:52   windows         Fensterkontakt_Essen2 Fensterkontakt_Wohnen3
   Regex:
     DOIF_Readings:
       :
         windows:
           "Fensterkontakt_.*" Fensterkontakt_.*
       d_FK_Anzahl:
     accu:
     cond:
       :
         0:
           "Fensterkontakt_.*" Fensterkontakt_.*
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::AggregateDoIf($hash,'#','Fensterkontakt_.*','state','"open"') > 0
   do:
     0:
       0             set d_FK_Anzahl openWindowsCount [#"Fensterkontakt_.*":state:"open"],   set d_FK_Anzahl openWindowsState open
     1:
       0             set d_FK_Anzahl openWindowsCount 0,   set d_FK_Anzahl openWindowsState closed
   helper:
     DEVFILTER  ^global$|Fensterkontakt_.*
     NOTIFYDEV  global|.*Fensterkontakt_.*.*
     event      open
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Fensterkontakt_Essen2
     timerevent open
     triggerDev Fensterkontakt_Essen2
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: Fensterkontakt_Essen2
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: Fensterkontakt_Essen2
       state: cmd_1
     timerevents:
       open
     timereventsState:
       state: open
     triggerEvents:
       open
     triggerEventsState:
       state: open
   internals:
   perlblock:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings windows:[@as( )"Fensterkontakt_.*":state:"open","keine"]
   alias      d_FK_Anzahl
   do         always
   group      Fensterkontakte
   readingList openWindowsCount  openWindowsState
   room       Logik
   stateFormat openWindowsState (openWindowsCount)
   userReadings room_FK {(ReadingsVal($name,"windows",""));;}


Zählen und Auflisten funktioniert nun.

Ich habe im Reading windows z.B folgenden Wert stehen: Fensterkontakt_Essen2 Fensterkontakt_Wohnen3

Kann ich das Reading mittels userReadings so bearbeiten, dass ich "Fensterkontakt_" entfernen kann?

Danke und schönen 4. Advent

Grüße
Christian
Titel: Antw:offene Fenster zählen und auflisten
Beitrag von: Damian am 20 Dezember 2020, 13:21:50
Teilausdrücke kann man nicht auslagern, aber du kannst ein DOIF_Reading anlegen, auf welches zu zugreifen kannst:

attr DOIF_Readings Fensteranzahl: [#"Fensterkontakt_.*":state:"open"]

Auf Fensteranzahl kannst du dann in DOIF überall zugreifen über:

[$SELF:Fensteranzahl]
Titel: Antw:offene Fenster zählen und auflisten
Beitrag von: Christian80 am 20 Dezember 2020, 13:56:07
Die Fensteranzahl habe ich bereits.

ich bräuchte ein Reading, welches anstelle von "Fensterkontakt_Essen2 Fensterkontakt_Wohnen3"  den Inhalt "Essen2 Wohnen3" besitzt.

Grüße
Christian
Titel: Antw:offene Fenster zählen und auflisten
Beitrag von: Sany am 22 Dezember 2020, 10:10:55
das kannst Du folgendermaßen lösen:

[@as(<br>)"Fensterkontakt_.*":state:"open"]

statt # nimmst Du @as(<br>)
@: Liste der Namen
a: verwende den alias (wenn gesetzt, hier kannst Du deine Essen2, Wohnen3 nutzen, wenn der alias im Device entsprechend gesetzt ist
s(<br>): schreibt eine Liste, also alle Einträge werden untereinander geschrieben. Kannst Du weglassen, dann stehts alles in einer Zeile.

und wie Damian es schon geschrieben hat würde ich hier auch DOIF_Readings verwenden (so habe ich das bei mir auch gelöst).


Viel Erfolg!
Titel: Antw:offene Fenster zählen und auflisten
Beitrag von: Christian80 am 22 Dezember 2020, 14:04:03
Ich danke euch für eure Tipps.

Der Ansatz mit dem "Alias" funktioniert für mich perfekt.

Danke und schöne Weihnachten.
Christian