Raspi OS Bookworm/Trixie: Motioneye mit „libcamerify“ und libcamera


Projekte wie Motioneye und Motion basieren in der Regel auf dem Camera Legacy Stack von Raspi OS, der in aktuellen Systemen wie Bookworm und Trixie nicht mehr unterstützt wird.

Dennoch lassen sich diese mit libcamera / rpicam nutzen.

Das folgende Tutorial setzt ein fertig installiertes Raspi OS Bookworm oder Trixie voraus. Ob es sich hierbei und die volle, oder die Lite Variante handelt spielt keine Rolle.

Zuerst wird das System, wenn noch nicht gemacht, aktualisiert:

sudo apt update && sudo apt dist-upgrade -y

Anschließend werden notwendige Pakete für Motioneye installiert:

sudo apt --no-install-recommends install ca-certificates curl python3 -y

Auf einigen Systemen sind noch die folgenden Pakete notwendig:

sudo apt --no-install-recommends install python3-dev gcc libjpeg62-turbo-dev libcurl4-openssl-dev libssl-dev -y

Jetzt werden auch noch die notwendigen libcamera / rpicam Pakete installiert:

sudo apt install libcamera-v4l2 libcamera-tools -y

Nach der erfolgten Installation der notwendigen Pakete sorgen Wir dafür das Python3 auch Module nutzen kann, die außerhalb von „virtuellen Umfeldern“ laufen:

Dazu wird im Terminal folgendes ausgeführt:

grep -q '\[global\]' /etc/pip.conf 2> /dev/null || printf '%b' '[global]\n' | sudo tee -a etc/pip.conf > /dev/null
sudo sed -i '/^\[global\]/a\break-system-packages=true' /etc/pip.conf

Anschließend können wir den Python Paket Manager „pip“ installieren:

curl -sSfO 'https://bootstrap.pypa.io/get-pip.py'
sudo python3 get-pip.py
rm get-pip.py

Nach der Installation wird eine Warnung ausgegeben, das Pakte die außerhalb eines „Virtuellen Umfeldes“ installiert werden Paket-Abhängigkeiten schädigen können.

Dies kann hier in diesem Fall ignoriert werden.

Anschließend kann Motioneye in der aktuellsten Version mit dem Python Paketmanager „pip“ installiert und initialisiert werden:

sudo python3 -m pip install --pre motioneye
sudo motioneye_init

Wer auf lieber zu einem offiziellen Stable Release greifen möchte installiert stattdessen auf dem folgenden Weg:

sudo python3 -m pip install motioneye
sudo motioneye_init

Dies kann dann, je nach verwendeter Hardware des SBC schon mal einige Kaffee lang dauern. Also Geduld bewahren und abwarten.

Nach der erfolgreichen Installation ist Motioneye bereits im Webinterface erreichbar.

Das Motioneye-Webinterface findet Ihr unter folgender Adresse:

http://[your_ip]:8765/

Beim Erst Start des Webinterface nutzt als Nutzernamen „admin“, und kein Passwort. Das Passwort und den gewünschten Nutzernamen legt Ihr nach dem ersten Einloggen in der linken Seitenleiste fest, und speichert diese mit „Übernehmen“.


Kameras wären hier zwar bereits wählbar, aber noch nicht lauffähig, und Ihr würdet nur ein graues Bild erhalten.

Daher sorgen wir zunächst dafür, das Motioneye zukünftig mit „libcamerify“ startet. „libcamerify“ ist sozusagen der Vermittler zwischen dem alten Legacy-Stack und dem aktuellem Libcamera/rpicam.

Dazu bearbeiten Wir die Systemd-Unit die Motioneye startet:

sudo nano /etc/systemd/system/motioneye.service

Dort suchen Wir die Zeile

ExecStart=/usr/local/bin/meyectl startserver -c /etc/motioneye/motioneye.conf

und ersetzen diese durch das folgende:

ExecStart=/usr/bin/libcamerify /usr/local/bin/meyectl startserver -c /etc/motioneye/motioneye.conf

Anschließend speichern Wir motioneye.service, und starten Motioneye mit den folgenden Kommandos neu:

sudo systemctl daemon-reload
sudo systemctl restart motioneye

Wenn Wir jetzt alles sorgfältig und vollständig durchgeführt haben, startet Motioneye mit Libcamera Unterstützung, und Ihr könnt erfolgreich Eure Kamera im Motioneye Webinterface einbinden und seht ein Bild.


Generell können noch zwei „Stolpersteine“ auftreten.

In neueren Installationen läuft Motioneye nicht mehr als „root“, sondern als Nutzer „motion“.

Der Nutzer „motion“ hat unter Umständen keinen Zugriff auf die Hardware-Encoder des Raspberry Pi. Hier kommt es dann bspw. bei Nutzung des v4l2-Codecs bei Videoaufzeichnungen zu Speicherfehlern, da der Zugriff auf den Hardware-Encoder nicht funktioniert.

Führt in diesem Fall einfach das folgende in der Konsole aus:

sudo adduser motion render

Dies sorgt dafür das der Nutzer „motion“ zur „render“ Gruppe hinzugefügt wird, und berechtigt ist auf die Hardware-Encoder zuzugreifen.

Auch habe Ich in einigen Installationen nicht reproduzierbar immer wieder das Problem, das Motion vor Motioneye startet und Motioneye dann keinen Zugriff mehr auf die Kamera hat.

Warum dies in einigen Installationen funktioniert, und in anderen nicht, habe ich bisher noch nicht heraus bekommen.

Motion muss hier aber auch gar nicht automatisch starten, da Motion eh durch Motioneye mit entsprechenden Parametern gestartet wird.

Den Automatischen Start von Motion unterbindet Ihr einfach mit der folgenden Konsoleneingabe:

sudo systemctl stop motion && sudo systemctl disable motion

Motion startet anschließend nicht mehr automatisch sondern nur noch gezielt durch Motioneye.


Ein kleiner Wehrmutstropfen aber bleibt bisher, zumindest bei Kameras ohne IR-Filter (NoIR):

Aktuell wird der Weißableich Greyworld nicht unterstützt, zumindest ist mir bisher kein Weg bekannt, diesen in Motioneye/Motion mit libcamerify, bzw. ausserhalb des Legacy-Stacks zu nutzen, da die Kameras hier jetzt als V4L2-Kameras und nicht mehr als MMAL-Kameras, wie beim Legacy-Stack, eingebunden sind.

Damit haben NoIR-Kameras ein Lila-stichiges Bild.

Als einfachen Workaround, kann man die unter /usr/share/libcamera/ipa/rpi/vci liegenden Kamera Tuning-Files umbenennen.

Standardmässig wird das Profil <CameraSensor>.json aufgerufen.Für die meisten Kamera Sensoren liegt dort auch eine <CameraSensor>_noir.json, für die Kamera-Modelle ohne Infrarot-Filter.

Hier benennt man einfach die <CameraSensor>_noir.json in <CameraSensor>.json um, und ab dem nächsten Start wird diese angepasste Tuning-Datei dann aufgerufen.

Hier einmal im Beispiel mit dem OV5647 Chipset:

Die original ov5647.json benenne ich in ov5647_ir.json um um diese nicht zu überschreiben. Anschließend benenne Ich die ov5647_noir.json in ov5647.json um, so das diese zukünftig eingelesen wird.

Mir ist es bereits passiert, das diese nach einem Update wieder überschrieben wurden, und damit wieder das Standard-Profil genutzt wurde. Daher auch nur als Workaround, da es immer passieren kann, das Ihr dies Nachträglich erneut ausführen müsst.

Loading