Problem mit 5-Minuetiger Aggregation und was ist Aggregationsstufe 7

Hallo
Ich hab ein Problem mit der 5-Minütigen Aggregation.
Record Limit: 30000.
Ich hab zB von meiner Wetterstation ein Temperaturvariable.
Da fallen pro Stunde im Schnitt 16 Werte an ( ca 400 pro Tag ).
Wenn ich jetzt fuer das laufende Jahr 2020 mir jetzt mit AC_GetAggregatedValues
die Werte abfrage ,erhalte ich fuer

// 1-Minütige Aggregation (Aus Rohdaten berechnet)
$werte = AC_GetAggregatedValues($archiv, $ID, 6, mktime(0, 0, 0, 1, 1, 2020), time(), 0 );

13.04.2020 14:40:00 - 04.05.2020 10:40:00
Count 30001

// 5-Minütige Aggregation (Aus Rohdaten berechnet)
$werte = AC_GetAggregatedValues($archiv, $ID, 5, mktime(0, 0, 0, 1, 1, 2020), time(), 0 );

hierbei erhalte ich die Fehlermeldung:
Warning: Read too many values when computing minutely aggregation in …

Die Anzahl der Rohdaten ist doch bei beiden gleich.:confused:

Doch wenn ich jetzt das komplett letzte Jahr 2019 nehme funktionieren beide.

// 1-Minütige Aggregation (Aus Rohdaten berechnet)
$werte = AC_GetAggregatedValues($archiv, $ID, 6, mktime(0, 0, 0, 1, 1, 2019), mktime(23, 59, 59, 12, 31, 2019), 0 );

11.12.2019 03:59:00 - 31.12.2019 23:59:00
Count 30001

// 5-Minütige Aggregation (Aus Rohdaten berechnet)
$werte = AC_GetAggregatedValues($archiv, $ID, 5, mktime(0, 0, 0, 1, 1, 2019), mktime(23, 59, 59, 12, 31, 2019), 0 );

18.09.2019 20:55:00 - 31.12.2019 23:55:00
Count 30001

Identisches Ergebnis auch bei Variable Luftfeuchtigkeit.

Was ist Aggregationsstufe 7
Aggregationsstufe 5
5-Minütige Aggregation (Aus Rohdaten berechnet)
Aggregationsstufe 6
1-Minütige Aggregation (Aus Rohdaten berechnet)
Aggregationsstufe 7
? undokumentiert aber funktioniert und liefert Daten

Ich habe vermutlich das gleiche Problem bei der Anzeige der Tageswerte eines Graphen.

Die Variable wird sekündlich geschrieben und damit fallen viele Datensätze an. Wenn ich mir die HD Werte anzeigen lassen möchte, dann können da doch eigentlich nach meinem Verständnis max. 24*60= 1440 Werte zusammenkommen.

Dennoch kommt es zur Fehlermeldung:

Die Spezialschalter „ArchiveRecordLimit“ und „ArchiveRecordLimitBool“ stehen auf 30000.

Es ist dann eher ~246060, da die 1 bzw. 5 Minuten Aggregationen aus den Rohdaten berechnet werden (Sollte so auch in der Doku stehen)

@1007: Das klingt nach einem Fehler. Müssten wir uns ansehen.

Die Stufe 7 liefert eine Art von Changelog die für die Boolean Graphen genutzt wird.

paresy

Ok. Jetzt verstehe ich die Doku.

Den Parameter

Limit: Maximale Anzahl an Datensätzen. (0 = Kein Limit, 10000 ist das harte Limit, welches immer greift)

hatte ich bislang immer auf die Anzahl der zurückgegeben Datensätze bezogen.

Es geht dann auch bei den Spezialschaltern um die Anzahl der gelesenen Werte, nicht um die Anzahl der gelieferten Werte.

Korrekt. :slight_smile:

paresy

Da habe ich mir wohl einiges an Zeit gelassen, aber ich bin mittlerweile bei dem Ticket angekommen.

Das klingt aber eigentlich alles korrekt. Hintergrund ist, dass GetAggregatedValues die Startzeit nachjustiert auf Basis der Aggregationsstufe. Bei minütlicher wärst du bei einem Standardlimit von 30000, also 30000 Minuten < 21 Tage. Wenn jetzt für jeden Tag 400 Datensätze anfallen, wären das 400 * 21 = 8400, das ist wunderbar im Rahmen. Wenn du dies jetzt allerdings mit 5-minütiger Aggregation machst, sind das 5 mal so viele Werte, also 42000. Damit sprengst du dann leider den Rahmen und es kommt zum beschriebenen Fehler.

Hallo,

habe nun das gleiche Problem. Jemand, der mein Modul verwendet hat Logwerte im Sekundentakt in der Datenbank.

Wenn ich nachfolgendes verwende, gehe ich davon aus, dass das Problem >10.000 Werte im abgefragten Zeitraum von IPS gelöst wird, da ich nur jede Minute einen Wert erhalten möchte und auch nur maximal 10.000:

AC_GetAggregatedValues($archiveId, $logId, [b]6[/b], $startTime, $endTime, 10000);

Liegt die Anzahl der Werte >10.000 erwarte ich die Rückgabe von 10.000 Werte und nicht folgende Fehlermeldung:
„Warning: Read too many values when computing minutely aggregation in“
Es wird kein einziger Wert zurückgegeben, wenn die Gesamtanzahl >10.000.

Dies entspricht nicht dem Verhalten von:

AC_GetLoggedValues($archiveId, $logId, $startTime, $endTime, 10000);

Hier erhalte ich beim Überschreiten von 10.000 Werte ein Array mit exakt 10.000 Werten zurückgegeben.

Denke ebenfalls, dass hier ein Implementierungsfehler vorliegt.

Im Fall der aggregierten Werte stößt du auf einen Sonderfall, der bei Rohwerten so nicht möglich ist. Die Rohwerte, welche benötigt würden um deine Anfrage korrekt zurückzugeben sind einfach zu viele (mehr als durch den Spezialschalter ArchiveRecordLimit definiert). So ist es nicht möglich die Anfrage zu erfüllen. Bei einer teilweisen Erfüllung wäre es für den Benutzer wiederum sehr unklar, warum nun gerade 3 und nicht mehr aggregierte Datensätze zurückkommen oder, noch schlimmer, er würde denken, dass davor gar nichts passiert ist. Daher haben wir uns an der Stelle für den Fehler entschieden und geben kein unvollständiges Ergebnis zurück.

Hallo Niels,

warum löst ihr das Problem für den IPS Nutzer nicht bspw. wie folgt?

if(10000 <= count($logValues))
        {
            $intervallEdge = $startTime + ($endTime - $startTime) / 2;
            $bufferArray = array_merge($this->getLog($logId, $startTime, $intervallEdge, $mode), $this->getLog($logId, $intervallEdge, $endTime, $mode));
        }

Oder noch besser:
Ihr ermittelt bis wohin der letzte LogWert reicht und beginnt dort wieder erneut und merget die Einzelteile?