From eb0f6e05ed71ae095b437f5921478b4ec7ef36c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=A4fliger?= Date: Thu, 6 Nov 2025 15:19:14 +0100 Subject: [PATCH] no message --- Abrechnung/module.php | 49 ++++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/Abrechnung/module.php b/Abrechnung/module.php index aa5e172..1843ee3 100644 --- a/Abrechnung/module.php +++ b/Abrechnung/module.php @@ -469,36 +469,61 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) private function readDelta($varId, $tStart, $tEnd) { + // 🕒 Eingangsparameter vereinheitlichen + if (!is_int($tStart)) $tStart = strtotime($tStart); + if (!is_int($tEnd)) $tEnd = strtotime($tEnd); + $archiveID = @IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; if (!$archiveID || !IPS_VariableExists($varId)) { IPS_LogMessage('Abrechnung', "❌ Archiv oder Variable $varId nicht gefunden"); return 0.0; } + // 🔍 1 Tag Puffer auf beiden Seiten, damit auch bei Lücken Werte gefunden werden $values = @AC_GetLoggedValues($archiveID, $varId, $tStart - 86400, $tEnd + 86400, 0); if (empty($values)) { - IPS_LogMessage('Abrechnung', "⚠️ Keine Archivwerte für $varId im Zeitraum " . date('d.m.Y H:i', $tStart) . " – " . date('H:i', $tEnd)); + IPS_LogMessage('Abrechnung', "⚠️ Keine Archivwerte für $varId im Bereich " . date('d.m.Y H:i', $tStart) . "–" . date('H:i', $tEnd)); return 0.0; } - // Startwert = letzter <= tStart + // 🔹 Letzter Wert <= Startzeitpunkt $vStart = null; - foreach ($values as $v) { - if ($v['TimeStamp'] <= $tStart) $vStart = $v['Value']; - else break; + foreach (array_reverse($values) as $v) { + if ($v['TimeStamp'] <= $tStart) { + $vStart = floatval($v['Value']); + break; + } } - // Endwert = letzter <= tEnd + // 🔹 Letzter Wert <= Endzeitpunkt $vEnd = null; - foreach ($values as $v) { - if ($v['TimeStamp'] <= $tEnd) $vEnd = $v['Value']; - else break; + foreach (array_reverse($values) as $v) { + if ($v['TimeStamp'] <= $tEnd) { + $vEnd = floatval($v['Value']); + break; + } } - if ($vStart === null || $vEnd === null) return 0.0; + // 🔸 Falls keine passenden Werte: Fallback auf aktuellen Variablenwert + if ($vStart === null) { + $vStart = floatval(GetValue($varId)); + IPS_LogMessage('Abrechnung', "⚠️ Kein Startwert gefunden – nutze aktuellen Wert $vStart"); + } + if ($vEnd === null) { + $vEnd = floatval(GetValue($varId)); + IPS_LogMessage('Abrechnung', "⚠️ Kein Endwert gefunden – nutze aktuellen Wert $vEnd"); + } + + // 🔹 Differenz + $diff = $vEnd - $vStart; + if ($diff < 0) $diff = 0.0; // Negative Differenzen vermeiden (z. B. bei Reset) + + IPS_LogMessage('Abrechnung', sprintf( + "📈 ΔVar %d = %.4f (%.4f → %.4f) [%s → %s]", + $varId, $diff, $vStart, $vEnd, + date('d.m.Y H:i', $tStart), date('H:i', $tEnd) + )); - $diff = max(0.0, floatval($vEnd) - floatval($vStart)); - IPS_LogMessage('Abrechnung', sprintf(" ΔVar %d = %.4f (%.4f→%.4f)", $varId, $diff, $vStart, $vEnd)); return $diff; }