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.
!slideshow_deploy!
System aktualisieren
Vorbereitend aktualisieren wir unser System, wie vor jedem neuen Projekt:
1 |
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
1 |
dmesg |tail |
ob die Kamera vom System erkannt wurde.
Wurde die Kamera vom System erfolgreich erkannt, prüfen wir mit
1 |
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.
1 |
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:
1 |
wget https://github.com/ccrisan/motioneye/wiki/precompiled/ffmpeg_2.8.3.git325b593-1_armhf.debdpkg -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…
1 |
nano /etc/default/motion |
…und ändern hier den Eintrag
1 |
start_motion_daemon=no |
auf
1 |
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
1 |
mv /etc/motion/motion.conf /etc/motion/motion.conf.bak |
und erstellen eine neue Konfiguration mittels
1 |
nano /etc/motion/motion.conf |
mit folgendem Inhalt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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
1 2 |
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
1 |
/etc/init.d/motion start |
starten und mit
1 |
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:
1 |
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.
1 2 3 |
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
1 |
/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
1 |
ffmpeg_cap_new off |
in
1 |
ffmpeg_cap_new on |
und ergänzen unsere Konfiguration mit folgenden Zeilen:
1 2 3 |
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
1 |
threshold 1500 |
anzuwenden und motion nach Änderung der Konfiguration mittels
1 |
/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:
1 2 |
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
1 |
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
1 |
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:
1 2 3 4 5 6 7 |
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:
1 |
thread /etc/motion/cam1.conf |
Eine Konfigurationsdatei könnte beispielhaft (z.B. /etc/motion/cam1.conf) wie folgt aussehen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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
1 |
videodevice /dev/video0 |
durch die folgende Einbindung ersetzt:
1 |
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:
1 |
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.
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.
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
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