Tages u. Monatswerte aus dem Archiv für den tatsächlichen Stromverbrauch errechnen

Normal sollten, wenn du das „Laufende Skript“ das erste mal ausgeführt hast, die Variablen angelegt werden. Ich würde das Skript stündlich ausführen.
Die angelegte Variable Ertrag_alt müsste in etwa dem Wert deines Screenshots entsprechen. Da kannst du dann den letzten Archivwert deines Ertrags nehmen - im Screenshot wäre es 9113747 und änderst Ertrag_alt auf diesen Wert. Das machst du für alle drei „alt“ Variablen.

Deinen Tagesverbrauch kannst du dann schön im Balkendiagramm der neuen Verbrauchsvariable sehen.

Ich wollte wieder von vorne beginnen, aber ich weiß nicht welche Werte ich nehmen soll um die in den Variablen zu ändern. Du schriebst ja oben nichts ausrechnen.

So sieht das bei mir jetzt aus:

Er hat mir beim Archiv oben auch eine utopische Zahl rein geschrieben.

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);
}