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
IF ist ein eigener Befehl, dieser kennt die Aggregationsfunktionen nicht.
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 :-(
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.
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
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
super danke :-) das war ja dann einfacher als gedacht. Jetzt scheint es zu gehen.