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
siehe:
https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Visualisierung:_offene_Fenster
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
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
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]
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
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!
Ich danke euch für eure Tipps.
Der Ansatz mit dem "Alias" funktioniert für mich perfekt.
Danke und schöne Weihnachten.
Christian