Reolink CX810 in Home Assistant — Kennzeichenerkennung und TV-Snapshots

Wie ich eine Reolink CX810 4K PoE Kamera dazu gebracht habe, Kennzeichen per KI zu lesen und bei Einfahrt in die Auffahrt direkt ein Snapshot-Bild auf den TV zu schicken.

#kamera #reolink #alpr #ki-vision #home-assistant #tv
19. September 2025
Reolink CX810 in Home Assistant — Kennzeichenerkennung und TV-Snapshots

Eine Türklingel mit Kamera haben wir nie installiert. Die Reolink CX810, die auf die Auffahrt zeigt, leistet am Ende mehr als jede Türklingel es getan hätte — ohne Abo, ohne App, und mit dem TV als Benachrichtigungsbildschirm statt einem Handy, auf das man vielleicht gerade nicht schaut.

Die Kamera

Die CX810 ist eine 4K 8MP PoE-Kamera. Sie läuft in einem dedizierten VLAN, kommuniziert mit HA über das lokale Netzwerk und erscheint als camera.sentinel_clear (volle Auflösung) und camera.sentinel_fluent (niedrigere Auflösung, schneller). Der KI-Chip der Kamera liefert direkt Binärsensoren:

binary_sensor.sentinel_vehicle
binary_sensor.sentinel_person
binary_sensor.sentinel_motion

Fahrzeug- und Personenerkennung vom eigenen Chip der Kamera sind gut genug, um die offensichtlichen Fehlalarme herauszufiltern — Vögel, Schatten, die Katze. Nicht perfekt, aber der richtige Ausgangspunkt.

Kennzeichenerkennung

Wenn ein Fahrzeug den Sensor auslöst, wartet die Automatisierung 2 Sekunden — lang genug damit das Auto eingefahren und ein Kennzeichen sichtbar ist — nimmt dann einen Snapshot und sendet ihn an llmvision.image_analyzer mit einem sehr kurzen, spezifischen Prompt:

message: >
  Look at this surveillance camera image. Read the vehicle license plate number.
  Reply with ONLY the plate number in capital letters (example: 'AB12345').
  If no plate is visible or readable, reply with only the word 'none'.
max_tokens: 15
temperature: 0.1

15 Token. Niedrige Temperatur. Kein Platz zum Schwadronieren. Entweder gibt es ein Kennzeichen zurück oder “none”.

Wenn der erste Versuch leer zurückkommt, wartet die Automatisierung weitere 3 Sekunden und versucht es erneut mit einem neuen Snapshot. Zwei Versuche reichen — wenn das Kennzeichen nach zwei Versuchen nicht lesbar ist, liegt es am schlechten Winkel oder Dunkelheit, nicht daran dass das Modell mehr Zeit brauchte.

Das beste Ergebnis aus einem der beiden Versuche gewinnt. Es wird in input_text.last_5_plates als rollende JSON-Liste gespeichert — ein einfaches Protokoll der letzten fünf Kennzeichen, die in die Auffahrt eingefahren sind, mit Zeitstempeln.

Was auf dem TV landet

Eine App macht das auf der TV-Seite möglich: Notifications for Android TV (kostenlos, Google Play). Sie betreibt einen kleinen HTTP-Server auf Port 7676, an den die HA-Integration “Notifications for Android TV / Fire TV” postet. Kein Konto, keine Cloud — die Benachrichtigung geht direkt von HA über das lokale Netzwerk zum TV. App installieren, TV-IP notieren, Integration in HA unter Einstellungen → Geräte & Dienste hinzufügen, und man bekommt einen notify.android_tv_*-Dienst.

notify.android_tv_fire_tv_192_168_1_40 sendet direkt an den TV:

action: notify.android_tv_fire_tv_192_168_1_40
data:
  message: "🚗 Fahrzeug erkannt! Kennzeichen: {{ plate_text }}"
  data:
    image: "http://192.168.x.x:8123/local/sentinel_latest.jpg?t={{ now().timestamp() | int }}"
    interrupt: 1

Das interrupt: 1-Flag zwingt die Benachrichtigung dazu, auch dann zu erscheinen wenn der TV beschäftigt ist. Das Bild erscheint in der Ecke mit dem Kennzeichentext darunter. Man schaut etwas an, ein Auto fährt ein, ein Miniaturbild erscheint in der Ecke mit dem Kennzeichen — man wirft einen Blick drauf und ignoriert es entweder oder greift zum Handy. Kein Handy in die Hand nehmen zum Nachschauen, keine App öffnen.

Die Telefone bekommen denselben Snapshot über notify.alle_enheder, mit einer zeitgestempelten URL damit kein gecachtes Bild vom letzten Besuch geliefert wird.

Personenerkennung bekommt eine einfachere Version: kein ALPR-Versuch, nur eine Snapshot-Benachrichtigung. Es reicht um zu sehen ob es der Postbote ist oder jemand Unbekanntes.

Was ich weggelassen habe

Ich habe eine Version ausprobiert die das Kennzeichen per Text-zu-Sprache über den TV-Lautsprecher ansagte. Es funktionierte aber fühlte sich wie eine Abflugtafel am Flughafen an. Die visuelle Benachrichtigung ist diskreter — man sieht sie wenn man hinschaut, übersieht sie wenn nicht, und der TV unterbricht sich nicht selbst um eine Nummer vorzulesen.

Was zuerst tatsächlich kaputtging

In der ersten Woche lief die TV-Benachrichtigung und hörte dann auf zu funktionieren. Nicht sichtbar — die Automatisierung lief durch, keine Fehler in der Trace, aber der TV zeigte nur Text ohne Bild, und die Telefone bekamen überhaupt nichts.

Das Problem war die Bildgröße. Die nfandroidtv-Integration schickt einen Snapshot an die TV-App via HTTP POST auf Port 7676. Ich verwendete camera.sentinel_clear — den Full-Resolution-Feed — der Frames von etwa 1,9 MB produziert. Die TV-App brauchte mehr als 5 Sekunden um das zu verarbeiten. HA traf einen ReadTimeout, brach den Script-Schritt mitten in der Ausführung ab, und die Telefonbenachrichtigungen wurden nie gesendet.

Obendrauf war die Integration in einen failed_unload-Zustand geraten — wahrscheinlich durch einen HA-Neustart während eines dieser Timeouts. Das Symptom: notify.android_tv verschwand zeitweise aus den verfügbaren Services und tauchte dann wieder auf. Die Integration stand als geladen, aber HA hatte ihre Services nicht sauber registriert.

Drei Korrekturen der Reihe nach:

1. Integration löschen und neu erstellen. Einstellungen → Geräte & Dienste → “Notifications for Android TV / Fire TV” finden → löschen → neu hinzufügen. Das bereinigt den failed_unload-Zustand und registriert notify.android_tv sauber neu.

2. Snapshot-Quelle wechseln. Beide Snapshot-Schritte in der Automatisierung von camera.sentinel_clear auf camera.sentinel_fluent umgestellt. Der Fluent-Stream produziert 50–200 KB Frames statt 1,9 MB — klein genug damit die TV-App es in deutlich unter einer Sekunde verarbeitet. Die Bildqualität reicht noch mehr als aus um eine Person zu identifizieren oder ein Kennzeichen bei gutem Licht zu lesen.

3. continue_on_error: true beim TV-Notify-Schritt hinzufügen:

- action: notify.android_tv_fire_tv_192_168_1_40
  continue_on_error: true
  data:
    message: "🚗 {{ plate_text }}"
    data:
      image: "http://192.168.x.x:8123/local/sentinel_latest.jpg?t={{ now().timestamp() | int }}"
      interrupt: 1

Wenn der TV einen Timeout hat oder die Integration wieder ausfällt, kommen die Telefonbenachrichtigungen trotzdem durch. Der TV ist schön zu haben. Telefone sind es nicht.

Diese drei Dinge zusammen haben es gelöst. Der TV zeigt den Snapshot jetzt innerhalb von etwa einer Sekunde, und in den Fällen wo der TV aus ist oder die Integration hakt, bekommen die Telefone immer eine Benachrichtigung, egal was passiert.

Update, Mai 2026: Die Kennzeichenerkennung ist rausgeflogen. Die Genauigkeit bei Nacht war nicht zuverlässig genug — Kennzeichen bei ungünstigem Winkel oder bei starkem Regen gaben häufiger “none” zurück als ein echtes Ergebnis, und zwei LLM-Vision-Aufrufe pro Fahrzeugereignis addierten eine Latenz die die Benachrichtigung langsam wirken ließ. Das aktuelle Setup überspringt ALPR komplett: Fahrzeug- oder Personenerkennung → Fluent-Snapshot → TV und Telefone. Die rollende Kennzeichenliste ist weg. Die Kamera, die TV-Integration und der continue_on_error-Ansatz sind geblieben. Der KI-Layer nicht.