event-aggregator
Oft liegen kontinuierlich anfallende Daten vor, die in bestimmten Zeitabschnitten erfasst werden. Mit dem Attribut event-aggregator können (nach Wunsch zeitlich gewichtete) Durchschnittswerte, Minima, Maxima oder Median dieser Daten berechnet werden. Der Median kann hilfreich sein, um Messwerte mit Ausreissern (unsinnige Werte, z.B. durch Übertragungsfehler) zu glätten.
Syntax
Das event-aggregator Attribut wird in der folgenden Weise spezifiziert:
attr <device> event-aggregator reading:interval:method:function:holdTime
Mehrere Readings werden als kommagetrennte Liste angegeben. Dabei darf zwischen den Einträgen kein Leerzeichen stehen (siehe diesen Forenbeitrag).
Die einzelnen Teile haben folgende Bedeutung:
reading
Das zu aggregierende Reading des aktuellen Gerätes. Das Reading selbst muss seine Werte aus einer Aktion oder einem Event in FHEM erhalten (beispielsweise, indem Temperaturwerte ausgegeben oder andere Größen in das Reading geschrieben werden). Die berechnete Größe wird dann (je nach Definition entweder das Minimum, das Maximum oder der Median der Werte) beim event-aggregator ausgegeben.
Wichtig: Pro Reading kann es nur einen event-aggregator geben. Will man daher mehrere Werte (z.B. min, max und avg) von einem Reading ermitteln, muss man dieses Reading zuerst verdoppeln oder verdreifachen (z.B. mit userReadings oder notify) und dann für jedes Aggregat den entsprechenden event-aggregator anwenden. Der Aggregator kann als regulärer Ausdruck angegeben werden (beispielsweise .*_rain.*
)
interval
Dieses Attribut dient dazu, nicht bei jedem Event den Aggregator erneut auszugeben: Updates des <readings> werden ignoriert, Events lösen für mindestens <interval> Sekunden keine Verarbeitung des Aggregats aus. Nach der Interval-periode wird das reading mit einem Wert aktualisiert, der sich aus den Werten und Zeitstempeln der vorher ignorierten Updates zusammensetzt.
Anmerkung. Diese Aussagen scheinen nicht zu stimmen: https://forum.fhem.de/index.php/topic,129920.msg1241897.html#msg1241897 Vielmehr ist es so, dass nach interval Sekunden die gespeicherten Daten gelöscht werden und die Aggregation von Neuem beginnt (reset). Das ist etwas anderes als das unterdrücken von Events.
method
Bei kontinuierlichen Daten kann eine Gewichtung nach Zeitintervallen wichtig sein. Wenn kontinuierliche Daten vorliegen, können hier Ungenauigkeiten auftreten: Man weiß bei einer Messung ja nicht, wie lange der gemessene Wert tatsächlich außerhalb der diskreten Messpunkte noch so den gemessenen Wert widerspiegelt oder sich in Wirklichkeit bereits verändert hat. Dies kann durch die Methode berücksichtigt werden.
Eine andere Methode als const spielt nur eine Rolle, wenn die Daten zeitlich gewichtet werden. Dabei wird wie folgt vorgegangen.
none
: keine zeitliche Gewichtungconst
: zeitliche Gewichtung, wobei bei der Gewichtung die Länge des Zeitintervalls mit dem aktuellen Messwert multipliziert wird (zweckmäßig bei konstanten Größen)linear
: zeitliche Gewichtung, wobei bei der Gewichtung die Länge des Zeitintervalls mit dem Durchschnitt aus aktuellem Messwert und vorangegangenem Messwert multipliziert wird (zweckmäßig bei linear veränderlichen Größen).
function
count
Anzahlmin
Minimummax
Maximummean
arithmetischer Mittelwertsd
Standardabweichungintegral
Summe (falls holdTime nicht angegeben) oder Integral für den Zeitraum holdTimemedian
Median (nur für methodnone
und gesetzte holdTime) - im Gegensatz zum Mittelwert nicht anfällig für Ausreisser, hilfreich bei Sensoren mit sporadisch unsinnigen Messwerten
holdTime
Zeitfenster in Sekunden, für die die vergangenen Werte intern gespeichert und verarbeitet werden, um das Aggregat zu berechnen.
Duplizieren von Readings
Wenn mehrere Funktionen für ein Reading berechnet werden sollen, muss dieses Reading zuvor dupliziert werden. In der Commandref wird ein notify vorgeschlagen, evtl. können aber auch DOIF_Readings, event_Readings und userReadings verwendet werden:
original_reading:interval:method:function:holdTime
DOIF_Readings
TODO!
original_reading:interval:method:function:holdTime
Es gibt mittlerweile auch bei DOIF eine Funktion, die diverse Mittelwerte berechnet. Für alle, die mit event-aggregator hadern, ggf. eine Alternative.
event_Readings
attr DOIF-Device event_Readings original_reading:[<Device>:<Reading>],
copy_1:[$SELF:original_reading],
copy_2:int(10*[$SELF:copy_1])/10Funktioniert so nicht!!!attr DOIF-Device event-aggregator copy_1:interval:method:function:holdTime
userReadings
attr DOIF-Device userReadings original_reading {ReadingsVal("<Device>","<Reading>",0)},
copy_1 {ReadingsVal($name,"original_reading",0)},
copy_2 {int(10*ReadingsVal($name,"copy_1",0))/10}
attr DOIF-Device event-aggregator copy_1:interval:method:function:holdTime
Dabei darf anscheinend kein Leerzeichen zwischen mehreren Readings vorkommen (siehe diesen Forenbeitrag).
Wechselwirkungen
- keine bekannt -
Beispiele
- aus der commandref/Event-aggregator
attr myPowerMeter event-aggregator EP_POWER_METER:300:linear:mean,EP_ENERGY_METER:300:none:v:
attr myBadSensor event-aggregator TEMP::none:median:300:
attr mySunMeter event-aggregator SUN_INTENSITY_24H::const:integral:86400
Siehe auch
Links
- Benutzungstipps (Best Practice) für das Attribut in diesem Forenthread
- Fragen mit konkretem Zahlenbeispiel in diesem Forenthread