0) $regen_24h += $delta; // nur positive Deltas (Zähler steigt) } // Übergang vom letzten bekannten Wert vor dem 24h-Fenster einbeziehen $start_24h = zaehlerstandZum($archivID, $varID_Regen, $jetzt - 86400); if ($start_24h !== null) { $erster_delta = $werte_24h_asc[0]['Value'] - $start_24h; if ($erster_delta > 0) $regen_24h += $erster_delta; } // Kippungen → mm $regen_24h = round($regen_24h * $mm_pro_kippung, 1); } // Letzte 7 Tage: Zählerstand zu Beginn des Tages vor 6 Tagen $start_7tage = zaehlerstandZum($archivID, $varID_Regen, $mitternacht_heute - (6 * 86400)); $regen_7tage = ($start_7tage !== null) ? round(max(0, GetValue($varID_Regen) - $start_7tage) * $mm_pro_kippung, 1) : $regen_heute; // ── Diagnose-Ausgabe (nur wenn $debug = true) ──────────────── // Ausgabe per echo – sichtbar wenn das Skript manuell in der // Konsole ausgeführt wird (Reiter "Ausgabe"). if ($debug) { $aktuell = GetValue($varID_Regen); echo "── Diagnose " . date('d.m.Y H:i:s') . " ──\n"; echo "Aktueller raintotal-Wert: $aktuell Kippungen (= " . ($aktuell * $mm_pro_kippung) . " mm)\n"; echo "HEUTE: Start=$start_heute → $regen_heute mm\n"; echo "24H: Start=$start_24h → $regen_24h mm\n"; echo "7 TAGE: Start=$start_7tage → $regen_7tage mm\n"; // rainlevel-Timing für Intensitätsprüfung if ($varID_RainLevel > 0) { $rl_info = IPS_GetVariable($varID_RainLevel); $rl_alter = $jetzt - $rl_info['VariableUpdated']; echo "rainlevel: Wert=" . GetValue($varID_RainLevel) . " | Updated vor " . round($rl_alter / 60, 1) . " Min" . " | Changed vor " . round(($jetzt - $rl_info['VariableChanged']) / 60, 1) . " Min\n"; } // Rohwerte der letzten 24h auflisten $debug_24h = AC_GetLoggedValues($archivID, $varID_Regen, $jetzt - 86400, $jetzt, 0); echo "Rohwerte 24h (" . count($debug_24h) . " Einträge):\n"; foreach (array_reverse($debug_24h) as $w) { echo " " . date('d.m H:i', $w['TimeStamp']) . " → " . $w['Value'] . " mm\n"; } echo "── Ende Diagnose ──\n"; } // ── Regenintensität berechnen aus rainlevel ───────────────── // rainlevel = Kippungen der Messwippe im letzten 15-Min-Intervall // Umrechnung: Kippungen × mm_pro_kippung = mm im Intervall // Hochrechnung auf mm/h: × 4 (4 × 15 Min = 60 Min) // Beispiel: rainlevel=2 → 2 × 0,5 mm × 4 = 4 mm/h // // WICHTIG: Der Sensor sendet rainlevel nur solange es regnet. // Hört der Regen auf, kommt KEIN neuer Wert mehr – die Variable // behält ihren letzten Wert. Daher prüfen wir das Alter der letzten // Aktualisierung: ist sie älter als ein Intervall (15 Min + Puffer), // gilt der Regen als beendet → Intensität 0. $intervall_puffer = 20 * 60; // 20 Minuten (15-Min-Intervall + 5 Min Puffer) if ($varID_RainLevel > 0) { $var_info = IPS_GetVariable($varID_RainLevel); $letzte_aktual = $var_info['VariableUpdated']; // Unix-Zeitstempel der letzten Aktualisierung $alter = $jetzt - $letzte_aktual; if ($alter <= $intervall_puffer) { // Aktueller Wert ist frisch → Intensität berechnen $intensitaet = round(GetValue($varID_RainLevel) * $mm_pro_kippung * 4, 1); } else { // Letzter rainlevel-Wert ist veraltet → kein aktueller Regen $intensitaet = 0.0; } } else { $intensitaet = null; } // ── Weitere Messwerte ──────────────────────────────────────── $temperatur = ($varID_Temperatur > 0) ? round(GetValue($varID_Temperatur), 1) : null; $starkregen = ($varID_StarkregenAlarm > 0) ? (bool)GetValue($varID_StarkregenAlarm) : false; // Batteriestatus ermitteln // Priorität 1: battery-Feld direkt vom Sensor (0–100 %) // Priorität 2: Berechnung über mAs-Zähler // battery-Feld des RANWIE01 = mAs-Verbrauch seit Batteriewechsel // Beispiel aus Doku: {"battery":"20721"} = 20721 mAs = 5.75 mAh verbraucht // → bei 1200 mAh Kapazität ≈ 0.5 % verbraucht if ($varID_BatterieVerbrauch > 0) { $verbrauch_mas = GetValue($varID_BatterieVerbrauch); // mAs seit Batteriewechsel $verbrauch_mah = $verbrauch_mas / 3600; // mAs → mAh $verbrauch_pct = $verbrauch_mah / $batterie_kapazitaet_mah; // Anteil 0.0–1.0 $batterie_ok = ($verbrauch_pct < $batterie_warnschwelle); // true = noch OK $batterie_pct = round($verbrauch_pct * 100, 1); // für Logmeldung } else { $batterie_ok = null; $batterie_pct = null; } // ── Tages-History für Balkendiagramm (14 Tage) ────────────── // Für vergangene Tage: Tageswert via AC_GetAggregatedValues (Stufe 1 = täglich) $history = []; if (file_exists($datei_history)) { $raw = @file_get_contents($datei_history); if ($raw) $history = json_decode($raw, true) ?: []; } // Heutigen Wert immer aktualisieren $history[$heute_key] = [ 'datum' => $datum_text, 'regen_mm' => $regen_heute, ]; // Vergangene 13 Tage auffüllen, falls noch nicht vorhanden // Für abgeschlossene Tage: Differenz zwischen Zählerstand um Mitternacht // des Tages und Zählerstand um Mitternacht des Folgetags for ($d = 1; $d <= 13; $d++) { $tag_ts = mktime(0, 0, 0, date('n'), date('j') - $d, date('Y')); // Mitternacht Tag $folgetag_ts = mktime(0, 0, 0, date('n'), date('j') - $d + 1, date('Y')); // Mitternacht Folgetag $tag_key = date('Y-m-d', $tag_ts); if (!isset($history[$tag_key])) { // Zählerstand zu Beginn und Ende des Tages $start = zaehlerstandZum($archivID, $varID_Regen, $tag_ts); $ende = zaehlerstandZum($archivID, $varID_Regen, $folgetag_ts); if ($start !== null && $ende !== null) { $mm = round(max(0, $ende - $start) * $mm_pro_kippung, 1); } else { $mm = 0.0; } $history[$tag_key] = [ 'datum' => date('d.m.Y', $tag_ts), 'regen_mm' => $mm, ]; } } ksort($history); $history = array_slice($history, -14, null, true); file_put_contents($datei_history, json_encode($history, JSON_PRETTY_PRINT)); // ── JSON zusammenstellen ───────────────────────────────────── $daten = [ 'aktualisiert' => $jetzt, 'datum' => $datum_text, 'zeit' => $zeit_text, 'standort' => $standort, 'regen_heute_mm' => $regen_heute, 'regen_24h_mm' => $regen_24h, 'regen_7tage_mm' => $regen_7tage, 'intensitaet_mmh' => $intensitaet, 'temperatur' => $temperatur, 'starkregen_alarm' => $starkregen, 'batterie_ok' => $batterie_ok, 'history' => array_values($history), ]; $json_inhalt = json_encode($daten, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); // Lokales Backup file_put_contents($datei_backup, $json_inhalt); // ── Per FTP hochladen ──────────────────────────────────────── $ftp = @ftp_connect($ftp_host, $ftp_port, 10); if (!$ftp) { IPS_LogMessage('RegenUpload', 'FTP-Verbindung fehlgeschlagen: ' . $ftp_host); return; } if (!@ftp_login($ftp, $ftp_user, $ftp_pass)) { IPS_LogMessage('RegenUpload', 'FTP-Login fehlgeschlagen'); ftp_close($ftp); return; } ftp_pasv($ftp, true); $tmp = tempnam(sys_get_temp_dir(), 'regen_'); file_put_contents($tmp, $json_inhalt); $erfolg = ftp_put($ftp, $ftp_zieldatei, $tmp, FTP_ASCII); unlink($tmp); ftp_close($ftp); if ($erfolg) { $bat_log = ($batterie_pct !== null) ? ' | Batterie: ' . $batterie_pct . '% verbraucht (' . ($batterie_ok ? 'OK' : 'LEER') . ')' : ''; IPS_LogMessage('RegenUpload', sprintf( 'OK – Heute: %s mm | 24h: %s mm | 7 Tage: %s mm | Intensität: %s mm/h%s (%s %s)', $regen_heute, $regen_24h, $regen_7tage, $intensitaet, $bat_log, $datum_text, $zeit_text )); } else { IPS_LogMessage('RegenUpload', 'FTP-Upload fehlgeschlagen! Ziel: ' . $ftp_zieldatei); }