[gelöst] offene Fenster zählen und auflisten

Begonnen von Christian80, 13 November 2020, 16:12:07

Vorheriges Thema - Nächstes Thema

Christian80

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

Damian

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

xenos1984

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



Christian80

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

Damian

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

Christian80

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

Sany

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!
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Christian80

Ich danke euch für eure Tipps.

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

Danke und schöne Weihnachten.
Christian