Kameras lokal auswerten mit Frigate: Zonen, Kennzeichen und Home Assistant

Schema: Fünf Reolink-Kameras liefern ihre Streams über den Home Hub an Frigate auf Knoten 3 mit Intel-iGPU und melden Ereignisse an Home Assistant

Verfasst von

in

Unsere Reolink-Kameras rund ums Haus liefern ihre Videoströme und einfachen Bewegungsmeldungen zunächst an den lokalen Reolink Home Hub. Um Personen, Fahrzeuge, Tiere, Gesichter und Kennzeichen ohne Cloud-Abo direkt im eigenen Netz auszuwerten, habe ich zusätzlich Frigate aufgesetzt und über MQTT an Home Assistant gekoppelt. Die Reolink-Integration bleibt parallel aktiv: Schwenken, Licht, Türklingel und die Aufzeichnung im Home Hub funktionieren damit auch dann weiter, wenn der Frigate-Container gestoppt ist.

Schema: Fünf Reolink-Kameras liefern ihre Streams über den Home Hub an Frigate auf Knoten 3 mit Intel-iGPU und melden Ereignisse an Home Assistant

Aufbau auf Knoten 3: LXC, Docker und die Intel-iGPU

Für die Bildanalyse kam im Cluster nur Knoten 3 in Frage, da Knoten 1 und Knoten 2 zu wenig Rechenleistung bieten. In Knoten 3 arbeitet ein Intel i5-13500. Die dedizierte Radeon RX 6800 im selben Rechner ist bereits fest an eine virtuelle Maschine für KI-Aufgaben durchgereicht, die integrierte Grafikeinheit der Intel-CPU war dagegen noch frei.

Frigate 0.18 läuft im LXC-Container unter Docker. Dem Container ist /dev/dri vom Host durchgereicht, sodass Frigate über OpenVINO die Objekterkennung und über Intel Quick Sync die Videodekodierung auf der iGPU berechnet. Im lokalen Netz ist die Weboberfläche unter https://frigate.example.lan erreichbar; von unterwegs greife ich ausschließlich über Home Assistant auf Kameras und Ereignisse zu.

Beim Speicherplatz musste ich aufpassen. Der ZFS-Pool auf Knoten 3 lag bereits bei 87 Prozent Auslastung, weshalb dort keine Videodaten landen durften. Auf dem lokalen NVMe-Speicher (nvme-storage) waren noch rund 1,2 TB frei, allerdings ist der darunterliegende Thin-Pool überbucht. Der Container hat daraus einen eigenen Mountpoint mit 393 GB für /media/frigate erhalten, der von der Sicherung zum Proxmox Backup Server ausgenommen ist. Gesichert wird nur das Systemlaufwerk des Containers, während die Konfiguration versioniert im Git-Repository liegt.

Auf eine Daueraufnahme verzichte ich komplett. Frigate speichert lediglich Ereignisse mit Clip und Schnappschuss für sieben Tage; als Rückfall liegen die Aufnahmen ohnehin auf dem Reolink Home Hub. Schon wenige Tage nach dem Start, am 16. Oktober, standen rund 300 Ereignisse mit zusammen 2,8 GB auf dem Laufwerk.

Beim Einrichten von Frigate 0.18 und dem Reolink Home Hub bin ich über mehrere Eigenheiten gestolpert:

  • In Frigate 0.18 ist die Objekterkennung global ab Werk ausgeschaltet; ohne ein ausdrückliches detect: enabled: true in der Konfiguration zeigt Frigate zwar das Live-Bild an, wertet aber nichts aus.
  • Koordinaten für Zonen und Masken müssen in Frigate 0.18 strikt kleiner als 1 sein. Wenn du ein Polygon bis an den Bildrand ziehst, trägst du 0.999 statt 1.0 ein.
  • Frigate schreibt die config.yml beim Start um. Wenn du die Datei im Git-Repository pflegst, solltest du sie nach dem ersten Start frisch aus dem Container kopieren, bevor du weitere Änderungen einpflegst.
  • Separate Benutzer mit bloßen Leserechten für den RTSP-Abruf lassen sich auf dem Reolink Home Hub nicht per Skript anlegen, da die API des Hubs AddUser und ModifyUser mit not support ablehnt.

Fünf Kameras, ein Tele-Objektiv und drei Betriebsarten

Alle Kameras laufen über den Reolink Home Hub. Um die Rechenlast niedrig zu halten, wertet Frigate den niedriger aufgelösten Unterstream aus und schneidet bei einem Treffer den hochauflösenden Hauptstream mit. Erkannt werden die mitgelieferten Standardobjekte ohne kostenpflichtiges Frigate+-Abo: Personen, Autos, Fahrräder, Motorräder, Katzen, Hunde und Vögel.

KameraModellBetriebsart in FrigateBesonderheit
TürklingelReolink DoorbellDauerhaft aktivZone vor dem Haus, Gesichter im ganzen Bild
Einfahrt (Weitwinkel)Reolink TrackMixDauerhaft aktivZone auf dem Garagenhof, Kennzeichenerkennung
Einfahrt (Tele)Reolink TrackMixDauerhaft aktivAuto-Tracking, eigene Kamera ohne Zonen und ohne Meldungen
GartenReolink Argus PT (Akku + Solar)Ereignisgesteuert (3 Min.)Wird per MQTT durch Home Assistant geweckt
InnenkameraReolink E1 ProNur bei AbwesenheitLäuft nur, wenn das Haus leer ist

Die TrackMix an der Einfahrt besitzt zwei Objektive und liefert zwei getrennte Videoströme. Das Weitwinkel-Objektiv zeigt fest den gesamten Hof. Das zweite Objektiv ist ein Tele-Objektiv, das bewegten Personen oder Fahrzeugen per Auto-Tracking automatisch folgt. Weil sich der Bildausschnitt beim Schwenken laufend verschiebt, ergeben feste Zonen dort keinen Sinn. Ich habe den Tele-Stream deshalb als eigene Kamera ohne Zonen und ohne eigene Benachrichtigungen in Frigate eingetragen. Durch die engere Brennweite liefert dieses Objektiv die schärfsten Aufnahmen für die Gesichts- und Kennzeichenerkennung.

Die Innenkamera darf nur aufnehmen und auswerten, wenn alle Bewohner als abwesend gemeldet sind. Eine zweite E1 Pro war beim Einrichten offline und noch nicht am Home Hub angemeldet, sie ist deshalb in Frigate nicht eingebunden.

Zonen, Bewegungsmasken und die Kennzeichenerkennung

Gegen Fehlalarme hilft in Frigate das Zusammenspiel aus Zonen und Masken, wobei du drei Begriffe sauber trennen musst. Eine Zone (Z1, Z2) markiert den Bereich, in dem ein erkanntes Objekt einen Alarm oder eine Benachrichtigung auslösen soll. Eine Bewegungsmaske (M1) verhindert lediglich, dass eine Pixeländerung an dieser Stelle die Objekterkennung anstößt – das Bild selbst bleibt in der Live-Ansicht und in der Aufnahme vollkommen sichtbar. Willst du einen Bereich wie die Glastür vom Garten ins Haus auch in den gespeicherten Videos unkenntlich machen, musst du eine Privatzone direkt in den Kameraeinstellungen der Reolink-App anlegen. Erst dann wird die Fläche schon im Videostrom geschwärzt, bevor er bei Frigate ankommt.

Vergleich: Bewegungsmasken für den Zeitstempel, Alarmzonen für den Garagenhof und das Tele-Objektiv ohne Zonen für Gesichter und Kennzeichen

Bei den Bewegungsmasken bin ich im zweiten Anlauf sehr sparsam geworden. Deckst du etwa an der Türklingel den Gehweg hinter dem Gartenzaun mit einer Bewegungsmaske ab, blendet Frigate auch die Köpfe von Personen aus, die direkt vor dem Zaun auf dem Grundstück stehen. Deshalb gibt es an Türklingel, Garten und Einfahrt nur noch eine kleine Bewegungsmaske M1 über dem eingeblendeten Zeitstempel und dem Kamerasymbol. Den Zeitstempel selbst lasse ich in den Kameras eingeschaltet, damit er in den Rückfall-Aufnahmen des Home Hubs erhalten bleibt; die Maske sorgt dafür, dass das sekündliche Umspringen der Uhrzeit keine Erkennung auslöst. Die relativen Koordinaten der Zonen und Masken gelten in Frigate gleichermaßen für den Unter- und den Hauptstream.

An der Einfahrt habe ich die Zone Z1 anhand eines Tagbilds exakt auf die gepflasterte Fläche unseres Garagenhofs inklusive des angrenzenden Beets gelegt. Der Carport des Nachbarn oben rechts im Bild liegt außerhalb von Z1. Da die Kennzeichenerkennung (LPR) so eingestellt ist, dass sie nur Fahrzeuge innerhalb von Z1 auswertet, löst das Nachbarauto keine Meldungen aus. Eigene parkende Autos auf dem Hof erkennt Frigate einmal beim Einfahren und meldet sie danach nicht erneut, solange sie stehen bleiben. Bekannte Nummernschilder werden nach dem ersten Erkennen in der Konfiguration als known_plates hinterlegt.

Für die Gesichtserkennung sammelt Frigate unter Face Library → Train automatisch Ausschnitte erkannter Gesichter der letzten Tage. Dort legst du über Add Face einen Namen an und weist anfangs fünf bis zehn scharfe Aufnahmen zu, während du unscharfe oder stark seitliche Bilder löschst. Sobald das Modell angelernt ist, taucht der erkannte Name direkt in den Benachrichtigungen und im Home-Assistant-Sensor (sensor.*_last_recognized_face) auf.

Automationen, Akku-Kamera und der Reolink-Medienbrowser

In Home Assistant ist Frigate über MQTT und die entsprechende Integration aus HACS angebunden; für das Dashboard nutze ich die mitgelieferten Standardkarten. Damit das Smartphone im Alltag nur bei relevanten Ereignissen vibriert, filtern die Automationen nach festen Regeln: Eine erkannte Person im Außenbereich löst nur dann eine Push-Nachricht mit Schnappschuss aus, wenn niemand zu Hause ist oder es nachts ist. Ausnahmen sind das Betätigen der Türklingel und jedes auf dem Garagenhof erkannte Kfz-Kennzeichen – beides wird unabhängig von der Anwesenheit gemeldet.

Im Garten hängt eine Reolink Argus PT mit Akku und Solarpanel. Ein dauerhafter RTSP-Abruf durch Frigate würde den Akku trotz Solarpanel schnell leeren. Deshalb ist die Gartenkamera in Frigate standardmäßig deaktiviert. Sobald die Reolink-Integration in Home Assistant eine Bewegung im Garten meldet, schaltet eine Automation die Kamera in Frigate per MQTT unter frigate/garten/enabled/set ein und nach drei Minuten Nachlaufzeit wieder aus.

Im Probebetrieb zeigte sich die Schwachstelle dieser Kette: Die Automation lief zwar planmäßig an, Frigate hatte für die Gartenkamera aber noch kein Ereignis gespeichert. Vermutlich fehlt der Anfang, weil die Akku-Kamera erst aufwachen muss und der Stream über den Home Hub kommt.

Der Reolink Home Hub selbst zeichnet das Ereignis dagegen vom ersten Moment an auf. Ein 31 Sekunden langer Clip in hoher Auflösung belegt rund 13 MB und lässt sich über die Medienquelle der Reolink-Integration in Home Assistant (media-source://reolink/CAM|<Hub-ID>|2) innerhalb von etwa 20 Sekunden abrufen. Die aufgelöste Videoadresse (/api/reolink/video/…) eignet sich nicht als fester Link, weil Home Assistant sie signiert und die Signatur nach kurzer Zeit abläuft.

Stattdessen verlinkt eine Automation jetzt auf den Tagesordner der Gartenkamera im Medienbrowser von Home Assistant. Dieser Pfad ist statisch und läuft nicht ab:

/media-browser/browser/app,media-source%3A%2F%2Freolink/playlist,media-source%3A%2F%2Freolink%2FCAM%7C<Hub-ID>%7C2/playlist,media-source%3A%2F%2Freolink%2FRES%7C<Hub-ID>%7C2%7Cmain/playlist,media-source%3A%2F%2Freolink%2FDAY%7C<Hub-ID>%7C2%7Cmain%7CJJJJ%7CM%7CT

Die einzelnen Ebenen des Pfads bestehen jeweils aus typ,media_content_id (URL-kodiert), wobei Jahr, Monat und Tag am Ende ohne führende Nullen eingesetzt werden. Ausgelöst wird die Automation durch binary_sensor.garten_person oder binary_sensor.garten_fahrzeug – einen eigenen Tiersensor stellt die Argus PT in Home Assistant nicht bereit. Auch diese Meldung greift nur bei Abwesenheit oder nachts zwischen 22 und 6 Uhr und sendet höchstens eine Nachricht alle zwei Minuten. Änderungen an den Automationen ließen sich in Home Assistant per Reload ohne Neustart des gesamten Dienstes aktivieren.

Tippst du in der Benachrichtigung auf die Schaltfläche „Reolink-Clip“ oder im Kamera-Dashboard auf die Kachel „Reolink-Aufnahmen Garten“, sollte sich in der App der heutige Ordner in hoher Auflösung öffnen; der Test am Handy bei einem echten Ereignis steht noch aus. Du musst im Alltag nur zwei Dinge wissen: Der neueste Clip steht in dieser Liste ganz unten, und er erscheint erst rund eine Minute nach dem Auslösen, sobald der Home Hub die Datei fertig geschrieben hat.

Probebetrieb abgenommen – und Container vorerst wieder gestoppt

Für den laufenden Betrieb überwacht Checkmk den Dienststatus, die Erkennungszeit der Grafikeinheit, den freien Platz auf dem NVMe-Mountpoint und die Erreichbarkeit der Kameras. Nach einer Woche Probebetrieb habe ich die Einrichtung samt Sicherung und Wiederherstellungs-Runbook am 21. Oktober abgenommen. Offen blieb, dass die beiden Einfahrts-Kameras im Dashboard noch kein Bild liefern; das habe ich als bekannt und nicht abnahmerelevant vermerkt, die Klärung steht erst 2027 an.

Drei Tage später, am 24. Oktober, musste ich den Frigate-Container auf Knoten 3 allerdings vorübergehend herunterfahren und den Autostart abschalten. Auf demselben Knoten läuft im Nachbar-Container inzwischen Tdarr für die Videoumwandlung, das sich die Intel-iGPU mit Frigate teilt, für seine Arbeitsläufe aber den freien Arbeitsspeicher auf Knoten 3 benötigte.

Hier zahlt sich aus, dass die Reolink-Integration in Home Assistant und der Home Hub eigenständig arbeiten: Türklingel, Live-Streams und die Aufzeichnung im Hub sind darauf ausgelegt, während der Pause weiterzulaufen. Sobald die Speicherauslastung auf Knoten 3 geklärt ist – auf dem Host wartet noch die virtuelle Maschine für KI-Aufgaben mit 56 GB zugewiesenem RAM auf eine Prüfung –, geht Frigate mit zwei Befehlen wieder ans Netz:

pct set <ID> -onboot 1 && pct start <ID>

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht, deine IP-Adresse wird nicht gespeichert. Kommentare erscheinen erst nach Freigabe. Was mit deinen Angaben passiert, steht in der Datenschutzerklärung. Pflichtfelder sind mit * markiert.