Hallo,
wollte euch hier das fertige Skript einstellen das von Stefan (@steppe) geschrieben wurde. Herzlichen Dank nochmal hierfür an Stefan, für seine geduldige Zeit und hat mich gebeten dieses einzustellen.
Ausgangspunkt war, das ich den tatsächlichen Stromverbrauch errechnen wollte vom Haus, aus den Daten aus dem Archiv. Mir stehen folgende Daten zur Verfügung:
Ertrag
Einspeisung
Netzverbrauch
Wobei dieses Ergebnis ohne Berücksichtigung von den Verlusten berechnet wird. Wahlweise erfolgt dieses in Wh oder kWh.
Eine Float Variable anlegen als Ziel Variable und dann das „Skript für den ersten Durchlauf“ starten.
Skript für den ersten Durchlauf:
<?php
//Achtung!!! Daten der Zielvariable werden beim ersten Durchlauf vollständig gelöscht!
$debug = TRUE;
$ErtragID = 51246 ; //Variable Ertrag vom Wechselrichter
$BezogenID = 10772; //Variable Netzverbrauch vom Wechselrichter
$GeliefertID = 35359; //Variable Einspeisung vom Wechselrichter
$TargetID = 15191; //Zielvariable in der die Daten geschrieben werden
$StartDate="01.01.2022"; //Für den ersten Durchlauf, Start Datum wählen
$ArchiveList = IPS_GetInstanceListByModuleID("{43192F0B-135B-4CE7-A0A7-1475603F3060}"); // Archivinstanzen abrufen
$ArchiveID = $ArchiveList[0]; //Achtung!!! Es wird die erste gefundene Archivinstanz verwendet
// -------------------------------- Ende Konfigurationsteil -----------------------------------------
if ($debug){$beginn = microtime(true); };
$d = 0;
$verbrauch_alt = 0;
$start = new DateTimeImmutable($StartDate);
$starttime = strtotime($start->format('Y-m-d H:i:s'));
AC_DeleteVariableData($ArchiveID, $TargetID, 0, 0);
if ($debug){echo "Archivdaten gelöscht".PHP_EOL;}
AC_SetLoggingStatus($ArchiveID , $TargetID, true);
while ($starttime < strtotime('-2 day')){
$datetime = $start->modify('+'.$d.' day');
$starttime = strtotime($datetime->format('Y-m-d 00:00:00'));
$endtime = strtotime($datetime->format('Y-m-d 23:59:59'));
if ($debug){echo "Starttime: ".date('d.m.Y H:i:s', $starttime).PHP_EOL;};
$logErtrag = AC_GetLoggedValues($ArchiveID, $ErtragID, $starttime, $endtime, 0); //Datensätze abfragen
$entriesErtrag = count($logErtrag);// Anzahl der Werte
//if ($debug){echo "Einträge: ".$entriesErtrag.PHP_EOL;};
if ($entriesErtrag >0) {
$ertrag = $logErtrag[0]['Value'];
$logBezogen = AC_GetLoggedValues($ArchiveID, $BezogenID, $starttime, $endtime, 0); //Datensätze abfragen
$entriesBezogen = count($logBezogen); //Anzahl der Werte
//if ($debug){echo "Einträge: ".$entriesBezogen.PHP_EOL;};
if ($entriesBezogen >0) {
$bezogen = $logBezogen[0]['Value'];
$logGeliefert = AC_GetLoggedValues($ArchiveID, $GeliefertID, $starttime, $endtime, 0); //Datensätze abfragen
$entriesGeliefert = count($logGeliefert); //Anzahl der Werte
//if ($debug){echo "Einträge: ".$entriesGeliefert.PHP_EOL;};
if ($entriesGeliefert >0) {
$geliefert = $logGeliefert[0]['Value'];
if (isset($geliefert_alt) === FALSE){
$ertrag_alt = $logErtrag[$entriesErtrag-1]['Value'];
$geliefert_alt = $logGeliefert[$entriesGeliefert-1]['Value'];
$bezogen_alt = $logBezogen[$entriesBezogen-1]['Value'];
}
$verbrauch = (($ertrag - $ertrag_alt) - ($geliefert - $geliefert_alt) + ($bezogen - $bezogen_alt)) /1000; //Ergebnis des Gesamt Stromverbrauches am Tag in kWh, Umrechnung von Wh in kWh
//$verbrauch = (($ertrag - $ertrag_alt) - ($geliefert - $geliefert_alt) + ($bezogen - $bezogen_alt)) *1000; //Ergebnis des Gesamt Stromverbrauches am Tag in Wh, Umrechnung von kWh zu Wh
if ($debug){echo "Ertrag: ".($ertrag - $ertrag_alt).PHP_EOL;}
if ($debug){echo "Bezogen: ".($bezogen - $bezogen_alt).PHP_EOL;}
if ($debug){echo "Geliefert: ".($geliefert - $geliefert_alt).PHP_EOL;}
$ertrag_alt = $ertrag;
$geliefert_alt = $geliefert;
$bezogen_alt = $bezogen;
if ($debug){echo "Verbrauch: ".$verbrauch.PHP_EOL;}
$timestamp = $logBezogen[0]['TimeStamp'];
$timestamp_gel = $logGeliefert[0]['TimeStamp'];
if ($timestamp_gel > $timestamp){
$timestamp = $timestamp_gel;
}
$timestamp_ert = $logErtrag[0]['TimeStamp'];
if ($timestamp_ert > $timestamp){
$timestamp = $timestamp_ert;
}
$verbrauch = $verbrauch_alt + $verbrauch;
if ($debug){echo "Timestamp: ".$timestamp.PHP_EOL;}
AC_AddLoggedValues ($ArchiveID, $TargetID, [['TimeStamp' => $timestamp,'Value' => $verbrauch]]);
$verbrauch_alt = $verbrauch;
}
}
}
$d++;
if ($debug){echo "-------------------------------".PHP_EOL;};
}
AC_SetAggregationType ($ArchiveID, $TargetID, 1);
AC_ReAggregateVariable ($ArchiveID, $TargetID);
if ($debug){
$dauer = round(microtime(true) - $beginn,2);
echo "Verarbeitung des Skripts: $dauer Sek.";
}
setvalue($TargetID,$verbrauch);
Das „laufende“ Skript mit einem Ereignis versehen, das dass Skript stündlich aufgerufen wird.
Laufende Skript:
<?php
$ErtragID = 51246 ; //Variable Ertrag vom Wechselrichter
$BezogenID = 10772; //Variable Netzverbrauch vom Wechselrichter
$GeliefertID = 35359; //Variable Einspeisung vom Wechselrichter
$TargetID = 15191; //Zielvariable (Float) in der die Daten geschrieben werden
$ertrag_alt = ReadInteger("Ertrag_alt");
$bezogen_alt = ReadInteger("Bezogen_alt");
$geliefert_alt = ReadInteger("Geliefert_alt");
$ertrag = GetValueInteger($ErtragID);
$bezogen = GetValueInteger($BezogenID);
$geliefert = GetValueInteger($GeliefertID);
//$ertrag = GetValueFloat($ErtragID);
//$bezogen = GetValueFloat($BezogenID);
//$geliefert = GetValueFloat($GeliefertID);
if ($ertrag_alt != 0 and $bezogen_alt != 0 and $geliefert_alt != 0){
//$verbrauch = (($ertrag - $ertrag_alt) - ($geliefert - $geliefert_alt) + ($bezogen - $bezogen_alt)) *1000; //Ergebnis des Gesamt Stromverbrauches am Tag in Wh
$verbrauch = (($ertrag - $ertrag_alt) - ($geliefert - $geliefert_alt) + ($bezogen - $bezogen_alt)) /1000; //Ergebnis des Gesamt Stromverbrauches am Tag in kWh
$verbrauch_alt = GetValue($TargetID);
$verbrauch = $verbrauch_alt + $verbrauch;
SetValue($TargetID,$verbrauch);
echo $verbrauch;
}
WriteInteger("Ertrag_alt",$ertrag);
WriteInteger("Bezogen_alt",$bezogen);
WriteInteger("Geliefert_alt",$geliefert);
//WriteFloat("Ertrag_alt",$ertrag);
//WriteFloat("Bezogen_alt",$bezogen);
//WriteFloat("Geliefert_alt",$geliefert);
function ReadInteger($Name)
{
$result = preg_replace("/[^a-zA-Z0-9]+/", "", $Name);
$varID = @IPS_GetObjectIDByIdent($result, $_IPS['SELF']);
if ($varID == FALSE){
return 0;
}
return getvalue($varID);
}
function WriteInteger($Name, $Value)
{
$result = preg_replace("/[^a-zA-Z0-9]+/", "", $Name);
$varID = @IPS_GetObjectIDByIdent($result, $_IPS['SELF']);
if ($varID == FALSE){
$varID = IPS_CreateVariable(1); //Integer
IPS_SetName($varID, $Name); //Variable benennen
IPS_SetParent($varID, $_IPS['SELF']); //Variable einsortieren
IPS_SetIdent ($varID, $result);
}
setvalue($varID,$Value);
}
function WriteFloat($Name, $Value)
{
$result = preg_replace("/[^a-zA-Z0-9]+/", "", $Name);
$varID = @IPS_GetObjectIDByIdent($result, $_IPS['SELF']);
if ($varID == FALSE){
$varID = IPS_CreateVariable(2); //Float
IPS_SetName($varID, $Name); //Variable benennen
IPS_SetParent($varID, $_IPS['SELF']); //Variable einsortieren
IPS_SetIdent ($varID, $result);
}
setvalue($varID,$Value);
}