Inhaltsverzeichnis
2012-04-10 // Weather.chrisge.org – Die Software I/III: Motion
Nachdem ich das Projekt Weather.chrisge.org bereits in Grundzügen erläutert habe und die verwendete Hardware ebenfalls vorgestellt habe, werde ich in diesem Beitrag auf die Softwarekonfiguration eingehen. Da der gesamte Entwicklungsprozess mehrere Monate in Anspruch nahm, werde ich nur auf die wichtigsten Dinge eingehen. Zu einem späteren Zeitpunkt werde ich gegebenenfalls eine Dokumentation im mein.homelinux.com Wiki erstellt. Falls Fragen auftauchen sollten: melden!
Dieser Beitrag ist Teil der Serie Weather.chrisge.org:
- Teil 3: Die Software
- I: Motion → Webcam → dieser Teil
- II: OWFS → 1-Wire
- III: Munin & Fazit → Graphen
Kompatibel zu dieser Anleitung sollten Debian-basierende Linux-Distributionen (z.B. Ubuntu) sein. Getestet wurde die Anleitung bis jetzt aber nur mit Debian Squeeze.
Webcam: Motion
Zur Überwachung der Webcam verwende ich Motion. Motion verfügt über zahlreiche Features, die die Software nicht nur für Überwachungskameras, sondern auch für Livecams interessant macht. Zum einen wäre da der Livestreamsupport, automatische Timelapses, regelmäßige Snapshots und die Möglichkeit Bewegungen aufzuzeichnen.
Motion kann in Debian ganz einfach installiert werden:
$ sudo apt-get install motion uvccapture libv4l-0
Dazu installieren wir zum Testen noch uvccapture
und das benötigte Video4Linux.
Webcam testen
Mit Hilfe von Video4Linux sollte es nun möglich sein, die Webcam unter Linux zu nutzen. Die Informationen zu diesem Schritt stammen aus dieser Anleitung. Zunächst schließt man die Webcam an den Rechner und beobachtet die Ausgabe von dmesg | tail
(auch im Syslog) - diese sollte etwa so aussehen:
[618864.131947] usb 1-1.2.2: new high speed USB device using orion-ehci and address 84 [618864.484692] usb 1-1.2.2: New USB device found, idVendor=046d, idProduct=0825 [618864.491961] usb 1-1.2.2: New USB device strings: Mfr=0, Product=0, SerialNumber=2 [618864.499615] usb 1-1.2.2: SerialNumber: 7FB273A0 [618864.509173] usb 1-1.2.2: configuration #1 chosen from 1 choice [618864.516449] uvcvideo: Found UVC 1.00 device <unnamed> (046d:0825) [618864.623982] input: UVC Camera (046d:0825) as /devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2.2/1-1.2.2:1.0/input/input3 [618864.641837] usbcore: registered new interface driver uvcvideo [618864.652312] USB Video Class driver (v0.1.0)
Dann testet man die Webcam mit Hilfe von uvccapture
:
$ uvccapture
das sollte ein Bild mit dem Namen snap.jpg mit Hilfe der Webcam aufnehmen.
Konfiguration
Die Konfiguration von Motion erfolgt (wenn nur eine Webcam verwendet wird) über die sehr gut kommentierte Konfigurationsdatei in /etc/motion/motion.conf
. Das Finden der richtigen Konfiguration ist ein Prozess, der über mehrere Tage in der Praxis erprobt werden muss. Für jeden Fall bietet sich eine andere Konfiguration an. Deshalb werde ich hier nur auf die wichtigsten Punkte eingehen. Eine umfangreiche Dokumentation aller Parameter findet sich im Motion Wiki:
Außerdem ist im LinuxUser ein guter Artikel zu Motion erschienen:
Als Daemon starten
Um Motion automatisch als Daemon starten zu lassen ist es nötig in der Datei /etc/default/motion
die Option start_motion_daemon
auf yes
zu setzen:
start_motion_daemon=yes
Die weitere Konfiguration erfolgt in der /etc/motion/motion.conf
. Auch hier muss die Option daemon
auf on
gesetzt werden:
daemon on
Basiseinstellungen
Anschließend können die Grundeinstellungen der Webcam vorgenommen werden. Hier bietet es sich vor allem an die Auflösung zu verändern - z.B. 960 x 720:
# Image width (pixels). Valid range: Camera dependent, default: 352 width 960 # Image height (pixels). Valid range: Camera dependent, default: 288 height 720
Diese Einstellung bedarf einiges an Erprobung. So muss die Hardware über genügend Leistung verfügen eine Auflösung wie 1280 x 960 tatsächlich zu packen. Bei der Dockstar war dies nicht der Fall. Außerdem muss die Kamera die Auflösung natürlich unterstützen.
Eine weitere Möglichkeit mit schwacher Hardware aufzukommen ist, die Option minimum_frame_time
zu erhöhen. Bei 5 wird alle 5 Sekunden ein Bild der Kamera aufgenommen:
minimum_frame_time 5
Bewegungen erkennen
Um das Erkennen von Bewegungen zu konfigurieren, existiert der Bereich Motion Detection Settings
. Hier kann zum Einen der threshold
(die Empfindlichkeit) erhöht werden. Mehr Informationen hierzu finden sich im Artikel des LinuxUsers.
Ich habe zusätzlich die Einstellungen für pre
- und post_capture
modfiziert - das hat schönere „Motions“ zur Folge (Bilder von vor und nach der Erkennung der Bewegung):
# Specifies the number of pre-captured (buffered) pictures from before motion # was detected that will be output at motion detection. # Recommended range: 0 to 5 (default: 0) # Do not use large values! Large values will cause Motion to skip video frames and # cause unsmooth mpegs. To smooth mpegs use larger values of post_capture instead. pre_capture 2 # Number of frames to capture after motion is no longer detected (default: 0) post_capture 2
Ausgabedateien – Bilder & Co.
Wenn die Option output_normal
aktiviert wird, werden von den Motions zusätzlich noch Bilder gemacht:
output_normal on
…hier kann noch die Qualität dieser Bilder (und weiterer) verändert werden:
quality 100
Wenn die Bilder später weiter verwendet werden sollen, ist eine hohe Qualität zu empfehlen. Dies fordert aber wesentlich mehr Speicherplatz!
In dem Abschnitt FFMPEG related options
finden im Bezug auf die zu produzierenden Daten die wichtigsten Einstellungen statt. ffmpeg_cap_new
hat zur Folge, dass Motions aufgenommen werden:
ffmpeg_cap_new on
Mit ffmpeg_timelapse
kann der Intervall der einzelnen Bilder für die Timelapse definiert werden:
ffmpeg_timelapse 30
Ich empfehle die Option ffmpeg_variable_bitrate
auf 2 zu setzen, ansonsten haben die Timelapses später keine gute Qualität:
ffmpeg_variable_bitrate 2
Mit Hilfe der Option snapshot_interval
können regelmäßig Snapshots angefertigt werden:
snapshot_interval 120
Dateipfade
Die Option target_dir
gibt an, wo die Dateien landen:
target_dir /media/webcam/motion
Die weiteren Filenames sehen bei mir so aus:
snapshot_filename ../snapshots/%Y%m%d/%H%M%S-%v-snapshot jpeg_filename %Y%m%d/%v/%H%M%S-%v-%q movie_filename ../films/%Y%m%d%H%M%S-%v timelapse_filename ../timelapse/%Y%m%d-timelapse
Das hat zu Folge, dass /media/webcam bei mir so aussieht:
$ ls /media/webcam/ films motion snapshots timelapse
So können die Dateien wesentlich besser verwaltet werden, als in den Standarteinstellungen.
Livecam
Anschließend kann der Live Webcam Server
aktiviert werden:
webcam_port 8080
Damit andere Rechner auch die Livecam verwenden können, muss webcam_localhost
deaktiviert werden:
webcam_localhost off
Benachrichtigungen
Wenn man informiert werden will, wenn die Kamera „verloren geht“ kann man zusätzlich die Option on_camera_lost
nutzen:
on_camera_lost echo "Kamera %t am %d.%m.%Y um %T verloren." | mail -s "[Motion] Kamera verloren" root@localhost
Hier wird beispielsweise eine E-Mail an root@localhost
gesendet.
Erster Start
Nachdem die wichtigsten Parameter gesetzt wurden, kann man nun Motion das erste Mal starten:
sudo /etc/init.d/motion start
Gleichzeitig sollte man einen Blick in das Syslog werfen:
$ tail -f /var/log/syslog
Dort sollten Meldungen in folgender Art auftauchen:
Apr 9 15:04:06 host motion: [0] Processing thread 0 - config file /etc/motion/motion.conf Apr 9 15:04:06 host motion: [0] Motion 3.2.12 Started Apr 9 15:04:06 host motion: [0] Created process id file /var/run/motion/motion.pid. Process ID is 8379 Apr 9 15:04:06 host motion: [0] Motion running as daemon process Apr 9 15:04:06 host motion: [0] ffmpeg LIBAVCODEC_BUILD 3412993 LIBAVFORMAT_BUILD 3415808 Apr 9 15:04:06 host motion: [0] Thread 1 is from /etc/motion/motion.conf Apr 9 15:04:06 host motion: [0] motion-httpd/3.2.12 running, accepting connections Apr 9 15:04:06 host motion: [0] motion-httpd: waiting for data on port TCP 8081 Apr 9 15:04:06 host motion: [1] Thread 1 started Apr 9 15:04:06 host motion: [1] cap.driver: "uvcvideo" Apr 9 15:04:06 host motion: [1] cap.card: "UVC Camera (046d:0825)" Apr 9 15:04:06 host motion: [1] cap.bus_info: "usb-orion-ehci.0-1.2.2" Apr 9 15:04:06 host motion: [1] cap.capabilities=0x04000001 Apr 9 15:04:06 host motion: [1] - VIDEO_CAPTURE Apr 9 15:04:06 host motion: [1] - STREAMING Apr 9 15:04:06 host motion: [1] Config palette index 8 (YU12) doesn't work. Apr 9 15:04:06 host motion: [1] Supported palettes: Apr 9 15:04:06 host motion: [1] 0: YUYV (YUV 4:2:2 (YUYV)) Apr 9 15:04:06 host motion: [1] 1: MJPG (MJPEG) Apr 9 15:04:06 host motion: [1] Selected palette YUYV Apr 9 15:04:06 host motion: [1] Test palette YUYV (960x720) Apr 9 15:04:06 host motion: [1] Using palette YUYV (960x720) bytesperlines 1920 sizeimage 1382400 colorspace 00000008 Apr 9 15:04:06 host motion: [1] found control 0x00980900, "Brightness", range 0,255 Apr 9 15:04:06 host motion: [1] #011"Brightness", default 128, current 128 Apr 9 15:04:06 host motion: [1] found control 0x00980901, "Contrast", range 0,255 Apr 9 15:04:06 host motion: [1] #011"Contrast", default 32, current 32 Apr 9 15:04:06 host motion: [1] found control 0x00980902, "Saturation", range 0,255 Apr 9 15:04:06 host motion: [1] #011"Saturation", default 32, current 32 Apr 9 15:04:06 host motion: [1] found control 0x00980913, "Gain", range 0,255 Apr 9 15:04:06 host motion: [1] #011"Gain", default 0, current 0 Apr 9 15:04:06 host motion: [1] mmap information: Apr 9 15:04:06 host motion: [1] frames=4 Apr 9 15:04:06 host motion: [1] 0 length=1382400 Apr 9 15:04:06 host motion: [1] 1 length=1382400 Apr 9 15:04:06 host motion: [1] 2 length=1382400 Apr 9 15:04:06 host motion: [1] 3 length=1382400 Apr 9 15:04:09 host motion: [1] Resizing pre_capture buffer to 1 items Apr 9 15:04:10 host motion: [1] Started stream webcam server in port 8080 Apr 9 15:04:10 host motion: [1] Resizing pre_capture buffer to 3 items
Ist das nicht der Fall hilft folgender Befehl:
$ LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so
…und ein anschließender start (oder restart
, wenn motion noch läuft):
$ sudo /etc/init.d/motion start
Nun sollte Motion laufen und die ersten Aufnahmen produzieren.
Optimierung
Wenn die Livcam statt über Port 8080 über Port 80 ansprechbar sein soll, empfiehlt sich eine Portweiterleitung. Grund: Port 80 kann nur mit root-Rechten verwendet werden. Es gibt zwar diverse Tools, die Port 80 für bestimmte Programme verfügbar machen. Das hat in meinen Versuchen mit motion allerdings nicht funktioniert (motion kann dann nicht mehr auf die Webcam zurückgreifen). Eine Portweiterleitung von 80 auf 8080 richtet man so ein (iptables benötigt):
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
Da dies bei jedem Neustart wieder erforderlich ist, trägt man in der /etc/rc.local
vor das exit 0
folgendes ein:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
Besonders die Verwendung eines Maskfiles, wie hier erklärt kann helfen Störquellen wie Bäume auszuschalten. Zusätzlich kann man am threshold
und area_detect
sowie an despeckle
rumschrauben, bis die Einstellungen optimal sind. Hier empfiehlt sich ein Blick in die Dokumentation von Motion.
[…] Motion […]