file.filename ist str|None. Guard faengt None jetzt mit ab, und
secure_filename(file.filename or "") macht den Typ eindeutig str.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
data.get() liefert Any|None; Type-Checker erkannte den abort-Guard nicht
als Einschraenkung. str(... or "") macht den Typ eindeutig str, Verhalten
identisch (None/"" -> abort 400).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Type-Checker sah model.model als evtl. None. YOLO bietet die Klassen-
namen direkt ueber model.names an (identischer Inhalt verifiziert).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Direkter Zugriff mqtt.CallbackAPIVersion wurde von Pylance bei paho-1.x-
Stubs als "nicht exportiert" markiert. getattr umgeht das, gleiche
1.x/2.x-Kompatibilitaet zur Laufzeit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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>
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>
Pro verarbeitetem Frame mit Fahrzeugen: Anzahl, Abstaende zur Linie,
Band, jetzt gezaehlt, Gesamt. Hilft zu sehen, ob Fahrzeuge erkannt
werden und wie nah sie der Linie kommen (Frame-Rate-/Band-Diagnose).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Nach langer Kamera-Pause (z.B. ueber Nacht aus) trug der persistente
YOLO-Tracker alten Zustand mit: neue Fahrzeuge wurden an verlorene
Alt-Tracks gekoppelt bzw. erst nach 2 Frames aktiviert -> bekamen keine/
verzoegerte ID -> wurden nicht gezaehlt.
- Tracker beim (Re-)Connect via tracker.reset() leeren -> frische IDs
- frame_idx beim Reconnect nullen (Gesamtzaehler bleibt)
- Log-Zeile beim Verbinden (Reconnects in supervisord-Logs sichtbar)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ESP32-CAM haengt sich gelegentlich auf -> Bild blieb leer ohne Hinweis.
- Grabber merkt sich last_frame_ts; /api/webcam_status liefert online-Flag
(online = letzter Frame < 5s her)
- webcam.html pollt alle 2s und blendet ein Offline-Overlay ein
- Auto-Recovery: kommt die Kamera zurueck, wird der MJPEG-Stream neu
angestossen (<img> reconnectet sonst nach Abbruch nicht von selbst)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- CSS-Variablen fuer Hell/Dunkel, Umschalter (🌙/☀️) oben rechts
- Default folgt prefers-color-scheme, Wahl wird in localStorage gemerkt
- Theme wird vor dem Rendern gesetzt -> kein Flackern
- index, webcam und play_video konsistent
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
camera=Kamera-ID (cam1), source=Herkunft (webcam/video) - vorher war
source bei der Live-Cam mit der Kamera-ID belegt und damit redundant.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
.flaskenv (Flask SECRET_KEY) war versehentlich versioniert. Aus Tracking
genommen, in .gitignore aufgenommen, Key lokal rotiert. History-Purge folgt.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
track_positions/counted_ids wuchsen im 24/7-Betrieb unbegrenzt:
-> Speicherleck/Slowdown -> Bildrate bricht ein -> Linienueberquerungen
werden nicht mehr erfasst (Einzel-Erkennung lief weiter).
- Track-IDs altern jetzt (last-seen-Frame) und werden nach
COUNT_FORGET_FRAMES aus track_positions UND counted_ids entfernt
- bounded State -> kein Leck; loest auch Unterdrueckung bei spaeterer
Track-ID-Wiederverwendung
- Langzeit-Simulation (5000 Frames): 100/100 gezaehlt, State-Peak 4
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Schnelle Fahrzeuge im kamera-nahen (pixel-schnellen) Bereich sprangen
ueber das 24px-Band -> wurden nicht gezaehlt. 45px faengt sie ab; die
Entprellung (60px) verhindert weiterhin Doppelzaehlung.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ESP32-CAM-Empfehlung zu einer Tabelle erweitert: wetterdichte Box und
Powerbank fuer netzunabhaengigen Aussenbetrieb (Affiliate-Links).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Hardware-Empfehlung im ESP32-CAM-Abschnitt + Voraussetzungen verlinkt,
mit Affiliate-Hinweis (Transparenz).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bisher musste von DERSELBEN Track-ID ein Punkt vor UND hinter der Linie
erfasst werden. Bei schnellen Fahrzeugen gibt es dafuer oft zu wenige
Samples oder die Track-ID wechselt -> nichts wird gezaehlt.
- Band um die Linie (COUNT_BAND_PX): ein einzelnes Sample nahe der Linie
reicht jetzt zum Zaehlen
- Entprellung (COUNT_DEDUP_PX/FRAMES): verhindert Doppelzaehlung bei
Track-ID-Wechseln nahe der Linie
- klassischer Segment-Schnitt bleibt zusaetzlich erhalten
- point_to_segment_dist + Tests fuer langsam/schnell/ID-Wechsel
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 'cp .env.example .env' als empfohlener Einstieg dokumentiert
- Broker-IP/Topic/Kamera-IP aus README und app.py-Default durch
Platzhalter ersetzt (versehentlich aus lokalem Setup uebernommen)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Vorlage fuer die lokale .env (alle 16 Env-Variablen erklaert, nur
generische Platzhalter/Defaults). 'cp .env.example .env' zum Start.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- MQTT_ENABLED=false -> App startet ohne Broker, keine Events/LWT
- publish_crossing wird zum No-Op, kein Reconnect-Rauschen
- README: optional gekennzeichnet, Env-Tabelle + .env-Beispiel ergaenzt
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Linie wird beim Setzen atomar in counting_line.json gespeichert
- beim Start geladen -> Default fuer Session UND Webcam-Grabber
- Pfad per LINE_FILE-Env ueberschreibbar, Datei via .gitignore ausgeschlossen
- set_line-Route nutzt jetzt _valid_line (weniger Doppelcode)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- "online" (retained) beim (Re-)Connect via on_connect-Callback
- "offline" automatisch durch Broker bei Verbindungsabbruch (LWT)
- Abnehmer (n8n / Home Assistant) sehen jederzeit den Live-Zustand
- README um Status-/Availability-Topic ergaenzt
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Ohne 'source .env' liefen Broker/Topic auf Defaults (127.0.0.1 statt
192.168.10.7, vehiclecounter/cam1 statt counter/cam1) -> keine Events.
Jetzt laedt app.py die .env per python-dotenv beim Start.
- load_dotenv() vor dem Auslesen von os.environ
- README: .env-Konfig + supervisord-Hinweis (directory=), python-dotenv
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- yolo11s.pt aus Tracking entfernt, .gitignore auf *.pt erweitert
- README: Modelle werden beim ersten Start autom. geladen statt manuell
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- NVIDIA-GPU mit CUDA als Voraussetzung dokumentiert (FP16, CPU-Fallback)
- ESP32-CAM als MJPEG-Live-Quelle inkl. CAMERA_URL/Fan-out/Always-on
- MQTT-Broker fuer Crossing-Events (Topic, Payload, Env-Konfig)
- Installation um CUDA-PyTorch, requests und paho-mqtt ergaenzt
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Problem: YOLO hat die gelbe Zähllinie als "Zahnbürste" erkannt
Lösung: Zähllinie wird jetzt NACH der YOLO-Erkennung gezeichnet
Änderungen:
- YOLO-Erkennung läuft auf dem Original-Frame
- Zähllinie wird erst danach als Overlay gezeichnet
- Linie ist jetzt etwas dicker (3px statt 2px) für bessere Sichtbarkeit
Resultat: Keine falschen Objekterkennungen mehr durch die Zähllinie
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neue Debug-Features:
- Orange Bewegungslinien zeigen die Trajektorie jedes Fahrzeugs
- Größerer grüner Kreis (25px) beim Zählen für bessere Sichtbarkeit
- crossed_line() Helper-Funktion für bessere Code-Lesbarkeit
Hilft beim Debuggen:
- Bewegungslinien zeigen ob Fahrzeug sich bewegt
- Sichtbar ob Bewegungslinie die Zähllinie kreuzt
- Bestätigt visuell dass Tracking funktioniert
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neue visuelle Features:
- Gelber Punkt am Zentrum jeder Bounding Box
- Grüner Kreis erscheint beim Zählen eines Fahrzeugs
- "✓" wird zum Label hinzugefügt wenn Fahrzeug gezählt wurde
- Grüne Boxen für zählbare Fahrzeuge, blaue für andere Objekte
Hilft beim Debuggen:
- Zeigt visuell welche Fahrzeuge bereits gezählt wurden
- Macht den Zenterpunkt sichtbar für Line-Intersection
- Bestätigt visuell erfolgreiche Zählung
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Problem: RuntimeError beim Zugriff auf session in Generator-Funktionen
Lösung:
- Liniendaten werden vor dem Generator aus der Session gelesen
- Als Parameter an detect_objects_from_webcam() übergeben
- Als Parameter an detect_objects_from_video() übergeben
- Reset-Button lädt jetzt die Seite neu (mit Bestätigungsdialog)
Technische Details:
- Generator-Funktionen haben keinen Request-Kontext
- Session-Werte müssen vor Generator-Start erfasst werden
- Counter-Reset funktioniert durch Seiten-Reload
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Linienschnitt-Algorithmus für präzise Fahrzeugzählung
- Interaktive Linienauswahl im Browser (Canvas-basiert)
- Session-Management für benutzerdefinierte Zähllinien
- Typ-spezifische Zähler (Autos, LKW, Busse, Motorräder)
- REST-API für Linienkonfiguration und Zähler-Reset
- Gestrichelte Zähllinie als Video-Overlay
- Detailliertes Zähler-Display im Video
Features:
- Linienüberquerung-Erkennung (beide Richtungen)
- Keine Mehrfachzählung durch Track-ID-Management
- Funktioniert für Webcam und Video-Upload
- Benutzerfreundliche UI mit Echtzeit-Feedback
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>