event-aggregator nicht verstanden oder doch Fehler?

Begonnen von ZwergNase, 31 Juli 2020, 15:39:26

Vorheriges Thema - Nächstes Thema

ZwergNase

Hallo zusammen,

um die Anzahl der Events von meinen Steckdosen (Strom) herunter zu bekommen, habe ich versucht mit "event-aggregator" die Events zusammenzufassen. Obwohl ich ein Interval von 10 Sekunden vorgegeben hatte, gab es immer wieder Updates nach ein oder zwei Sekunden. Um das Thema zu verstehen, habe ich erstmal ein einfacheres Setup getestet, verstehe das Ergebnis aber einfach nicht.

Das Reading "Strom-get" soll höchstens alle 10 Sek. einen Event liefern.

Ich habe das Reading zum Testen erstmal verdoppelt:
userreadings Strom2-get:Strom-get.* {ReadingsNum($name,"Strom-get",0)}

Dann einen event-aggregator darauf:
event-aggregator Strom2-get:10:none:count

Nach meinem Verständnis müssten jetzt entweder alle 10 Sekunden die Anzahl der Events in den letzten 10 Sekunden ausgegeben werden oder (wenn die Events mehr als 10 Sekunden auseinander liegen) kommt mit jedem Event eine "1".


Das ist der Output vom Event Monitor. Bis 15:14:07 verstehe ich das Ergebnis. Aber warum wird nur zwei Sekunden später wieder ein Event ausgelöst?
2020-07-31 15:13:31 KNX WZ_ST_2.3 Strom-get: 680 mA
2020-07-31 15:13:32 KNX WZ_ST_2.3 Strom-get: 655 mA
2020-07-31 15:13:34 KNX WZ_ST_2.3 Strom-get: 725 mA
2020-07-31 15:13:34 KNX WZ_ST_2.3 Strom-get: 783 mA
2020-07-31 15:13:35 KNX WZ_ST_2.3 Strom-get: 818 mA
2020-07-31 15:13:37 KNX WZ_ST_2.3 Strom-get: 845 mA
2020-07-31 15:14:07 KNX WZ_ST_2.3 Strom-get: 817 mA
2020-07-31 15:14:07 KNX WZ_ST_2.3 Strom2-get: 7
2020-07-31 15:14:09 KNX WZ_ST_2.3 Strom-get: 845 mA
2020-07-31 15:14:09 KNX WZ_ST_2.3 Strom2-get: 1        <- warum dieser Event, der letzte ist doch erst 2 Sek her?


Vielen Dank für Hinweise oder Vorschläge,
Oliver

abc2006

Hallo, hast du rausgefunden, woran es liegt?
ich hatte hier schonmal was geschrieben:
https://forum.fhem.de/index.php/topic,112837.0.html

und stehe akut wieder vor dem gleichen Problem.
Habe versucht, in der fhem.pl und in der TimeSeries.pm etwas herauszufinden, aber das liegt *so* weit über meinem Programmierniveau, dass ich erfolglos aufgegeben habe...

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

ZwergNase

So, jetzt habe ich mich dem Thema noch einmal gewidmet und kann es (glaube ich) selber erklären 8). Als Beispiel verwende ich die Strommessung eines KNX-Aktors. Ziel soll es sein, die Anzahl der Events zu reduzieren und durch korrekt gemittelte bzw. gewichtete Werte zu ersetzte.

Damit ich "beobachten" kann was geschieht, habe ich das eigentliche Reading "Strom-get" zunächst per userreading verdoppelt
attr WZ_ST_2.3 userReadings Strom2-get:Strom-get.* { ReadingsNum($NAME, 'Strom-get', 0); }
und auf dieses Reading dann den event-aggregator angewendet
attr WZ_ST_2.3 event-aggregator Strom2-get:60:const:mean

Laut Beschreibung werden nun die Events (Werte) für 60 Sekunden unterdrückt. Beim nächsten Event nach 60+ Sekunden wird dann das gemittelte (mean) Ergebnis ausgegeben.

Im Anhang eine Ausschnitt der Events für das ursprüngliche Reading Strom-get und die Ausgabe des eventnaggregators Strom2-get (blaue Spalte). Außerdem einige interne Werte des event-Aggregators (türkiese Spalten) und meine Kontrollrechnung (graue Spalten)

Bei jedem eintreffenden Event wird aus dem aktuellen Timestamp (gelbe Felder, Spalte t) und dem Vorangegangenen die Differenz gebildet (gelbe Felder, Spalte Delta t). Das ist die Dauer für die vorherige Messwert (grüne Felder, Spalte v) gültig war. In der Spalte "V gewichtet" habe ich daher v x Delta t berechnet. Der erste Wert ergibt sich z.B. aus 489 x 33,8 = 16.507,7 (Abweichungen sind Rundungsfehler).
Mit dem Event um 21:02:36 stellt der event-aggregator fest, dass die 60 Sekunden überschritten sind und liefert das Ergebnis (rosa Feld) der bis hier verarbeiteten 6 Werte (grüne Felder, Spalte v). Im Falle von "integral" als Summe der mit den Zeitintervallen gewichteten Werte (28.099,5) bzw. für "mean" wird noch einmal durch das Gesamtinterval (Summe Delta t, 57,2 Sekunden) geteilt.

Man erkennt auch, warum zwischen den Ausgaben des event-aggregators nicht wie vermutet 60+ Sekunden liegen. Für die Gewichtung des ersten Wertes muss immer das letzte Interval der vorherigen Datenserie einbezogen werden. Das hat um 21.01:29 begonnen und damit tatsächlich 60+ Sekunden vor dem Event um 21:02:36.

Ich hoffe die Erklärung ist soweit verständlich. Ansonsten gerne fragen oder gleich verbessern.

Um die internen Werte des event-aggregators bei der Arbeit zu beobachten hatte ich übrigens folgendes userreading angelegt:
attr WZ_ST_2.3 userReadings Dummy-get:Strom-get.* { "$defs{$NAME}{'READINGS'}{'Strom2-get'}{'.ts'}{'n'} $defs{$NAME}{'READINGS'}{'Strom2-get'}{'.ts'}{'t'} $defs{$NAME}{'READINGS'}{'Strom2-get'}{'.ts'}{'v'} $defs{$NAME}{'READINGS'}{'Strom2-get'}{'.ts'}{'integral'} $defs{$NAME}{'READINGS'}{'Strom2-get'}{'.ts'}{'mean'}" ;; }

Leider ist es mir nicht gelungen die Grafik direkt einzufügen bzw. eine Tabelle anzulegen. Vielleicht hat jemand einen Tipp?

Schönen Abend noch,

Oliver (ZwegNase)