From e17cf1f82581901b1d9c27e5614f85921f8bb36c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=A4fliger?= Date: Thu, 6 Nov 2025 16:06:47 +0100 Subject: [PATCH] no message --- Abrechnung/module.php | 64 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 12 deletions(-) diff --git a/Abrechnung/module.php b/Abrechnung/module.php index 4ed8c96..b98f3ee 100644 --- a/Abrechnung/module.php +++ b/Abrechnung/module.php @@ -432,46 +432,86 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) private function readDelta($varId, $tStart, $tEnd) { + // Zeitangaben normalisieren if (!is_int($tStart)) $tStart = strtotime($tStart); if (!is_int($tEnd)) $tEnd = strtotime($tEnd); + // Archiv-Instanz finden $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; } + // Archivdaten abrufen (+/- 1 Tag Puffer) $values = @AC_GetLoggedValues($archiveID, $varId, $tStart - 86400, $tEnd + 86400, 0); - IPS_LogMessage('Abrechnung', sprintf( - "🧩 readDelta(%d): Zeitraum %s – %s | Werte gefunden: %d", - $varId, date('d.m.Y H:i', $tStart), date('H:i', $tEnd), count($values) + $count = is_array($values) ? count($values) : 0; + IPS_LogMessage('Abrechnung', sprintf("πŸ“˜ readDelta(%d): Zeitraum %s – %s | %d Werte gefunden", + $varId, date('d.m.Y H:i', $tStart), date('H:i', $tEnd), $count )); - if (empty($values)) return 0.0; + // Wenn gar nichts gefunden β†’ abbrechen + if ($count === 0) { + IPS_LogMessage('Abrechnung', "⚠️ Keine Archivwerte fΓΌr $varId im Zeitraum."); + return 0.0; + } + // πŸ” Nur die ersten 10 Werte loggen, damit das Log nicht explodiert + $maxLog = 10; + $i = 0; + foreach ($values as $v) { + IPS_LogMessage('Abrechnung', sprintf( + " πŸ•’ %s | %.5f", + date('d.m.Y H:i:s', intval($v['TimeStamp'])), floatval($v['Value']) + )); + $i++; + if ($i >= $maxLog) { + IPS_LogMessage('Abrechnung', " ... (+ " . ($count - $i) . " weitere Werte)"); + break; + } + } + + // πŸ”Ή Sortieren und in Float umwandeln usort($values, fn($a, $b) => intval($a['TimeStamp']) <=> intval($b['TimeStamp'])); foreach ($values as &$v) { $v['TimeStamp'] = intval($v['TimeStamp']); $v['Value'] = floatval($v['Value']); } + unset($v); + // πŸ”Ή Letzter Wert <= Start $vStart = null; - $vEnd = null; - foreach ($values as $v) { if ($v['TimeStamp'] <= $tStart) $vStart = $v['Value']; - if ($v['TimeStamp'] <= $tEnd) $vEnd = $v['Value']; + if ($v['TimeStamp'] > $tStart) break; + } + + // πŸ”Ή Letzter Wert <= Ende + $vEnd = null; + foreach ($values as $v) { + if ($v['TimeStamp'] <= $tEnd) $vEnd = $v['Value']; if ($v['TimeStamp'] > $tEnd) break; } - IPS_LogMessage('Abrechnung', sprintf( - " ↳ Start=%.5f End=%.5f Diff=%.5f (Var %d)", - $vStart ?? -1, $vEnd ?? -1, ($vEnd ?? 0) - ($vStart ?? 0), $varId - )); + // Fallback, falls keine gefunden + 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"); + } - if ($vStart === null || $vEnd === null) return 0.0; $diff = $vEnd - $vStart; if ($diff < 0) $diff = 0.0; + + IPS_LogMessage('Abrechnung', sprintf( + "πŸ“ˆ Ξ”Var %d = %.5f (%.5f β†’ %.5f) [%s β†’ %s]", + $varId, $diff, $vStart, $vEnd, + date('d.m.Y H:i', $tStart), date('H:i', $tEnd) + )); + return $diff; }