Es gibt diverse Threads hier im Forum zur event-aggregator-Funktionalität, aber keiner löst mein Problem.
Ich möchte, dass FHEM mir eine Fläche über einen bestimmten Zeitraum periodisch berechnet. Nach Periodenablauf soll der Wert in ein Log geschrieben werden.
Dazu folgender einfacher Versuchsaufbau:
Ein Dummy mit event-aggregator-Attribut:
define testintegral dummy
attr testintegral event-aggregator integral1:300:const:integral:300
Ein at, dass alle 10 Sekunden den Wert 10 in das Reading integral1 feuert:
define a_testintegral at +*{100}00:00:10 setreading testintegral integral1 10
Ein FileLog, das Änderungen des Readings integral1 dokumentiert:
define testintegrallog FileLog ./log/testintegral-%Y.log testintegral:integral1:.*
Meine Erwartung ist:
- Updates des Readings integral1 werden 300s unterdrückt
- nach dem Intervall von 300s wird der berechnete Aggregationswert ausgegeben (Event) und ins Log geschrieben
- der Aggregationswert des Readings integral1 sollte nach dem Intervallende 10 * 300s = 3000 betragen
- nach dem Intervallende startet eine neue Periode bzw. eine neue Flächenberechnung
- nach Ende des zweiten Intervalls (600s) wird der nächste Aggregationswert ausgegeben (Event) und ins Log geschrieben
Ergebnis nach at Start:
- Während des ersten Intervalls bleibt der Readingwert bei 10, es werden keine Events erzeugt > korrekt
- Nach dem 1. Intervall wurde der Readingwert auf ca. 3000 aktualisiert und der Wert ins Log geschrieben > korrekt
- Ab dem 2. Intervall werden die Readingupdates nicht mehr unterdrückt. Alle 10s wird ein um 3000 schwankender Wert ins Log geschrieben. Eine Aggregation findet nicht mehr statt.
Die Versuchsvariante ohne Intervall-Definition mit
attr testintegral event-aggregator integral1::const:integral:300
führt dazu, dass das Reading schon im 1. Intervall alle 10s mit dem Aggregationswert aktualisiert wird. Das widerspricht der Beschreibung in der commandref:
With holdTime defined the interval can be kept undefined so that the readings update rate is unchanged or it can be set to a value less then holdTime for downsampling as described above with a full history of the readings in memory.Nach dem 1. Intervall bleibt wie im vorherigen Versuch die Aggregation um den Wert 3000 stecken.
Das alles sieht nach einem Fehler aus.
Hier eine Dumperausgabe der Timerwerte nach dem 1. Intervall mit
{ Dumper($defs{"testintegral"}{READINGS}{"integral1"}{".ts"}) }
$VAR1 = bless( {
'_M' => '100.000041325887',
'_S' => '0.00870338185376656',
'_t' => '1591543162.28557',
'_t0' => '1591542862.28545',
'_v' => '10',
'autoreset' => 300,
'count' => 31,
'holdTime' => 300,
'integral' => '3000.00123977661',
'lost' => 0,
'max' => 10,
'mean' => '10',
'median' => undef,
'method' => 'const',
'min' => 10,
'n' => 30,
'sd' => '0.00173238669931274',
't' => '1591543162.28557',
't0' => '1591542862.28545',
'tSeries' => [
'1591542862.28545',
'1591542872.28802',
'1591542882.2857',
'1591542892.28819',
'1591542902.28559',
'1591542912.28593',
'1591542922.28524',
'1591542932.28613',
'1591542942.28705',
'1591542952.28606',
'1591542962.28552',
'1591542972.28593',
'1591542982.28569',
'1591542992.28823',
'1591543002.28692',
'1591543012.28593',
'1591543022.28552',
'1591543032.28608',
'1591543042.28532',
'1591543052.28828',
'1591543062.2865',
'1591543072.28588',
'1591543082.28549',
'1591543092.28781',
'1591543102.28537',
'1591543112.28628',
'1591543122.28676',
'1591543132.28724',
'1591543142.2878',
'1591543152.28727',
'1591543162.28557'
],
'v' => '10',
'v0' => '10',
'vSeries' => [
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10',
'10'
]
}, 'TimeSeries' );
Mein FHEM ist aktuell. Hat jemand eine Idee?
Viele Grüße
Ich konnte meine Anforderung jetzt mit Weglassen des Parameters "holdTime" lösen. Mit ,,event-aggregator integral1:300:const:integral" verhält sich der Aggregator in meinem Testbeispiel so wie ich es erwarte. Auf die falsche Fährte geführt hat mich das Beispiel in der commandref:
attr mySunMeter event-aggregator SUN_INTENSITY_24H::const:integral:86400
Die Leistung der täglichen Sonnenstrahlung zu bestimmen, ließ sich damit nicht realisieren. Aber vielleicht war das Beispiel auch für einen anderen Anwendungsfall gedacht, der sich mir nicht erschlossen hat.
Mit folgender Definition bekomme ich alle 24 h den aggregierten Strahlungswert und damit die erbrachte Solarenergie:
attr mySunMeter event-aggregator SUN_INTENSITY_24H:86400:const:integral
Die interval-Parameter-Dokumentation in der commandref beschreibt das auch korrekt. Wie gesagt hat mich dann der Parameter "holdTime" verwirrt. Erst der Hinweis in der Source von timeSeries.pm "method _housekeeping does not reset time series if hold time is specified" hat mich darauf gebracht, dass die Anwendung des Parameters ,,holdTime" für meinen Anwendungsfall falsch ist. Die Erkenntnis hat leider etwas gedauert.
Viele Grüße