Webcam: Button zum Freigeben/Uebernehmen der Kamera (ESP32-Slot)
Trotz GRABBER_ALWAYS_ON=1 kann der ESP32-Slot per Button manuell
freigegeben werden (z.B. um die Cam woanders direkt zu oeffnen).
Freigegeben = Slot frei + Zaehlung pausiert; uebernehmen = wieder zaehlen.
- Grabber: paused-Flag, hat Vorrang vor ALWAYS_ON/Karenzzeit
- /api/grabber_toggle + paused-Feld in /api/webcam_status
- Button + eigener Overlay-Text ("Kamera freigegeben") im Frontend
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
19
app.py
19
app.py
@@ -466,6 +466,7 @@ class WebcamGrabber:
|
||||
self.last_frame_ts = 0.0 # time.time() des letzten gelieferten Frames
|
||||
self.viewers = 0
|
||||
self._last_active_ts = 0.0 # letzter Zeitpunkt mit Zuschauer (Karenzzeit)
|
||||
self.paused = False # manuell freigegeben -> ESP32-Slot freigeben
|
||||
self.reset_flag = Event()
|
||||
self.line = dict(SAVED_LINE)
|
||||
|
||||
@@ -507,6 +508,8 @@ class WebcamGrabber:
|
||||
def _wants_stream(self) -> bool:
|
||||
"""Soll der Grabber gerade die Kamera bedienen? Mit Karenzzeit, damit
|
||||
kurzes Zuschauer-Aus (z.B. <img>-Reload) die Verbindung nicht kappt."""
|
||||
if self.paused:
|
||||
return False # manuell freigegeben -> ESP32-Slot freigeben
|
||||
if GRABBER_ALWAYS_ON:
|
||||
return True
|
||||
if self._viewer_count() > 0:
|
||||
@@ -514,6 +517,12 @@ class WebcamGrabber:
|
||||
return True
|
||||
return (time.time() - self._last_active_ts) < VIEWER_GRACE_SEC
|
||||
|
||||
def set_paused(self, paused: bool) -> bool:
|
||||
"""Grabber manuell pausieren (Kamera freigeben) bzw. wieder aufnehmen."""
|
||||
self.paused = bool(paused)
|
||||
print(f"[webcam-grabber] {'pausiert (Slot frei)' if self.paused else 'aktiv'}", flush=True)
|
||||
return self.paused
|
||||
|
||||
def _current_line(self):
|
||||
with self.lock:
|
||||
line = dict(self.line)
|
||||
@@ -817,7 +826,15 @@ def get_counting_line():
|
||||
@app.route("/api/webcam_status", methods=["GET"])
|
||||
def webcam_status():
|
||||
"""Liefert, ob der Webcam-Grabber gerade Frames bekommt (Kamera online)."""
|
||||
return jsonify({"online": webcam.is_online()})
|
||||
return jsonify({"online": webcam.is_online(), "paused": webcam.paused})
|
||||
|
||||
|
||||
@app.route("/api/grabber_toggle", methods=["POST"])
|
||||
def grabber_toggle():
|
||||
"""Grabber pausieren/aufnehmen: pausiert gibt den ESP32-Slot frei
|
||||
(Zaehlung aus), aktiv verbindet wieder zur Kamera (Zaehlung an)."""
|
||||
paused = webcam.set_paused(not webcam.paused)
|
||||
return jsonify({"paused": paused})
|
||||
|
||||
|
||||
@app.route("/api/reset_count", methods=["POST"])
|
||||
|
||||
Reference in New Issue
Block a user