Howto: UniFi Protect Videofeed in Loxone einbinden

IM EINSATZ?

Dann schau dir UNSEREN LOXKURS an und profitiere von unserem Wissen!

Heute zeige ich, wie man die in UniFi Protect vorhandenen Kameras in Loxone integrieren kann. Konkret geht es darum, aus dem RTSP-Stream der Protect-Kameras, welcher per h264-Codec vorliegt, per go2rtc-Software einen MJPEG-Stream zu erzeugen, den Loxone versteht.

Wie das im Detail funktioniert, könnt ihr im nachfolgenden Blogpost nachlesen – und zusätzlich bequem per YouTube-Video nachvollziehen.

Sie sehen gerade einen Platzhalterinhalt von Standard. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf den Button unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.

Weitere Informationen

YouTube-Direktlink

Infos zu den technischen Hintergründen, weshalb ich den MINIS FORUM MS-01 Mini Workstation Intel Core i9-12900H (Affiliate-Link) im Kombination mit Proxmox einsetze, findet ihr im vorausgegangenen Blogpost Howto: Loxone Intercom Videofeed in UniFi Protect einbinden.

Unifi Protect h264-Stream ausfindig machen und testen

Als Erstes müssen wir herausfinden, ob wir auf den gewünschten Kamerastream der Unifi-Cam zugreifen können, der gleich in Loxone eingebunden werden soll.

Dazu im Unifi Protect UI die gewünschte Kamera auswählen und auf den Einstellungs-Tab wechseln. Dort unter „Share Livestream“ den Haken setzen bei „Low Resolution (640×360), wie im nachfolgenden Screenshot gezeigt:

Die angezeigte URL über das Symbol links (Copy link) kopieren.

In meinem Fall sieht die URL so aus:

rtsps://192.168.3.1:7441/yb7VcjRqgo6ax63b?enableSrtp

BTW: Dieser Link enthält neben der IP und dem Port für den RTSPS-Stream auch die zufällig erzeugte Streaming-ID (hier yb7VcjRqgo6ax63b), welche neu generiert werden kann, indem der Haken bei „Low Resolution (640×360)“ entfernt und neu hinzugefügt wird.

Die niedrige Auflösung reicht übrigens locker aus, wenn man die Kamera in der Loxone App einbinden möchte. Wer die App primär auf einem sehr großen Screen anzeigen möchte – bspw. auf einem 12″ iPAD – kann aber natürlich auch die „Medium Resolution (1024×576)“ nutzen. Ich teste aber erstmal mit der kleinsten Auflösung, da das am wenigsten Ressourcen benötigt und ich auch direkt mehrere Kameras einbinden möchte, wodurch die Anforderungen eh linear wachsen.

Jetzt aber nochmal zur Streaming-URL von eben… Damit wir diese gleich nutzen können, müssen wir diese noch etwas umbauen zu:

rtsp://192.168.3.1:7447/yb7VcjRqgo6ax63b

Also aus rtsps wird rtsp, der Port ändert sich von 7441 zu 7447 und das ?enableSrtp am Ende kann weg. Fragt mich nicht, wie man darauf kommt – ich habe das funktionierende Zielformat irgendwo online gefunden vor Ewigkeiten…

Also erstmal diese URL in VLC (externer Link) testen. Dazu unter Ablage -> Netzwerk öffnen bei URL die eben gebastelte URL einfügen und mit Öffnen bestätigen:

Nach 2-3 Sekunden sollte das Bild angezeigt werden:

Test erfolgreich. Die eben zusammengeschusterte Streaming-URL auf dem Rechner zwischenspeichern, da wir sie gleich wieder im go2rtc-Tool benötigen werden.

LXC-Container auf dem Proxmox Host einrichten

Alle vorbereitenden Schritte dazu und weitere Details dazu gibt es im Blogpost Howto: Loxone Intercom Videofeed in UniFi Protect einbinden. Hier erkläre ich die Basics nicht mehr und liefere gleich das Ergebnis…

Also erstmal den LXC-Container in Proxmox erstellen:

pct create 1010 \
  /var/lib/vz/template/cache/debian-12-standard_12.12-1_amd64.tar.zst \
  --hostname unifi2loxone \
  --password meinpasswort \
  --cores 1 \
  --memory 512 \
  --net0 name=eth0,bridge=vmbr0,ip=dhcp,type=veth \
  --rootfs data:4 \
  --unprivileged 0 \
  --start 0

UPDATE: Habe den Parameter rootfs von „local-lvm“ auf „data“ umgestellt, da ich hier auf meinem Proxmox-Host einfach viel mehr Platz habe.

Auf dem Proxmox-Host checken, ob iGPU-Ressourcen (Intel Plattform) verfügbar sind:

ls -l /dev/dri || true

Da sollte dann sowas hier angezeigt werden:

root@proxi:~# ls -l /dev/dri || true total 0 drw-rw—- 2 root root 80 Aug 21 00:22 by-path crw-rw—- 1 root video 226, 1 Aug 21 00:22 card1 crw-rw—- 1 root render 226, 128 Aug 21 00:22 renderD128

Wenn card1 und renderD128 angezeigt werden, kann man mit den folgenden Schritten weitermachen.

Jetzt /dev/dri für VAAPI an den LXC durchreichen (Befehle auf dem Proxmox-Host ausführen!)

printf '%s\n' \
'lxc.cgroup2.devices.allow: c 226:* rwm' \
'lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir' \
>> /etc/pve/lxc/1010.conf
pct start 1010 && \
pct enter 1010

Jetzt sollte der Befehl

ls -l /dev/dri

das hier ausgeben:

root@intercom:~# ls -l /dev/dri total 0 drw-rw—- 2 root root 80 Aug 20 22:22 by-path crw-rw—- 1 root video 226, 1 Aug 20 22:22 card1 crw-rw—- 1 root 993 226, 128 Aug 20 22:22 renderD128

Nun notwendige APT-Repository-Einträge für Debian 12 ergänzen und die passende Pakete und Treiber installieren, damit die Hardwareressource auch genutzt werden kann:

cat >/etc/apt/sources.list <<'EOF'
deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
deb http://security.debian.org bookworm-security main contrib non-free non-free-firmware
EOF
apt update && \
apt install -y wget ffmpeg vainfo intel-media-va-driver-non-free

Ob alles geklappt hat, erfährt man mit dem Befehl:

vainfo --display drm | head -n 20

Es sollte dann sowas hier ausgegeben werden:

root@intercom:~# vainfo –display drm | head -n 20 libva info: VA-API version 1.17.0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so libva info: Found init function __vaDriverInit_1_17 libva info: va_openDriver() returns 0 vainfo: VA-API version: 1.17 (libva 2.12.0) vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics – 23.1.1 () vainfo: Supported profile and entrypoints VAProfileNone : VAEntrypointVideoProc VAProfileNone : VAEntrypointStats VAProfileMPEG2Simple : VAEntrypointVLD VAProfileMPEG2Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointEncSliceLP VAProfileH264High : VAEntrypointVLD VAProfileH264High : VAEntrypointEncSliceLP VAProfileJPEGBaseline : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointEncPicture VAProfileH264ConstrainedBaseline: VAEntrypointVLD VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP VAProfileVP8Version0_3 : VAEntrypointVLD VAProfileHEVCMain : VAEntrypointVLD VAProfileHEVCMain : VAEntrypointEncSliceLP VAProfileHEVCMain10 : VAEntrypointVLD VAProfileHEVCMain10 : VAEntrypointEncSliceLP

Jetzt sind alle vorbereitenden Schritte des LXC-Containers abgeschlossen und wir können go2rtc installieren…

Unifi Protect h264-Stream per go2rtc in MJPEG umwandeln

go2rtc herunteralden und Dateirechte anpassen:

wget -O /usr/local/bin/go2rtc https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_amd64 && \
chmod +x /usr/local/bin/go2rtc

Config schreiben:

cat >/etc/go2rtc.yaml <<'EOF'
streams:
  spielturm: "exec:ffmpeg -hide_banner -loglevel error -rtsp_transport tcp -i rtsp://192.168.3.1:7447/yb7VcjRqgo6ax63b -an -vf scale=640:360,fps=10 -q:v 5 -f mpjpeg pipe:1"

api:
  listen: ":1984"
rtsp:
  listen: ":8554"
EOF

Hier muss nur der Eintrag „spielturm“ und die korrekte rtsp-URL eingetragen werden, welche am Anfang des Howto ermittelt wurde.

Systemd-Service anlegen und starten:

cat >/etc/systemd/system/go2rtc.service <<'EOF'
[Unit]
Description=go2rtc RTSP bridge
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStartPre=/bin/sleep 10
ExecStart=/usr/local/bin/go2rtc -config /etc/go2rtc.yaml
Restart=always

[Install]
WantedBy=multi-user.target
EOF

Dienst laden, aktivieren, starten, prüfen:

systemctl daemon-reload && \
systemctl enable --now go2rtc && \
systemctl status go2rtc --no-pager

Mit dem Befehl

hostname -I | awk '{print $1}'

können wir erstmal die IP-Adresse des LXC-Containers checken. In meinem Fall:

192.168.3.186

Nun sollte go2rtc per Web-UI erreichbar sein über den Port 1884:

http://192.168.3.186:1984

Hier sollte dann auch direkt der „spielturm“-Eintrag vorhanden sein. Hier nichts weiter klicken – ist nur der Test, ob der Dienst korrekt gestartet wurde.

Der MPEG-Stream sollte dann über die nachfolgende URL verfügbar sein. Die Adresse manuell im Browser eingeben – über den „Stream“-Button im go2rtc-Interface geht das nicht:

http://192.168.3.186:1984/api/stream.mjpeg?src=spielturm

Tada, das Bild sollte nach kurzer Bedenkzeit in ziemlich grütziger Qualität angezeigt werden:

Hier lassen sich vermutlich noch etwas Qualität mit dem q-Setting in der go2rtc-Config herausholen. Für mich reicht das aber erstmal zum Testen…

Ein Standbild kann man übrigens auch über nachfolgende URL erhalten:

http://192.168.3.186:1984/api/frame.jpg?src=spielturm

UniFi-MJPEG-Kamerastream in Loxone Config einbinden

Als letzten Schritt müssen wir den eben erstellen Stream „nur“ noch in der Loxone Config einfügen:

Suchen (F5) -> „Benutzerdefinierte Intercom“ -> bei Name „Spielturm“ eingeben.

Bei „URL Videostream (intern)“ die Streaming-URL von eben eintragen. Bei „URL Videostream (extern)“ ebenfalls.

Den „API Connector“ der eben erzeugten Intercom mit dem Namen Spielturm auf ein Blatt ziehen. Dadurch wird der Baustein direkt mit einem automatisch eingefügten Türsteuerung(sbaustein) verbunden:

„In Miniserver speichern“ und das Ergebnis in der App betrachten:

Das „Bild bei Klingeln“ habe ich mir an dieser Stelle gespart, da ich ich die Kamera nicht als „Intercom“ aka Gegensprechanlage nutzen möchte.

Spannend wäre jetzt noch die verfügbaren Buttons im Kamerabild zu verlinken, sodass man mit „Licht“ bspw. den Beleuchtungsbaustein der Terrassenüberdachung ansprechen kann.

Aus meinem täglichen Leben

Die letzten Monate hab ich mich echt tief ins „Rabbit-Hole“ des Hin- und Herumwandelns von Videostreams beschäftigt. Aus diesem Grund war dieses kleine Umsetzungsprojekt in wenigen Minuten erledigt. Jetzt dauert es nur noch etwas, bis wirklich alle Kameras in Loxone eingetragen sind.

Cool wäre natürlich, wenn Loxone nativ h264-Streams unterstützen würde und man nicht auf den Oldschool-MJPEG-Schrott zurückgreifen müsste, aber man muss sich nur zu helfen wissen. Vielleicht wird es Zukunft ja doch noch was und Loxone bessert hier nach, evtl ja sogar mit h265-Support, who knows…

1 Kommentar
  1. Hi Jörg

    Danke für dein Video. Ich greife zurzeit direkt bei der Kamera von Unifi das signal ab ohne Server dazwischen. Kennst du auch diese Methode ? http://192.168.1.11/snap.jpeg (Im Intercom Benutzernamen und Pw ). Ich habe natürlich auch euren Kurs gebucht über Loxone. Leider ist dieser schon sehr alt. Kommt da noch was ? Wenn du auch in Kombi mit Victron & Loxone mit Spotpreis ladung ein example File od. Video hättest , wär das der Hammer. Danke Lg aus AT Daniel

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Das könnte dir auch gefallen