Fix: Offline-Erkennung loeste Reconnect-Resets aus (Zaehlung gestoert)

Bei GRABBER_ALWAYS_ON=0 kappte kurzes Zuschauer-Aus (<img>-Reload der
Auto-Recovery) die Kameraverbindung -> Reconnect -> Tracker/Zaehlzustand
wurde zurueckgesetzt. Bei ~1 FPS riss das die Zaehlung auseinander.

- Grabber: Karenzzeit (VIEWER_GRACE_SEC, Default 15s) bevor die Kamera
  bei fehlenden Zuschauern freigegeben wird -> kein Reconnect-Churn
- Frontend: Overlay/Reload erst nach ~6s echtem Ausfall (3 Polls),
  nicht bei einzelnen langsamen Frames -> kein Verbindungs-Churn

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-02 10:53:46 +02:00
parent 356d0ce977
commit 264b2b3e3b
2 changed files with 38 additions and 10 deletions

View File

@@ -288,7 +288,9 @@
// --- Kamera-Online-Status pollen + Auto-Recovery des Streams ---
const videoFeed = document.getElementById('videoFeed');
const offlineOverlay = document.getElementById('offlineOverlay');
let camWasOffline = false;
let offlineStreak = 0; // aufeinanderfolgende Offline-Abfragen
let reloadPending = false; // erst nach echtem Ausfall den Stream neu laden
const OFFLINE_POLLS = 3; // ~6s -> erst dann "wirklich offline"
async function checkCamStatus() {
let online = false;
try {
@@ -297,12 +299,22 @@
} catch (e) {
online = false;
}
if (online && camWasOffline) {
// MJPEG-<img> reconnectet nach Stream-Abbruch nicht von selbst -> neu anstossen
videoFeed.src = "{{ url_for('webcam_feed') }}?t=" + Date.now();
if (online) {
// Nur nach einem laengeren Ausfall den MJPEG-Stream neu anstossen
// (sonst Verbindungs-/Reconnect-Churn bei kurzen Aussetzern).
if (reloadPending) {
videoFeed.src = "{{ url_for('webcam_feed') }}?t=" + Date.now();
reloadPending = false;
}
offlineStreak = 0;
offlineOverlay.classList.remove('show');
} else {
offlineStreak++;
if (offlineStreak >= OFFLINE_POLLS) {
offlineOverlay.classList.add('show');
reloadPending = true;
}
}
camWasOffline = !online;
offlineOverlay.classList.toggle('show', !online);
}
checkCamStatus();
setInterval(checkCamStatus, 2000);