Hallo,
ich möchte mir gerne aus den Archivdaten von Variablen meines Wechselrichters einige Tages und Monats Werte errechnen für den tatsächlichen Stromverbrauch. Der Wechselrichter hat Werte für den Ertrag, Einspeisung u. Netzverbrauch (Tag/Monat).
Die jetzigen Werte habe ich seit gestern folgender Maßen errechnet:
$idVariableErtag = 42753; //Variable Gesamt Ertrag am Tag
$idVariableEinspeisung = 41947; //Variable Einspeisung am Tag
$idVariableNetzverbrauch = 38959; //Variable Netzverbrauch am Tag
$result = (GetValue($idVariableErtag) - GetValue($idVariableEinspeisung) + GetValue($idVariableNetzverbrauch)) /1000; //Ergebnis des Gesamt Stromverbrauches am Tag in kWh
SetValue(56343, $result); //Errechneten Wert in die Variable schreiben
Jetzt komme ich aber nicht weiter wie das Skript aussehen muss um mir Tag X/Monat X aus meinen geloggten Werten zu errechnen.
Die einfache Sache für den Ertrag/Einspeisung etc. errechne ich mit dem Modul „Verbrauch in Zeitspanne“, aber damit kann ich ja nicht den tatsächlichen Stromverbrauch anzeigen lassen.
Moin Moin,
Danke dir für das Skript. Habe schon mal den gestrigen Wert errechnet damit und funktioniert so. Wenn ich aber einen anderen Tag machen möchte wie passe ich das Skript an das er mir z.B. den 12.07.2022 errechnet. Das wird ja hier angegeben denke ich mal:
Edit: Habe mal gerade wieder in der Doku geschaut und passe mal das Skript an und versuche es z.B. für ein Jahr.
$werte = AC_GetLoggedValues(12345, 55554, mktime(0, 0, 0, 1, 1, 2013), mktime(23, 59, 59, 1, 7, 2013), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
Mit einer Zeile über ein Jahr wird es Probleme geben, da das Limit erreicht wird.
Da müsste man eher für den ersten Tag und für den letzten Tag die Werte holen und dann eben vom ersten Tag den ersten Wert und vom letzten Tag den letzten Wert verrechnen.
Um die Abfrage weniger belastend für das System zu machen könnte man die Zeit noch einschränken - da kommt es drauf an, wie oft neue Werte im Archiv aufkommen wenn z.B. Nachts kein neuer Ertragswert kommt.
Was ich noch machen könnte das ich die Werte immer Monat für Monat nehme, was mir ja eigentlich reichen würde. Wer braucht schon den Verbrauch von jedem Tag.
Werte Starttag: 0
Notice: Undefined offset: -1 in /var/lib/symcon/scripts/59704.ips.php on line 15
Notice: Trying to access array offset on value of type null in /var/lib/symcon/scripts/59704.ips.php on line 15
Erster Wert:
Notice: Undefined offset: 0 in /var/lib/symcon/scripts/59704.ips.php on line 18
Notice: Trying to access array offset on value of type null in /var/lib/symcon/scripts/59704.ips.php on line 18
Letzer Wert:
Differenz: 0
Ja, stimmt. Die Anlage läuft ja erst seit 10/2021, aber nimmt er dann nicht automatisch das nächstmögliche Datum das Werte enthält?
Habe es mal angepasst:
$werte_start = AC_GetLoggedValues(13449, 14939, strtotime("2022-07-01 00:00:00"), strtotime("2022-07-01 23:59:59"), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
$werte_ende = AC_GetLoggedValues(13449, 14939, strtotime("2022-07-31 00:00:00"), strtotime("2022-07-31 23:59:59"), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
Hab vielleicht die falsche Variable gewählt. Habe jetzt mal die betroffene Variable eingefügt.
Die Gesamt Ertrag Variable wird als Zähler geloggt.
Die beiden anderen Gesamt Einspeisung und Gesamt Netzverbrauch werden nicht als Zähler geloggt. Alle liegen als Tageswerte vor.
Jetzt das Skript mit dem Gesamt Ertrag für den Monat Juli:
<?php
$ArchiveList = IPS_GetInstanceListByModuleID("{43192F0B-135B-4CE7-A0A7-1475603F3060}"); // Archivinstanzen abrufen
$ArchiveID = $ArchiveList[0]; // !!! Es wird die erste gefundene Archivinstanz verwendet
//Alle gestrigen Datensätze abfragen
$werte_start = AC_GetLoggedValues(13449, 51246, strtotime("2022-07-01 00:00:00"), strtotime("2022-07-01 23:59:59"), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
$werte_ende = AC_GetLoggedValues(13449, 51246, strtotime("2022-07-31 00:00:00"), strtotime("2022-07-31 23:59:59"), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
//print_r($werte);
$anzahl_start = count($werte_start); // Anzahl an Werten im Archiv
echo "Werte Starttag: ".$anzahl_start.PHP_EOL;
$start = $werte_start[$anzahl_start-1]['Value']; // Erster Tageswert
echo "Erster Wert: ".$start.PHP_EOL;
$ende = $werte_ende[0]['Value']; // Letzer Tageswert
echo "Letzer Wert: ".$ende.PHP_EOL;
$diff = $ende - $start; // Differenz berechnen
echo "Differenz: ".$diff.PHP_EOL;
$result = $diff /1000;
SetValue(42249, $diff);
SetValue(18413, $result);
Von den Werten her sind es Zähler. Ich würde hier auch die Aggregation auf Zähler ändern, das geht jederzeit und kann auch rückgängig gemacht werden. Bei Aggregation Standard würde man ja ein Liniendiagramm bekommen, welches kontinuierlich ansteigt. Mit Zähler bekommt man Balkendiagramme mit denen man schon mal schön den Ertrag für Stunde/Tag/Woche, usw bekommt.