AC_GetAggregatedValues - wieder mal...

Guten Morgen,

vorab: Die zahllosen Beiträge zum o.g. Thema habe ich gelesen. Leider habe ich immer noch eine „grundsätzliche“ Frage, die ich gerne hier im Forum loswerden möchte:

Mein „Weltbild“:

Über den Parameter „Aggregationsstufe“ kann ich wählen, welche auf Basis der Rohdaten vorberechneten Werte (stündlich, wöchentlich oder auf Basis von Rohdaten) ich für meine Abfrage verwenden möchte.
-> Bedeutet für mich, dass ich bei einem Abfragezeitraum von z.B. 2 vollen Tagen die Aggregationsstufe 1 (täglich) wählen kann und für meine eigentliche Abfrage dann nur 2 Werte verwendet werden.
-> Nach meinem Weltbild müsste ich dann aber auch die Aggregationsstufe 0 (stündlich) wählen können, dann werden für meine Abfrage in Summe 48 Werte verwendet.
-> Gleiches sollte dann analog für Parameter 5 und 6 gelten

Über die Parameter Startzeit und Endzeit lege ich dann den zu analysierenden Zeitbereich fest.

Ich habe eine Testvariable zyklisch befüllen lassen und vergleiche die Ergebnisse mit den erwarteten Ergebnissen. Wie ihr euch denken könnt sind beide nicht deckungsgleich.

Könnt ihr mir mein „Weltbild“ bestätigen oder gerade rücken, damit ich zumindest sicher sein kann, dass ich hier von richtigen Ausgangsvoraussetzungen ausgehe?

Danke für eure Hilfe, einen schönen 1. Advent,

Olaf

Das klingt soweit korrekt. Evtl. bist du einem Fehler auf der Spur? Erklär uns doch gerne deinen Versuchsaufbau.

paresy

…klar, sehr gerne. Wobei ich den Fehler immer noch „vor dem Geräte“ vermute :confused: .

Aufbau ist maximalst einfach:

Ein Skript wird per Timer alle 5 Minuten aufgerufen und addiert den Wert 1 zu einer Variabel (Typ: Float, Loggingmethode Zähler)


 $Verbrauch = GetValueFloat(24070);
 $Verbrauch = $Verbrauch + 1;
 
 SetValueFloat (24070, $Verbrauch);

→ Der Zähler erhöht sich pro Tag damit um 288 (60 Min pro Stunde * 24 Stunden / 5 Min Timer = 288)

In einem zweiten Testskript berechne ich die mit unterschiedlichen Parametern den „Verbrauch“ und schreibe das Ergebnis in 3 Testvariablen. Ziel ist der positive Beitrag pro Tag, d.h. das Ergebnis sollte 288 sein (event. 287, wenn man die letzte Minute vom Tag als mögliche Toleranz betrachtet)


//Test 1
$werte = AC_GetAggregatedValues(55532, 24070, 2, strtotime("last Monday 00:00"), strtotime("last Monday 23:59"), 0);
	foreach($werte as $wert) 
	{
	SetValueFloat (53724, $wert['Avg']);
	}
// Test 2
$werte = AC_GetAggregatedValues(55532, 24070, 1, strtotime("last Monday 00:00"), strtotime("last Monday 23:59"), 0);
	foreach($werte as $wert) 
	{
	SetValueFloat (46348, $wert['Avg']);
	}
//Test 3
$werte = AC_GetAggregatedValues(55532, 24070, 6, strtotime("last Monday 00:00"), strtotime("last Monday 23:59"), 0);
	foreach($werte as $wert) 
	{
	SetValueFloat (23025, $wert['Avg']);
	}

Das Ergebnis ist hier zu sehen:

Meine Interpretation der Ergebnisse:
Test1:
Ergebnis „muss“ falsch sein, weil Abfragezeitraum 1 Tag nicht mit Aggregationsstufe 1 Woche zusammenpasst --> Die Erwartung hier wäre gewesen, dass als Wert 7 Tage * 288 = 2016 angezeigt wird.
Anm.: Das „Simulationsskript“ läuft schon länger als eine Woche…

Test 2:
Das richtige Ergebnis

Test 3:
Hier hätte ich auch das richtige Ergebnis erwartet, allerdings IPS-Seitig aus 1440 (60 Min pro Stunde * 24 Stunden) Einzelwerten aufaddiert. Das Ergebnis klingt für mich wie ein „Einzelergebnis“, d.h. nur eine Zählererhöhung wird betrachtet. Dann frage ich mich aber, welcher Aggregationslauf wird hierfür hergenommen?

Danke für die Hilfe, VG Olaf

AC_GetAggregatedValues gibt ein Array mit aggregierten Werten zurück. Wenn du dann über das Array gehst und alle Werte nacheinander in die gleiche Variable schreibst, bleibt danach nur der letzte Wert des Arrays stehen. Du überschreibst alle vorherigen Werte.

Ist das eine Erklärung für dein Fehlverhalten? Ansonsten schaue dir einfach mal die Rückgabe per var_dump($werte) an. Dann werden die als Skriptausgabe ausgegeben und du kannst sie dir im Skripteditor anschauen.Dann kannst du vielleicht besser auswerten, was hier falsch läuft.

müsste ich mich mal hier einhaken…

mit folgendem Skript möchte ich meinen Ölverbrauch seit letzter Tankung (615 Tage) berechnen:

$_endDate	= strtotime("today");
$_beginDate = mktime(0, 0, 0, 03, 29, 2017);
 $timestamp_diff= $_endDate-$_beginDate +1 ;
 $days_diff = $timestamp_diff/86400;
 // ergibt derzeit 615 Tage
$data1 = AC_GetAggregatedValues($archiveID, $valueID, 1, $_beginDate, $_endDate, 0); 
SetValueFloat(53398 /*[GERÄTE\EKM-868\EKM 4 Heizung\variablen berechnungen\ölverbrauch\Verbrauch]*/, CalcConsumption($data1)/4800); // 4800 = Anzahl Takte pro liter  

im Ergebnis bekomme ich ein Wert von 1123 liter. Wenn ich aber die aktuellen EKM-Takte von den Start-Takten am 29.03.17 abziehe und durch 4800 teile komme ich auf ~1400 liter.
Was mache ich falsch mit AC_GetAggregatedValues ?

…zunächst einmal danke für deinen Tipp mit var_dump - und sorry für die späte Rückmeldung, aber wieder einmal stand ohne Vorwarnung Weihnachten vor der Tür…

Die Werte habe ich mir mit var_dump schon einmal angeschaut, vielleicht liegt hier der Fehler, habe aber leider keinen entdecken können:
var_dump liefert für eine Abfrage ein Array mit 7 Einträgen zurück, was ja auch der Spec entspricht. Ich versuche mein „Weltbild“ mal mit einer Zeichnung zu verdeutlichen:

Die grüne Gerade ist der lineare Werteanstieg, in meinem Beispiel eine Erhöhung um 1 pro 5 Min. Die auf der Geraden eingezeichneten Werte Wert1 und Wert2 haben einen zeitlichen Abstand von T. Der Zeitbereich T ist dabei abhängig von der Aggregationsstufe, wenn ich mal die Sonderfälle 5min. und 1min Aggregation ausblende. Das Verhalten kann ich auch in den Aggregationsdateien z.B. 24070.week oder 24070.day etc.nachvollziehen.

Der in der Graphik rot markierte Zeitbereich zwischen $Endzeit und $Startzeit sollte nach meinem Weltbild die - je nach gewählter Aggregationsstuffe - in diesem Zeitbereich liegenden Werte aus der Datei z.B. 24070.week (hier: Wert1 und Wert2) verwenden und daraus dann das o.g. Array mit den 7 Einträgen abhängig von den Daten befüllen.

In meinem Beispiel habe ich für die wöchentliche Aggregationsstufe Daten für den 26.11., den 3.12., den 10.12. und den 17.12.in der Datei 24070.week.

In meinem Beispiel möchte ich nun die Werte für einen Zeitbereich >1 Woche (hier: 1.12.2018 - 17.12.2018) abfragen und danach mit ver_dump ausgeben:


$werte = AC_GetAggregatedValues(55532, 24070, 2, strtotime("01-12-18 00:00"), strtotime("17-12-18 00:00"), 0);
	foreach($werte as $wert) 
	{
	SetValueFloat (53724, $wert['Avg']);
	}
var_dump($wert);

Für diese Kombination bekomme ich folgende Fehlermeldung:
Notice: Undefined variable: wert in /mnt/data/symcon/scripts/22407.ips.php on line 12
NULL

Line12 ist übrigens der Befehl var_dump($wert);

Nach wildem probieren hab ich Kombinationen gefunden, die Werte liefern - erklären konnte ich mir das aber nicht.

Kann mir jemand helfen, meinen Knoten aufzulösen? Danke für eure Hilfe!!!

VG Olaf

PS: Sollte jemand die Grafik verwenden wollen anbei noch die pptx-Datei im nächsten Post

…und hier noch die pptx

AC_GetAggregatedValues.zip (36.8 KB)

Hallo Allgäuer,

ich denke, Deine strtotime-Abfrage ist nicht richtig. Sie müßte strtotime(„18-12-01 00:00“) heißen. Schau Dir dies mal in einem online-Converter an. Sicher hast Du von 2001 keine Daten mehr in Deiner Datenbank…

Grüße, Gerhard

Hallo Bernhard, danke dir! Das war natürlich ein Leichtsinnsfehler, da ich zum testen mit den Start- und Endpunkten gespielt habe. Mit richtigen Zeitangaben funktioniert die Abfrage.

Damit bleibt für mich zum Verständnis noch folgendes offen (siehe auch den post weiter oben):

  1. Ist mein „Weltbild“ (siehe Zeichnung) grundsätzlich richtig?
  2. Wenn Frage 1 mit ja beantwortet werden kann, verstehe ich in dem Post oben das Beispiel 3 noch nicht:

$werte = AC_GetAggregatedValues(55532, 24070, 6, strtotime("last Monday 00:00"), strtotime("last Monday 23:59"), 0); 
    foreach($werte as $wert) 
    {
    SetValueFloat (53724, $wert['Avg']);
    }
var_dump($wert); 

Hier kommt als Ergebnis [AVG] nach wie vor der Wert 1 heraus. Ich betrachte einen ganzen Tag (d.h. die Zählererhöhung sollte in Summe 288 betragen), werte die Rohdaten aus und habe auch in den Rohdaten für diesen Zeitraum die erwarteten Einträge. Hier der Auszug nach var_dump:

array(7) {
[„TimeStamp“]=>
int(1545606000)
[„Avg“]=>
float(1)
[„MinTime“]=>
int(1545606000)
[„Min“]=>
float(1)
[„MaxTime“]=>
int(1545606000)
[„Max“]=>
float(1)
[„Duration“]=>

Kann mir jemand das Verhalten erklären oder sagen, was für einen Fehler ich hier mache?

Vielen Dank noch einmal für eure Hilfe!

VG Olaf

Olaf,

wie Niels oben schon fragte: erklär doch mal, was bei deiner Schleife passieren soll.
Der Inhalt der Schleife sieht für mich falsch aus, weil 53724 bei jedem Durchlauf überschrieben wird.


foreach($werte as $wert) 
    {
    SetValueFloat (53724, $wert['Avg']);
    }

Viele Grüße
Volker

:banghead:

Jetzt hat es „klick“ gemacht - und ich verstehe auch den Hinweis von Niels oben richtig…

Mein Verständnis war, dass die Funktion EINEN Datensatz in das Array schreibt und darin schon die aggregierten bzw. summierten Werte zu finden sind.

D.h. die Funktion liefert für jeden vorhandenen „Stützpunkt“, der je nach Aggregationsstufe entsprechend zeitlich getrennt vom nächsten ist, einen Datensatz im Array abhängig von den Parametern Anfang und Ende, die dann im eigenen Code je nach Bedarf noch weiterverarbeitet werden müssen.

VIELEN DANK FÜR EURE HILFE!!!