diff --git a/Abrechnung/module.php b/Abrechnung/module.php index 354effe..4ab5444 100644 --- a/Abrechnung/module.php +++ b/Abrechnung/module.php @@ -225,27 +225,43 @@ private function GetValueAt(int $varId, int $timestamp, bool $nearestAfter = tru return null; } + $maxDays = 365; // 🔹 maximal 1 Jahr zurück / vor suchen + $stepDays = 7; // 🔹 Schrittweise Erweiterung (jeweils 7 Tage) + $valueFound = null; + if ($nearestAfter) { - // 🔹 Suche den ersten Wert nach dem gegebenen Zeitpunkt - $values = @AC_GetLoggedValues($archiveID, $varId, $timestamp, $timestamp + 7 * 86400, 1000); - if (!empty($values)) { - foreach ($values as $v) { - if ($v['TimeStamp'] >= $timestamp) { - return floatval($v['Value']); + for ($offset = 0; $offset <= $maxDays; $offset += $stepDays) { + $from = $timestamp + $offset * 86400; + $to = $from + $stepDays * 86400; + $values = @AC_GetLoggedValues($archiveID, $varId, $from, $to, 1000); + if (!empty($values)) { + foreach ($values as $v) { + if ($v['TimeStamp'] >= $timestamp) { + $valueFound = floatval($v['Value']); + break 2; + } } } } } else { - // 🔹 Suche den letzten Wert vor dem gegebenen Zeitpunkt - $values = @AC_GetLoggedValues($archiveID, $varId, $timestamp - 7 * 86400, $timestamp, 1000); - if (!empty($values)) { - return floatval($values[count($values) - 1]['Value']); + for ($offset = 0; $offset <= $maxDays; $offset += $stepDays) { + $from = $timestamp - ($offset + $stepDays) * 86400; + $to = $timestamp - $offset * 86400; + $values = @AC_GetLoggedValues($archiveID, $varId, $from, $to, 1000); + if (!empty($values)) { + $valueFound = floatval($values[count($values) - 1]['Value']); + break; + } } } - // Fallback – aktuellen Variablenwert nehmen + if ($valueFound !== null) { + return $valueFound; + } + + // ❗ Fallback, wenn gar nichts im Archiv gefunden wird $fallback = floatval(GetValue($varId)); - IPS_LogMessage('Abrechnung', "⚠ Kein Archivwert für $varId gefunden, nutze aktuellen Wert ($fallback)"); + IPS_LogMessage('Abrechnung', "⚠ Kein Archivwert für $varId im Umkreis von $maxDays Tagen gefunden, nutze aktuellen Wert ($fallback)"); return $fallback; } @@ -350,7 +366,7 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) // Archivwerte lesen - $startVal = $this->GetValueAt($varId, $segmentStart, false); + $startVal = $this->GetValueAt($varId, $segmentStart, true); $endVal = $this->GetValueAt($varId, $segmentEnd, true); if ($startVal === null || $endVal === null) {