Hallo,
ich habe hier ein Skript zusammengebastelt, was der ein oder andere vielleicht brauchen kann.
Das Skript nimmt eine Zählervariable (kWh) aus dem Archiv und berechnet die Kosten (ohne Grundgebühr) über die Zeit und schreibt das Ergebnis in eine neue Variable (Euro). Diese lässt sich dann als Balkengrafik schön im Webfront darstellen.
Es sind noch ein paar Änderungen geplant, aber ob und wann diese kommen, kann ich nicht sagen, daher der aktuelle Stand des Skripts hier zum ausprobieren.
<?php
// Achtung!!! Daten der Zielvariable werden vollständig gelöscht!
$debug = FALSE;
$SourceID = 37629 ; // Variable mit Zählerwert in kWh
$TargetID = 22726; // Zielvariable Float mit Profil ~Euro
$ArchiveList = IPS_GetInstanceListByModuleID("{43192F0B-135B-4CE7-A0A7-1475603F3060}"); // Archivinstanzen abrufen
$ArchiveID = $ArchiveList[0]; // !!! Es wird die erste gefundene Archivinstanz verwendet
$PriceArray=[['01.01.2021','0.2388'],['01.02.2021','0.2375'],['01.03.2021','0.24'],['01.04.2021','0.2401'],['01.05.2021','0.2394'],['01.06.2021','0.2479'],['01.07.2021','0.259'],['01.08.2021','0.2692'],['01.09.2021','0.2865'],['01.10.2021','0.35']]; // Es wird keine Sortierung des Arrays vorgenommen - Daten müssen mit dem Datum aufsteigend eingetragen werden
$StartDate="01.01.2021";
// -------------------------------- Ende Konfigurationsteil -----------------------------------------
$totaldiff = 0.0;
$eurovalue = 0.0;
$oldvalue = 0.0;
$price = 0.0;
$d = 0;
$beginn = microtime(true);
$start = new DateTimeImmutable($StartDate);
$starttime = strtotime($start->format('Y-m-d H:i:s'));
AC_DeleteVariableData($ArchiveID, $TargetID, 0, 0);
AC_SetLoggingStatus($ArchiveID , $TargetID, true);
while ($starttime < strtotime('today')){
for ($cnt = 0;$cnt < count($PriceArray);$cnt++ ){
$pricedate = strtotime($PriceArray[$cnt][0]);
if ($pricedate >= $starttime){
$price = $PriceArray[$cnt][1];
break;
}
}
$datetime = $start->modify('+'.$d.' day');
$starttime = strtotime($datetime->format('Y-m-d H:i:s'));
$datetime = $datetime->modify('+1 day');
$endtime = strtotime($datetime->format('Y-m-d H:i:s'));
if ($debug){echo "Starttime: ".date('d.m.Y H:i:s', $starttime).PHP_EOL;};
$logData = AC_GetLoggedValues($ArchiveID, $SourceID, $starttime, $endtime, 0); //Datensätze abfragen
$entries = count($logData);// Anzahl der Werte
if ($debug){echo "Einträge: ".$entries.PHP_EOL;};
if ($entries >0) {
if ($debug){echo "Oldvalue: ".$oldvalue.PHP_EOL;};
if ($debug){echo "Kleinster: ".$logData[$entries-1]['Value'].PHP_EOL;};
if ($debug){echo "Größter: ".$logData[0]['Value'].PHP_EOL;};
for ($i = $entries; $i > 2; $i--){
if ($oldvalue == 0 ) {
$oldvalue = $logData[$i-1]['Value'];
}
$diff1 = $logData[$i - 2]['Value']-$oldvalue;
if ($diff1 >= 1){
if ($debug){echo "Diff: ".$diff1.PHP_EOL;};
if ($debug){echo "Oldvalue: ".$oldvalue.PHP_EOL;};
$timestamp = $logData[$i - 2]['TimeStamp'];
$oldvalue = $logData[$i - 2]['Value'];
$eurovalue = $eurovalue + $diff1*$price;
$totaldiff = $totaldiff + $diff1;
AC_AddLoggedValues ($ArchiveID, $TargetID, [['TimeStamp' => $timestamp,'Value' => $eurovalue]]);
}
}
}
$d++;
if ($debug){echo "-------------------------------".PHP_EOL;};
}
// Letzte differenz
if ($debug){echo "Letzte Diff: ".$diff1.PHP_EOL;};
$timestamp = $logData[$i - 2]['TimeStamp'];
$oldvalue = $logData[$i - 2]['Value'];
$eurovalue = $eurovalue + $diff1*$price;
$totaldiff = $totaldiff + $diff1;
AC_AddLoggedValues ($ArchiveID, $TargetID, [['TimeStamp' => $timestamp,'Value' => $eurovalue]]);
if ($debug){echo "Totaldiff: ".$totaldiff.PHP_EOL;};
if ($debug){echo "Gesamtkosten: ".$eurovalue.PHP_EOL;};
SetValueFloat($TargetID,$eurovalue);
AC_SetAggregationType ($ArchiveID, $TargetID, 1);
AC_ReAggregateVariable ($ArchiveID, $TargetID);
$dauer = round(microtime(true) - $beginn,2);
echo "Verarbeitung des Skripts: $dauer Sek.";
?>