Raspberry als IP-Cam nutzen mit ‚motion‘
In diesem Beitrag möchte ich zeigen, wie sich ein Raspberry Pi als Kameraserver einsetzen lässt. Dazu können entweder Webcams verwendet werden, die via USB mit dem Raspberry verbunden werden oder direkt eine Cam für die spezielle Kameraschnittstelle des Raspberry. Nach diesem Beitrag sind wir in der Lage, via URL die am Raspberry angeschlossene oder via Netzwerk erreichbare Kamera zu betrachten sowie die Bewegungserkennung ein- und auszuschalten.
System aktualisieren
Vorbereitend aktualisieren wir unser System, wie vor jedem neuen Projekt:
apt-get update && apt-get upgrade -y
USB-Kamera anschließen
Nach der Aktualisierung und ggf. einem Neustart des Systems schließen wir die Kamera an einen freien USB-Port des Raspberry. Dabei sollte beachtet werden, dass ein solches Multimedia-Device eine gewisse Leistung benötigt und das 5V-Netzteil dementsprechend dimensioniert ist. Ich bin für dieses System mit einem 1,5A Netzteil bisher gut ausgekommen.
Nach dem Anschließen prüfen wir mit
dmesg |tail
ob die Kamera vom System erkannt wurde.
Wurde die Kamera vom System erfolgreich erkannt, prüfen wir mit
ls -ltrh /dev/video*
unter welchem Pfad die Kamera im System eingebunden wurde. Diesen Pfad benötigen wir gleich für die Konfiguration.
motion installieren
Anschließend installieren wir das Programm motion mittels des Debian-Paketinstallers.
apt-get install motion
Wollen wir Videos aufzeichnen, benötigen wir noch das Paket „ffmpeg„, welches wir leider nicht in einemRepository vorfinden. Daher installieren wir dieses händisch mit:
wget https://github.com/ccrisan/motioneye/wiki/precompiled/ffmpeg_2.8.3.git325b593-1_armhf.deb
dpkg -i ffmpeg_2.8.3.git325b593-1_armhf.deb
Autostart konfigurieren
Nun konfigurieren wir unser System so, dass motion beim Systemstart ebenfalls gestartet wird. Dazu öffnen wir die Datei „/etc/default/motion“ mit einen Texteditor unserer Wahl, beispielsweise nano…
nano /etc/default/motion
…und ändern hier den Eintrag
start_motion_daemon=no
auf
start_motion_daemon=yes
Haben wir dafür den Texteditor nano verwendet, können wir diesen mit der Tastenkombination STRG+x verlassen und bestätigen die Abfrage, ob die Dateiänderungen gespeichert werden sollen mit Ja.
Grundkonfiguration
Die hauptsächliche Konfiguration findet in der Datei „/etc/motion/motion.conf“ statt. Eine komplette Auflistung aller möglichen Konfigurationsmöglichkeiten findet man direkt beim Entwickler.
Wir verwenden in diesem Beitrag die Webcam „Microsoft VX-5000„, welche via USB angeschlossen ist. Hierfür zeige ich eine mögliche Grundkonfiguration von motion. Zuvor sichern wir jedoch die bereits vorhandene Standardkonfiguration mit
mv /etc/motion/motion.conf /etc/motion/motion.conf.bak
und erstellen eine neue Konfiguration mittels
nano /etc/motion/motion.conf
mit folgendem Inhalt:
daemon on process_id_file /var/run/motion/motion.pid videodevice /dev/video0 v4l2_palette 8 input 8 norm 0 width 640 height 480 framerate 2 output_all off ffmpeg_cap_new off output_motion off output_normal off quality 100 target_dir /tmp/motion text_right webcam_port 8081 webcam_quality 100 webcam_maxrate 2 webcam_localhost off
Zur Erläuterung einzelner Konfigurationszeilen:
daemon on process_id_file /var/run/motion/motion.pid videodevice /dev/video0 v4l2_palette 8 input 8 norm 0 width 640 height 480 framerate 2 output_all off ffmpeg_cap_new off output_motion off output_normal off quality 100 target_dir /tmp/motion webcam_port 8081 webcam_quality 100 webcam_maxrate 2 webcam_localhost off |
motion wird als Hintergrundprozess gestartet hier wird die Prozess-ID angegeben welches Video-Device soll verwendet werden? (siehe „Kamera anschließen“)es handelt sich um eine USB-Cam wir nutzen die PAL-Norm Breite des Ausgabevideos Höhe des Ausgabevideos Anzahl der Bilder pro Sekunde, die von der Cam empfangen werden sollen Es werden keine Bilder kontinuierlich gespeichert Es werden keine Videos erstelltEs werden keine Bilder bei erkannter Bewegung erstellt Die JPEG-Qualität wird auf 100% belassen Der Speicherort der zu speichernden Bilder Der Port, über den motion erreichbar ist und das Kamerabild anzeigt Die Bildqualität in Prozent, die über den Webserver ausgegeben wird Die Bilder pro Sekunde, die über den Webserver ausgegeben werden Deaktivierung der Option, dass der Webserver nur über „localhost“ erreichbar ist. |
Mit den zusätzlichen Optionen
text_right %d.%m.%Y - %H:%M:%S text_left Klenzel::Demo
lässt sich über das Bild der Webcam ein Text ausgeben. Im angegeben Beispiel wird links ein statischer Text und auf der rechten Seite das Datum mit Uhrzeit angezeigt.
Mit der bisherigen Konfiguration können wir nun bereits motion mittels
/etc/init.d/motion start
starten und mit
ps aux |grep motion
prüfen, ob der Prozess läuft.
War der Start erfolgreich, können wir bereits jetzt das Bild der Kamera im Browser mit folgender Adresse betrachten:
http://ip_deines_raspberry:8081
Bewegungserkennung ohne Aufnahme
motion bietet die Möglichkeit, Bewegungen im Bild zu erkennen. Bei erkannten Bewegungen können Bilder oder Videos erstellt werden, die an einem zuvor definierten Speicherort hinterlegt werden. Oder es besteht die Möglichkeit, bei einer Bewegung ganze Befehle oder eigene Scripts zu starten.
Dazu ist es notwendig, die Konfiguration zu erweitern bzw. anzupassen.
threshold 1500 on_event_start echo "AN" >> /tmp/motion.txt on_event_end echo "AUS" >> /tmp/motion.txt
Threshold legt dabei die Anzahl der Pixel fest, mit der sich ein Bild vom vorhergehenden Bild unterscheiden muss, damit eine Bewegung als solche interpretiert wird. Mit diesem Wert muss ein wenig herumgespielt werden, im Innenbereich mag dieser passen, jedoch wäre ein Wert von 1500 für den Außeneinsatz zu empfindlich.
Mit den Zeilen „on_event_start“ und „on_event_stop“ lassen sich Befehle und Scripte definieren, welche bei einer erkannten Bewegung bzw. nach einer gewissen Zeit der Ruhe ausgeführt werden. In unserem Beispiel werden lediglich die Wöter „An“ und „Aus“ in die Datei „/tmp/motion.txt“ geschrieben, um den Erfolg zu prüfen. Denkbar wären hier jedoch unzählige Möglichkeiten, wie beispielsweise das Versenden einer eMail oder das Setzen eines Status bei openHAB.
Nach jeder Änderung der Konfigurationsdatei ist es notwendig, motion mittels
/etc/init.d/motion restart
neu zu starten.
Bewegungserkennung mit Aufnahme
Soll motion bei einer erkannten Bewegung ein Video vom Geschehen aufzeichnen, ändern wir in unserer Konfiguration die Zeile
ffmpeg_cap_new off
in
ffmpeg_cap_new on
und ergänzen unsere Konfiguration mit folgenden Zeilen:
snapshot_filename %v-%Y%m%d%H%M%S-snapshot movie_filename %v-%Y%m%d%H%M%S ffmpeg_video_codec swf
Nun wird bei jeder Bewegung ein Video im Format eines Flash-Movies im Ordner /tmp/motion/ erstellt und mit der Uhrzeit des Geschehens benannt. Denkbar wäre hier eine Einbindung eines NAS-Systems mittels NFS oder SMB und die Konfiguration von motion zur Speicherung in den eingebundenen Ordner.
Auch hier ist die Option
threshold 1500
anzuwenden und motion nach Änderung der Konfiguration mittels
/etc/init.d/motion restart
neu zu starten.
Externe Steuerung
motion lässt sich zusätzlich von außen steuern. Möchten wir beispielsweise die Bewegungserkennung aktivieren oder deaktivieren, ergänzen wir unsere Konfiguration durch folgende Zeilen:
control_port 8080 control_localhost off
Damit richten wir einen Kontrollschnittstelle auf Port 8080 ein und lassen die Steuerung auch außerhalb von localhost zu.
Nun ist es möglich, von einem externen System die Bewegungserkennung mit dem Aufruf von
curl --silent --max-time 2 --connect-timeout 2 http://ip_des_raspberry:8080/0/detection/pause &> /dev/null
zu pausieren und mit dem Aufruf von
curl --silent --max-time 2 --connect-timeout 2 http://ip_des_raspberry:8080/0/detection/start &> /dev/null
wieder zu reaktivieren.
Mehrere Kameras verwalten
Es besteht die Möglichkeit, auch mehr als eine Kamera mit motion zu betreiben. Dabei prüfen wir zunächst wie Eingangs gezeigt, unter welchen Pfaden unsere Kameras im System eingebunden wurden und reduzieren die Hauptkonfiguration /etc/motion/motion.conf auf das folgende:
daemon on process_id_file /var/run/motion/motion.pid control_port 8080 control_localhost off thread /etc/motion/cam1.conf
Nun erstellen wir für jede Kamera eine seperate Konfigurationsdatei und verweisen in der motion.conf auf diese:
thread /etc/motion/cam1.conf
Eine Konfigurationsdatei könnte beispielhaft (z.B. /etc/motion/cam1.conf) wie folgt aussehen:
videodevice /dev/video0 width 640 height 480 framerate 2 output_all off ffmpeg_cap_new on output_normal off quality 100 text_right %d.%m.%Y - %H:%M:%S text_left Klenzel::Demo threshold 1500 target_dir /tmp/motion/cam1 movie_filename %v-%Y%m%d%H%M%S ffmpeg_video_codec swf auto_brightness on threshold 6000 noise_tune on minimum_motion_frames 2 webcam_port 8081 webcam_quality 100 webcam_maxrate 2 webcam_localhost off on_event_start curl --max-time 2 --connect-timeout 2 --header "Content-Type: text/plain" --request PUT --data "ON" http://openhab/rest/items/MOTION_CAM1/state on_event_end curl --max-time 2 --connect-timeout 2 --header "Content-Type: text/plain" --request PUT --data "OFF" http://openhab/rest/items/MOTION_CAM1/state
Dabei ist natürlich zu beachten, dass die Zeilen „videodevice„, „target_dir“ und „webcam_port“ für alle Kameras individuell angepasst werden müssen. Soll eine Bewegungserkennung eingerichtet werden, ist die Zeile „threshold“ natürlich wieder mit anzugeben.
Einbinden einer vorhandenen IP-Cam
Aus verschiedenen Gründen kann es interessant sein, keine lokale USB-Kamera sondern eine bereits vorhandene Netzwerkkamera in motion einzubinden. Möglicherweise unterstützt die IP-Kamera keine Bewegungserkennung und das soll nun mittels motion nachgerüstet werden.
In diesem Fall wird die Zeile
videodevice /dev/video0
durch die folgende Einbindung ersetzt:
netcam_url http://stream_adresse_der_netzwerkkamera
Die genaue Adresse für seine IP-Cam findet man meistens im Internet, beispielsweise lautet diese für eine D-Link DCS932L wie folgt:
http://ip_der_dcs932l/mjpeg.cgi
Weitere Möglichkeiten
Eine weitere Möglichkeit, mehrere Kamera(quellen) zu verwalten und in einer netten Weboberfläche anzuzeigen, zeigt dieser Artikel über motioneye.
Möchte man auf eine Bewegungserkennung verzichten und lediglich die lokal angeschlossene Kamera streamen (z.B. an eine übergeordnete motion-Instantz), so könnte sich eine Alternative mittels mjpg_streamer anbieten, was in diesem Beitrag beschrieben ist.
Daniel Wenzel
16.02.2016 @ 20:40
Erfahrung direkt nicht, aber da ja auf beiden Geräten motion läuft, ist es theoretisch egal, welche motion-Instanz nun die Bewegungserkennung durchführt. Die Erkennung erfordert jedoch ein gewisses Maß an Ressourcen, so dass diese Aufgabe auf der etwas Leistungsstärkeren NAS besser aufgehoben ist. In die andere motion-Instanz kann man das Bild der ersten einbinden, ohne dass diese nochmals eine Bewegungserkennung konfiguriert hat.
Rainer
15.02.2016 @ 23:40
Ich habe mir gerade einen neuen Server (NAS) gebaut, auf dem motion demnächst mal mehrere Kameras bedienen soll. Motion übernimmt dann ja auch die Bewegungserkennung und Speicherung.
Zum ansehen hatte ich an MotionEye auf einem RasPi gedacht. Also ansehen ohne auszuwerten.
Habt ihr mit so einer Konstrultion erfahrung ?
Rainer
Doktor Geek
03.12.2015 @ 13:07
Motion ist eine tolle Sache. Viele Einstellungs- und Erweiterungsmöglichkeiten. Ich selber nutze den Raspberry PI mit Motion zur Videoüberwachung im Haus. Ein- Ausschalten der Überwachung funktioniert über eine App auf dem Smartphone. Ebenso kann ich über eine App das Livebild anzeigen lassen. Demnächst folgt eine Erweiterung sodass ich nicht nur per E-Mail bei Bewegung benachrichtig werde, sondern auch über die App „Telegram“ (ähnlich Whatsapp).
Grüße
Der Doktor