Berechnungen mit Archivwerten sind nicht plausibel

Hallo,

ich habe ein Verhalten das ich mir nicht erklären kann.
Hierzu mal eine Erklärung.

Ich hole mir zwei Werte aus dem Archiv und bilde dann einen dritten Wert.

//test
//erzeugung
$kWh_Erzeugung_Monat_roht = AC_GetAggregatedValues(24614, 52431, 1 /* stündlich */, strtotime("today 00:00"), strtotime("today 23:59"), 0);

    foreach($kWh_Erzeugung_Monat_roht as $wertkWh_Erzeugung_Monatt) {
        $kWh_Erzeugung_Monat_Avgt[] = $wertkWh_Erzeugung_Monatt['Avg'];
    }

if (!empty($kWh_Erzeugung_Monat_Avgt)){      //auf Null prüfen 
    $kWh_Erzeugung_Monat_Gesamtt = array_sum($kWh_Erzeugung_Monat_Avgt);
    }


Var_dump($kWh_Erzeugung_Monat_Gesamtt);



//lieferung
$kWh_Erzeugung_Monat_rohtl = AC_GetAggregatedValues(24614, 40611, 1 /* stündlich */, strtotime("today 00:00"), strtotime("today 23:59"), 0);

    foreach($kWh_Erzeugung_Monat_rohtl as $wertkWh_Erzeugung_Monattl) {
        $kWh_Erzeugung_Monat_Avgtl[] = $wertkWh_Erzeugung_Monattl['Avg'];
    }

if (!empty($kWh_Erzeugung_Monat_Avgtl)){      //auf Null prüfen 
    $kWh_Erzeugung_Monat_Gesamttl = array_sum($kWh_Erzeugung_Monat_Avgtl);
    }


Var_dump($kWh_Erzeugung_Monat_Gesamttl);

Dann den dritten Wert berechnen und in eine andere Variable schreiben

$EigenverbrauchTest = $kWh_Erzeugung_Monat_Gesamtt - $kWh_Erzeugung_Monat_Gesamttl;

SetValueFloat(24681,$EigenverbrauchTest);

Das Ergebnis aus

$EigenverbrauchTest = $kWh_Erzeugung_Monat_Gesamtt - $kWh_Erzeugung_Monat_Gesamttl;

Ist aktuell 9,15 kWh

Wenn ich aber jetzt bei der 3ten Variable
mit folgenden Code die Werte summiere

//Test
$Eigenverbrauch = 24681;

//Eigenverbrauch PV Anlage nach Schnellwahl
        $Eigenverbrauch_kWh_roh = AC_GetAggregatedValues($Archiv, $Eigenverbrauch, 1 /* täglich */,strtotime("today 00:00"), time(), 0);
        foreach($Eigenverbrauch_kWh_roh as $Gesamt) {
            $Eigenverbrauch_Avg[] = $Gesamt['Avg'];
        }
        //Array auf Inhalt prüfen 
        if (!empty($Eigenverbrauch_Avg)) 
        {
        $Eigenverbrauch_kWh = array_sum($Eigenverbrauch_Avg);
        }

erhalte ich für $Eigenverbrauch_kWh 9,54 kWh

Auch in der Visu im Balkendiagramm stehen die 9,54 kWh??
Der Wert ist eigentlich nicht richtig, weil es 9,15 kWh sein müssten.
Das Logging istr bei allen 3 Vars. auf Zähler gestellt.

Warum ist das so? Ist mein Code falsch?
Vielleicht kann mir hier jemand weiterhelfen ´…

Ich finde den Code vor allen Dingen etwas unübersichtlich, aber das ist vielleicht Geschmackssache. Wenn ich es korrekt verstehe, nimmst du dir drei unterschiedliche Variablen aus dem Archiv und addierst jeweils die Durchschnittswerte pro Stunde von Mitternacht des aktuellen Tags an.

Weshalb die Differenz der ersten beiden summierten Werte unterschiedlich ist als der dritte summierte Wert geht aus dem Code grundsätzlich nicht hervor; das hängt ja davon ab, was die Werte der jeweiligen Variablen sind.

Ich wittere aber, dass die Vorgehensweise, Durchschnittswerte zu addieren nicht das ist was du möchtest. Die Durchschnittswerte pro Stunde zu addieren ist ja nicht das selbe wie die tatsächlichen Verbrauchswerte zu ermitteln.

Vermutlich müsstest du einfach die Zählerstände zu Tagesbeginn hernehmen (ggf um Mitternacht in einer jeweils separaten Variablen speichern, oder halt den einen Wert um Mitternacht aus dem Archiv heraus nehmen mit GetLoggedValues() + Limit auf 1) und dann den aktuellen Wert minus den Mitternachtswert rechnen.

Moin, wenn die als Zähler geloggt werden gibt Avg das positive Delta wieder, also tatsächlich den Verbrauch. Beim Typ Standard ist es der durchschnittliche Wert. Das sollte also passen…

Gruß
Stephan

Danke für Eure Antworten.
Das AVG beim Typ Zähler ist tatsächlich der Verbrauch, also müsste wenn ich von Heute 00:00 bis 23:59 den AVG auslese und mit array_sum(), summiere, eigentlich der Tagesverbrauch rauskommen.
Hier muss ich halt immer den ganzen Tag oder die vollen Stunden haben, damit ich alles rein bekomme, wenn ich es Sekundengenau möchte muss ich mit GetLoggedValues() arbeiten.
So ist mein Verständnis.
Vielleicht meldet sich der @Dr.Niels mal dazu und kann es erklären.

Ich verstehe dennoch nicht den Vorteil, wenn es um den Verbrauch seit 0:00 Uhr geht, nicht einfach mit der Differenz der Zählerstände zu arbeiten.

Weil ich bisher dachte das es mit dem AVG auch funktioniert.
Nachteil von GetLoggedValues ist die höhere Rechnenlast, die ich mit
AC_GetAggregatedValues auch vermeide…

Irgendwas ist auf alle Fälle faul.
Laut Archiv gehen die Werte heute von 0- 0,83 kWh
Und dieser Wert ist auch korrekt wenn ich mit dem Taschenrechner nachrechne…

grafik

Mit dem Code ermittele ich aber 0,887.

//test
 //Eigenverbrauch PV Anlage nach Schnellwahl
        $Eigenverbrauch_kWh_roh = AC_GetAggregatedValues($Archiv, $Eigenverbrauch, 0 ,strtotime("today 00:00"), strtotime("today 23:59"), 0);
        foreach($Eigenverbrauch_kWh_roh as $Gesamt) {
            $Eigenverbrauch_Avg[] = $Gesamt['Avg'];
        }
        //Array auf Inhalt prüfen 
        if (!empty($Eigenverbrauch_Avg)) 
        {
        $Eigenverbrauch_kWh = array_sum($Eigenverbrauch_Avg);
        }
var_dump($Eigenverbrauch_kWh);

grafik

Rundungsdifferenzen?

1 „Gefällt mir“

Das vermute ich auch.
Vielleicht outet sich @Dr.Niels dazu noch.

Zur Not mache ich das mit GetLoggedValues…

Oder ich versuche die Werte mal mit round() zu runden.

Komisch ist aber trotzdem, dass es das Balkendiagramm im Webfront auch falsch anzeigt.
Deswegen meine Vermutung, dass hier irgendwas nicht ganz richtig ist.

Ist GetLoggedValues denn wirklich so problematisch vom Ressourcen Bedarf her, wenn du damit nur den einen Wert abrufst (Limit 1)?

Hatte es immer so verstanden dass man vor allem keine Unmengen an Einzelwerten abrufen und verarbeiten sollte, sondern für sowas eher die vorher aggregierten Werte nehmen sollte.

Das mit GetLoggedValues kann man schon so machen, ist auch in Ordnung, habe ich auch ein paar mal in Verwendung.

Jedoch, möchte ich gerne wissen ob ich hier mit dem AVG Wert was falsch verstehe, falsch mache oder es sogar ein Fehler ist.
Weil ich habe einige solcher Berechnungen.
Auch in der Firma haben wir die Dinge so am laufen.
D.h. ich müsste das alles ändern, weil die Werte nicht stimmen.
Obwohl laut Doku es so passen sollte wie ich es mache…

Ich möchte nur wissen wo die Differenzen herkommen…

1 „Gefällt mir“

Warum springt der Zählerstand in dem Screenshot denn zurück? Das finde ich ja etwas auffällig…

Oder ist das gar kein Zähler sondern Momentanverbrauch? Dann sollte die Einheit aber wohl kW sein oder?

Fängst du jeden Tag um 00:00 wieder bei null an zu zählen?

Das ist nur eine Variable zum testen, die habe ich extra angelegt.
Die fängt auch bei 0 an.
Das sollte aber egal sein.

Die richtige Variable fängt nicht bei 0 an, diese zählt seit dem 1. Tag mit PV Anlage hoch.

Bei beiden Variablen aber exakt das gleiche Verhalten.

Hier die Datensätze der Originalvariable.

erster Tageswert - letzter Wert heute = Eigenverbrauch heute
2067,98 -2066,56 = 1,42 kWh

Stimmt auch mit Stephans PV Kachel zusammen.

grafik

Mit dem Code bekomme ich viel mehr raus, also die Abweichung ist nicht gerade gering.

//test
$Eigenverbrauch = 40830;
 //Eigenverbrauch PV Anlage nach Schnellwahl
        $Eigenverbrauch_kWh_roh = AC_GetAggregatedValues($Archiv, $Eigenverbrauch, 0 ,strtotime("today 00:00:00"), strtotime("today 23:59:59"), 0);
        foreach($Eigenverbrauch_kWh_roh as $Gesamt) {
            $Eigenverbrauch_Avg[] = $Gesamt['Avg'];
        }
        //Array auf Inhalt prüfen 
        if (!empty($Eigenverbrauch_Avg)) 
        {
        $Eigenverbrauch_kWh = array_sum($Eigenverbrauch_Avg);
        }
var_dump($Eigenverbrauch_kWh);

var_dump($Eigenverbrauch_kWh_roh);

Ausgabe von var_dump

float(1.91162109375)
array(12) {
  [0]=>
  array(7) {
    ["Duration"]=>
    int(1926)
    ["TimeStamp"]=>
    int(1714986000)
    ["Avg"]=>
    float(0.270751953125)
    ["MinTime"]=>
    int(1714986120)
    ["Min"]=>
    float(0.000244140625)
    ["MaxTime"]=>
    int(1714987140)
    ["Max"]=>
    float(0.0400390625)
  }
  [1]=>
  array(7) {
    ["Duration"]=>
    int(3600)
    ["TimeStamp"]=>
    int(1714982400)
    ["Avg"]=>
    float(0.42138671875)
    ["MinTime"]=>
    int(1714982940)
    ["Min"]=>
    float(0.000244140625)
    ["MaxTime"]=>
    int(1714985700)
    ["Max"]=>
    float(0.020263671875)
  }
  [2]=>
  array(7) {
    ["Duration"]=>
    int(3600)
    ["TimeStamp"]=>
    int(1714978800)
    ["Avg"]=>
    float(0.373046875)
    ["MinTime"]=>
    int(1714981260)
    ["Min"]=>
    float(0.000244140625)
    ["MaxTime"]=>
    int(1714980720)
    ["Max"]=>
    float(0.020263671875)
  }
  [3]=>
  array(7) {
    ["Duration"]=>
    int(3600)
    ["TimeStamp"]=>
    int(1714975200)
    ["Avg"]=>
    float(0.31396484375)
    ["MinTime"]=>
    int(1714975440)
    ["Min"]=>
    float(0.000244140625)
    ["MaxTime"]=>
    int(1714978500)
    ["Max"]=>
    float(0.029052734375)
  }
  [4]=>
  array(7) {
    ["Duration"]=>
    int(3600)
    ["TimeStamp"]=>
    int(1714971600)
    ["Avg"]=>
    float(0.312744140625)
    ["MinTime"]=>
    int(1714972140)
    ["Min"]=>
    float(0.000244140625)
    ["MaxTime"]=>
    int(1714972740)
    ["Max"]=>
    float(0.02001953125)
  }
  [5]=>
  array(7) {
    ["Duration"]=>
    int(3600)
    ["TimeStamp"]=>
    int(1714968000)
    ["Avg"]=>
    float(0.2197265625)
    ["MinTime"]=>
    int(1714969740)
    ["Min"]=>
    float(0.00927734375)
    ["MaxTime"]=>
    int(1714969920)
    ["Max"]=>
    float(0.0107421875)
  }
  [6]=>
  array(7) {
    ["Duration"]=>
    int(3600)
    ["TimeStamp"]=>
    int(1714964400)
    ["Avg"]=>
    float(0)
    ["MinTime"]=>
    int(1714967945)
    ["Min"]=>
    float(0)
    ["MaxTime"]=>
    int(1714964400)
    ["Max"]=>
    float(0)
  }
  [7]=>
  array(7) {
    ["Duration"]=>
    int(3600)
    ["TimeStamp"]=>
    int(1714960800)
    ["Avg"]=>
    float(0)
    ["MinTime"]=>
    int(1714964344)
    ["Min"]=>
    float(0)
    ["MaxTime"]=>
    int(1714960800)
    ["Max"]=>
    float(0)
  }
  [8]=>
  array(7) {
    ["Duration"]=>
    int(3600)
    ["TimeStamp"]=>
    int(1714957200)
    ["Avg"]=>
    float(0)
    ["MinTime"]=>
    int(1714960744)
    ["Min"]=>
    float(0)
    ["MaxTime"]=>
    int(1714957200)
    ["Max"]=>
    float(0)
  }
  [9]=>
  array(7) {
    ["Duration"]=>
    int(3600)
    ["TimeStamp"]=>
    int(1714953600)
    ["Avg"]=>
    float(0)
    ["MinTime"]=>
    int(1714957144)
    ["Min"]=>
    float(0)
    ["MaxTime"]=>
    int(1714953600)
    ["Max"]=>
    float(0)
  }
  [10]=>
  array(7) {
    ["Duration"]=>
    int(3600)
    ["TimeStamp"]=>
    int(1714950000)
    ["Avg"]=>
    float(0)
    ["MinTime"]=>
    int(1714953544)
    ["Min"]=>
    float(0)
    ["MaxTime"]=>
    int(1714950000)
    ["Max"]=>
    float(0)
  }
  [11]=>
  array(7) {
    ["Duration"]=>
    int(3600)
    ["TimeStamp"]=>
    int(1714946400)
    ["Avg"]=>
    float(0)
    ["MinTime"]=>
    int(1714949944)
    ["Min"]=>
    float(0)
    ["MaxTime"]=>
    int(1714946400)
    ["Max"]=>
    float(0)
  }
}

Auch im Webfront wird zuviel angezeigt…

Ich hoffe ihr versteht jetzt was ich meine?
Dann stimmt doch die Doku zu „Avg“ nicht und die Balkendiagramme zeigen auch zu viel an…

Ich denke hier ist der Hund begraben.

grafik

Es wird nicht immer sauber hochgezählt.
Also kommen da zuviele positive Deltas zusammen und der Wert wird zu groß.

Muss mal schauen, warum das Verhalten überhaupt auftritt und ob ich das verhindern kann.

Ich denke wir brauchen zusätzlich zu „keine null und negative Werte“ noch die Option nur Werte gleich/größer wie vorheriger Wert…

Da stimme ich Stephan zu.

Das Problem bei ist folgendes.
Diese Variable Eigenverbrauch wird ja aus zwei Variablen berechnet und anschließend neu beschrieben.
Jetzt kommt die erzeugte Wirkarbeit aus meinen Wechselrichter über Modbus zur Wago SPS und dann erst über Modbus zu Symcon.
Die gelieferte Wirkenergie kommt über Modbus seriell an die Wago SPS und wird über einen komplett unterschiedlichen Registerblock dann wieder von IPS abgefragt und da enstehen die Inkonsistenzen.

Mal schauen wie ich das löse…

glaube das einfachste ist es wenn du auf das Update vom Entkoppler Modul vom Dennis wartest. Er wollte da ja noch ein paar Filterfunktionen einbauen. Damit dürfte sich das Problem dann erledigt haben.

Gruß Stephan

2 „Gefällt mir“