Hallo,
ich habe ein generalisiertes Device (DOIF), in dem ich von verschiedenen Sensoren Werte aggregiere. Nach meinem Verständnis werden immer dann, wenn ein Sensor einen Wert ändert (oder wenn das generalisierte DOIF abgefragt wird), die Werte für bspw. min, max und average berechnet aus den Readings aller Devices / Sensoren, auf die die Bedingung zutrifft.
Bedeutet: angenommen, ich habe drei Sensoren, von denen nun einer out of service geht, dann wird trotzdem weiterhin aus den Werten von allen drei Sensoren Min, Max und Durchschnitt berechnet, auch wenn die Werte des einen Sensors schon ewig alt sind.
Ist das so? Besteht eine Möglichkeit, das Minimal- und Maximal-Alter von Werten (Readings), die zur Berechnung herangezogen werden, festzulegen? Wenn nein, wäre das was für's Anforderungsmanagement :) ?
Zitat von: Ralli am 30 September 2019, 15:14:21
Hallo,
ich habe ein generalisiertes Device (DOIF), in dem ich von verschiedenen Sensoren Werte aggregiere. Nach meinem Verständnis werden immer dann, wenn ein Sensor einen Wert ändert (oder wenn das generalisierte DOIF abgefragt wird), die Werte für bspw. min, max und average berechnet aus den Readings aller Devices / Sensoren, auf die die Bedingung zutrifft.
Bedeutet: angenommen, ich habe drei Sensoren, von denen nun einer out of service geht, dann wird trotzdem weiterhin aus den Werten von allen drei Sensoren Min, Max und Durchschnitt berechnet, auch wenn die Werte des einen Sensors schon ewig alt sind.
Ist das so? Besteht eine Möglichkeit, das Minimal- und Maximal-Alter von Werten (Readings), die zur Berechnung herangezogen werden, festzulegen? Wenn nein, wäre das was für's Anforderungsmanagement :) ?
Ich gehe davon aus, dass du die Aggregationsfunktionen https://fhem.de/commandref_DE.html#DOIF_aggregation meinst. Bei diesen kannst du beliebige Perlabfragen definieren, insbesondere auch das Alter der Readings abfragen.
Ok, danke.
Zitat von: Ralli am 30 September 2019, 16:47:48
Ok, danke.
Und so wird es definiert:
[?#min"":temperature:ReadingsAge($name,"temperature",0) < 600]
Minimale Temperatur aller Readings "temperature" im System, deren Alter unter 10 Minuten ist.
Bemerkung: Aggregationsfunktionen, die alle Geräte im System überprüfen sollen (hier Angaben:""), sollten nur mit Fragezeichen abgefragt werden, da sie sonst das System lahmlegen können, weil sie sonst auf alle Events reagieren.
Damian, ich ziehe den Hut. Vielen Dank!
Allerdings passt das nicht ganz für meinen Anwendungsfall. Wenn ich es richtig verstanden habe, ist das, was du mir geschrieben hast, für den Bedingungsteil gedacht. Ich habe allerdings das folgende DOIF für ein generisches Device definiert:
def GEN_Aussensensor DOIF ##
attr GEN_Aussensensor event_Readings
LUMINOSITY:[#max:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness]
Kann ich das da auch irgendwie unterbringen?
Zitat von: Ralli am 30 September 2019, 19:40:42
Damian, ich ziehe den Hut. Vielen Dank!
Allerdings passt das nicht ganz für meinen Anwendungsfall. Wenn ich es richtig verstanden habe, ist das, was du mir geschrieben hast, für den Bedingungsteil gedacht. Ich habe allerdings das folgende DOIF für ein generisches Device definiert:
def GEN_Aussensensor DOIF ##
attr GEN_Aussensensor event_Readings
LUMINOSITY:[#max:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness]
Kann ich das da auch irgendwie unterbringen?
Das ist doch das Gleiche in Grün: Die Bedingung kommt doch erst nach der Readingangabe:
LUMINOSITY:[#max:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness:ReadingsAge($name,"brightness",0) < 600]
Das hatte ich genau so probiert, da kommt 0 raus, obwohl das nicht der Fall sein dürfte.
Zitat von: Ralli am 01 Oktober 2019, 05:51:37
Das hatte ich genau so probiert, da kommt 0 raus, obwohl das nicht der Fall sein dürfte.
Poste mal list-Output von GEN_Aussensensor.
Du kannst statt # auch @ angeben, dann kannst du sehen, welche Geräte gefunden wurden.
Vielen Dank - Murphys Gesetz, nun klappt's :).
Trotzdem hier mal ein list:
Internals:
CFGFN
CHANGED
DEF ##
DOIFDEV ^global$|((?!test).)*_BW_aussen($|_Terrasse$)|((?!test).)*_BW_aussen($|_Terrasse$)|((?!test).)*_BW_aussen($|_Terrasse$)|((?!test).)*_BW_aussen($|_Terrasse$)
FUUID 5d923bfb-f33f-f7fe-9491-d409d4bf6da00523
MODEL FHEM
NAME GEN_Aussensensor
NR 3130
NTFY_ORDER 50-GEN_Aussensensor
STATE T: 15.0 L: 178.0 P: 0.0
TYPE DOIF
VERSION 20268 2019-09-28 21:00:39
Helper:
DBLOG:
AVR_BRIGHTNESS:
Eventlog:
TIME 1569864729.06499
VALUE 96
AVR_LUMINOSITY:
Eventlog:
TIME 1569917725.36824
VALUE 176
AVR_TEMP:
Eventlog:
TIME 1569864699.68118
VALUE 24
DEV_LUMINOSITY:
Eventlog:
TIME 1569917475.3549
VALUE ANB_BW_aussen,ANB_BW_aussen_Terrasse,FL_BW_aussen
LUMINOSITY:
Eventlog:
TIME 1569919087.81418
VALUE 178
MAX_BRIGHTNESS:
Eventlog:
TIME 1569864729.06193
VALUE 102
MAX_LUMINOSITY:
Eventlog:
TIME 1569918744.61057
VALUE 196
MAX_TEMP:
Eventlog:
TIME 1569864699.68362
VALUE 24
MIN_BRIGHTNESS:
Eventlog:
TIME 1569864729.06356
VALUE 87
MIN_LUMINOSITY:
Eventlog:
TIME 1569917813.83516
VALUE 163
MIN_TEMP:
Eventlog:
TIME 1569864699.68485
VALUE 24
TEMPERATURE:
Eventlog:
TIME 1569917258.09122
VALUE 15
T_LUMINOSITY:
Eventlog:
TIME 1569915485.52033
VALUE 188
cmd:
Eventlog:
TIME 1569864699.66695
VALUE 0
mode:
Eventlog:
TIME 1569864699.66695
VALUE enabled
state:
Eventlog:
TIME 1569864699.66695
VALUE initialized
OLDREADINGS:
READINGS:
2019-10-01 10:38:07 DEV_LUMINOSITY ANB_BW_aussen,ANB_BW_aussen_Terrasse,FL_BW_aussen
2019-10-01 10:38:07 LUMINOSITY 178
2019-10-01 10:38:07 MAX_LUMINOSITY 196
2019-10-01 10:38:07 MIN_LUMINOSITY 163
2019-10-01 10:16:53 TEMPERATURE 15
2019-09-30 19:31:39 cmd 0
2019-09-30 19:31:39 mode enabled
2019-09-30 19:31:39 state initialized
Regex:
accu:
event_Readings:
:
DEV_LUMINOSITY:
"((?!test).)*_BW_aussen($|_Terrasse$):brightness" ((?!test).)*_BW_aussen($|_Terrasse$):brightness
LUMINOSITY:
"((?!test).)*_BW_aussen($|_Terrasse$):brightness" ((?!test).)*_BW_aussen($|_Terrasse$):brightness
MAX_LUMINOSITY:
"((?!test).)*_BW_aussen($|_Terrasse$):brightness" ((?!test).)*_BW_aussen($|_Terrasse$):brightness
MIN_LUMINOSITY:
"((?!test).)*_BW_aussen($|_Terrasse$):brightness" ((?!test).)*_BW_aussen($|_Terrasse$):brightness
condition:
do:
0:
event_Readings:
DEV_LUMINOSITY ::AggregateDoIf($hash,'@','((?!test).)*_BW_aussen($|_Terrasse$)','brightness','ReadingsAge($name,"brightness",0) < 1800')
LUMINOSITY ::AggregateDoIf($hash,'#average:d0:','((?!test).)*_BW_aussen($|_Terrasse$)','brightness','ReadingsAge($name,"brightness",0) < 1800')
MAX_LUMINOSITY ::AggregateDoIf($hash,'#max:d0:','((?!test).)*_BW_aussen($|_Terrasse$)','brightness','ReadingsAge($name,"brightness",0) < 1800')
MIN_LUMINOSITY ::AggregateDoIf($hash,'#min:d0:','((?!test).)*_BW_aussen($|_Terrasse$)','brightness','ReadingsAge($name,"brightness",0) < 1800')
TEMPERATURE (15)
helper:
DEVFILTER ^global$|((?!test).)*_BW_aussen($|_Terrasse$)|((?!test).)*_BW_aussen($|_Terrasse$)|((?!test).)*_BW_aussen($|_Terrasse$)|((?!test).)*_BW_aussen($|_Terrasse$)
NOTIFYDEV global|.*((?!test).)*_BW_aussen($|_Terrasse$).*|.*((?!test).)*_BW_aussen($|_Terrasse$).*|.*((?!test).)*_BW_aussen($|_Terrasse$).*|.*((?!test).)*_BW_aussen($|_Terrasse$).*
event brightness: 196
globalinit 1
last_timer 0
sleeptimer -1
triggerDev FL_BW_aussen
triggerEvents:
brightness: 196
triggerEventsState:
brightness: 196
uiState:
uiTable:
Attributes:
event-on-change-reading .*
event-on-update-reading LUMINOSITY,TEMPERATURE
event_Readings LUMINOSITY:[#average:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness:ReadingsAge($name,"brightness",0) < 1800],
MIN_LUMINOSITY:[#min:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness:ReadingsAge($name,"brightness",0) < 1800],
MAX_LUMINOSITY:[#max:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness:ReadingsAge($name,"brightness",0) < 1800],
DEV_LUMINOSITY:[@"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness:ReadingsAge($name,"brightness",0) < 1800],
TEMPERATURE:(15)
room System
stateFormat {no warnings;
my $ap = ReadingsNum($name,"AIR_PRESSURE",0);
my $tp = ReadingsNum($name,"TEMPERATURE",0);
my $lm = ReadingsNum($name,"LUMINOSITY",0);
sprintf("T: %.1f L: %.1f P: %.1f",$tp,$lm,$ap)}