Brovning / e3dc

IP-Symcon (IPS) Modul für E3DC Stromspeicher mit Modbus TCP Unterstützung (bspw. S10 mini, S10 E, S10 E Pro und Quattroporte).
9 stars 1 forks source link

Tageswerte loggen #4

Closed cfis72 closed 4 years ago

cfis72 commented 5 years ago

Per Modbus sind nur die Momentanwerte verfügbar. Das Portal, in dem die dort angezeigten Werte berechnet werden, ist nicht per API erreichbar. Aktuell mache ich das mit einem Skript das bei jeder Änderung der Momentanwerte den Tageswert seit der letzten Aktualisierung der Variable um den entsprechenden Wert erhöht. Täglich um 23:59 werden die Werte per Skript weggespeichert und die Werte wieder auf 0 gesetzt. Die errechneten Werten stimmen ziemlich genau mit den Werten aus dem E3DC Portal überein.

Das Ziel ist es Auswertungen wie im E3DC Portal zu machen. So sieht das bei mir momentan aus:

image

Wäre cool wenn das Modul das machen könnte.

viele Grüße, Christian

Brovning commented 5 years ago

Hallo, das Skript, welches im IP-Symcon Forum gepostet wurde kenne ich. Hierzu habe ich mir auch schon Gedanken. Wenn meine Idee klappt, hätte ich hier eine bessere Lösung im Peto, welche bereits auf meiner ToDo-Liste steht. So etwas werde ich definitiv zeitnah noch umsetzen.

Brovning commented 4 years ago

Hallo Christian,

ich bin gerade dabei die verschiedenen Wh/kWh Werte zu berechnen, daher hätte ich noch Fragen an dich.

Täglich um 23:59 werden die Werte per Skript weggespeichert und die Werte wieder auf 0 gesetzt.

Wohin speicherst du die Tageswerte weg und was machst du weiter mit diesen? Loggst du die einzelnen Tageswerte? Was möchtest du visualisieren bzw. welche Werte visualisierst du aktuell? In welchem Intervall liest du den Modbus aus? Welche Werte loggst du?

Gruß

Jürgen

cfis72 commented 4 years ago

Hallo Jürgen,

"Wohin speicherst du die Tageswerte weg und was machst du weiter mit diesen?" Die Werte werden in andere Variablen gespeichert, die wiederum geloggt werden. Das Ziel war / ist die Tageswerte in Balkendiagrammen, ähnlich im E3DC Portal darzustellen, um z.B. monatliche und jährliche Auswertungen zu machen.

"In welchem Intervall liest du den Modbus aus?" Ich logge einmal pro Sekunde. Performanceprobleme gibt es damit nicht.

Für mein Chart logge ich zusätzlich noch Minutenwerte, da die Sekundenwerte zuviel für die Chartdarstellung waren.

So sieht die Chartdarstellung zur Zeit aus (ist noch nicht fertig) : image

Grüße, Christian

Brovning commented 4 years ago

Das heißt du speicherst dir bspw. um 23:59 Uhr die aktuellen Tageswerte in eine separate Variable, die gelogged wird und die stetig berechneten Tageswerte werden nicht gelogged? Machst du das gleiche je Monat und Jahr?

Woher erhältst du die Solarprognose?

cfis72 commented 4 years ago

Das heißt du speicherst dir bspw. um 23:59 Uhr die aktuellen Tageswerte in eine separate Variable, die gelogged wird und die stetig berechneten Tageswerte werden nicht gelogged?

Ja, genau. die stetig berechneten Tageswerte sind ja nur ein Zähler der1) die Tageswerte berechnet und 2) eine aktuelle Anzeige in der Visualisierung liefert.

Machst du das gleiche je Monat und Jahr?

Nur pro Tag, aber es würde Sinn machen pro Monat und Jahr auch separat zu loggen.

Woher erhältst du die Solarprognose?

Die Solarprognose kommt von einem Skript das die API von http://forecast.solar benutzt, also nicht von E3DC. Das war die einzigste kostenlose Möglichkeiten an eine Solarprognose zu kommen.

Wenn du die Solarprognose ins Modul übernehmen möchtest, kann ich gerne das Skript zur Verfügung stellen. Die API ist aber ziemlich simpel, es wird ein JSON zurückgeliefert.

Brovning commented 4 years ago

Stimmt die Vorhersage von Forecast.Solar bei dir halbwegs? Bei mir passt das ja überhaupt nicht. 2019-12-22 | 20597 --> Heute hatte ich eine Produktion von 7,5 kWh und nicht von 20,5 kWh 2019-12-23 | 12577

Oder muss man die API morgens aufrufen? Mal sehen, ob die Vorhersage für Morgen besser hinkommt.

Brovning commented 4 years ago

Hallo Christian,

ich bin jetzt so gut wie fertig. Könntest du bitte das nachfolgende Skript mit deiner PV-Variable laufen lassen, welche du einmal pro Sekunde loggen lässt und mir die Ausgabe der Skriptlaufzeit hier posten? Du müsstest noch in den ersten beiden Zeilen deine Archiv-ID und die Variablen-ID angeben: `$ArchiveID = --ARCHIV-ID--; $ID = --VARIABLEN-ID--;

$startzeit = microtime(true); // Startzeit $MStartDate = mktime(0,0,0, date("m"), date("j")-365, date("Y")); $MEndDate = mktime(23,59,59, date("m"), date("j")-1, date("Y")); $ah_ID = $ArchiveID; $p_ts = $MStartDate; $p_te = $MEndDate; $i_max = (int)round(($p_te - $p_ts)/(606024), 0); for($i=0; $i<$i_max; $i++) { $ts = mktime(0,0,0,date("m", $p_ts),date("d", $p_ts) + $i,date("Y", $p_ts)); $te = mktime(23,59,59,date("m", $p_ts),date("d", $p_ts) + $i,date("Y", $p_ts)); $Data = AC_GetLoggedValues($ah_ID,$ID,$ts,$te,5000);

foreach($Data as $key=>$v)
{
    $Data[$key]['TimeStamp_humanDate']      = date("d.m.Y H:i:s", $v['TimeStamp']);
}
$Raw = array_reverse($Data);

$RawCount = count($Raw)-1;
foreach($Raw as $key=>$v)
{
    if(0 == $key)
    {
        $Count = 0;
        $i_Flag = date("i", $v['TimeStamp']);
        $i_TimeStart = $v['TimeStamp']+3;
        $i_TimeEnd = $v['TimeStamp'];
    }

    if(0 < $key)
    {
        if($i_Flag == date("i", $v['TimeStamp']))
        {
            $Count++;
            $i_TimeEnd = $v['TimeStamp'];
        }
        else
        {
            $Count            = 0;
            $i_Flag             = date("i", $v['TimeStamp']);
            $i_TimeStart             = $v['TimeStamp']+3;
            $i_TimeEnd             = $v['TimeStamp'];
        }

        if(($Count > 0) && ($RawCount == $key))
        {
            $i_TimeEnd             = $v['TimeStamp'];
        }
    }
}

} $stopzeit = microtime(true); // Stopzeit $laufzeit = ($stopzeit-$startzeit)*1000; // Berechnung $laufzeit = substr($laufzeit, 0, 5); // Auf 5 Stellen begrenzen echo "Scriptlaufzeit: ".$laufzeit." Millisekunden"; // Ausgabe`

cfis72 commented 4 years ago

Hallo,

hier das Ergebnis des Skripts: Scriptlaufzeit: 1,598 Millisekunden Die Werte schwanken zwischen 1,5 und 2,8 Millisekunden.

Seit der Umstellung auf dein Modul wird das Skript zum Berechnen der Tageswerte nur bei Änderungen der PV-Variable ausgeführt, nicht mehr einmal pro Sekunde. Da sich der Wert (tagsüber) fast jede Sekunde ändert macht das aber wahrscheinlich kein Unterschied?

Brovning commented 4 years ago

Hallo Christian,

vielen Dank!

Ich habe bei mir viel herum probiert mit dem Auslese-Intervall. Meiner Meinung nach ist die Genauigkeit mit einem 10 Sekunden Auslese-Intervall ausreichend.

cfis72 commented 4 years ago

Bei wechselhaften Wetter wäre ich mir nicht sicher ob die Genauigkeit bei 10 Sekunden Auslese-Intervall noch ausreichend ist. Bei normalem Wetter mit gleichbleibendem Solarertrag schon. Die Solarprognose stimmt bei mir meistens auch nicht.