Springe zum Inhalt

Raspberry Pi als Webcam bzw. Motion Tracker

Mit einem Raspberry Pi, einer Webcam oder dem Raspberry-Pi-Kameramodul ist es relativ einfach, eine Überwachungskamera zu realisieren. Mit der Software motion wird anschließend aufgezeichnet, wenn sich im Bild etwas bewegt. In der folgenden Anleitung möchte ich Schritt für Schritt beschreiben, wie das Ganze in Betrieb genommen werden kann.

Kamera

USB-Webcam

Evtl. kann eine bereits vorhandene Webcam verwendet werden. Ist die Webcam mit Raspbian, der für Raspberry Pi angepassten Version von Debian Wheezy, kompatibel, sollte nach dem Anstecken der Kamera automatisch ein Device /dev/video* erstellt worden sein. Informationen über den Initalisierungsprozess der Kamera können mit folgendem Kommando angezeigt werden:

dmesg | tail

Raspberry Pi Kameramodul

Seit kurzem ist ein Treiber verfügbar, der das Rasperry Pi Kameramodul als /dev/video*-Gerät zur Verfügung stellt. Zuerst muss das entsprechende Repository eingebunden werden und anschließend die benötigte Software installiert werden.

Repositiory eintragen:

echo deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main | sudo tee /etc/apt/sources.list.d/uv4l.list

Signaturkey des Repositorys einbinden:

curl http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add -

Repositories neu laden und Kameramodul installieren:

sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam uv4l-raspicam-extras

uv4l enthält grundelegende Module, uv4l-raspicam den Treiber zum Ansprechen des Rasperry-Pi-Kameramoduls und uv4l-raspicam-extras ein Skript, welches beim Starten des Rasperry Pi automatisch den erforderlichen Treiber läd.

Anschließend wird der Treiber gestartet:

sudo service uv4l_raspicam start

Jetzt sollte unter /dev/video* ein entsprechendes Gerät erstellt worden sein.

Bewegungserkennung

Mit der Software motion ist ein Paket verfügbar, mit dem sich Videostreams auf Änderungen untersuchen lassen und anschließend automatisch aufgezeichnet werden können.

sudo apt-get install motion

Leider hat das Startskript von motion in der Version 3.2.12 noch einen Fehler: es wird beim Starten des Services nicht die Konfigurationsdatei /etc/motion/motion.conf verwendet. Ausserdem ist zum Einbinden des Raspberry-Pi-Kameramoduls eine weitere Anpassung notwendig.

Editieren des Startskripts von motion:

sudo editor /etc/init.d/motion

unter der Zeile DESC="motion detection daemon" wird folgende Zeile eingefügt:

CONFIG_FILE=/etc/motion/motion.conf

Die Zeile, in der Motion gestartet wird, wird folgendermaßen abgeändert, so dass das angegebene Config-File verwendet wird:

if start-stop-daemon --start --oknodo --exec $DAEMON -b --chuid motion -- -c $CONFIG_FILE ; then

Wird das Raspberry-Pi-Kameramodul verwendet, muss vor dem Starten von motion noch folgendes ins Startskript eingetragen werden:

export LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so

Das vollständige Startskript für motion kann hier heruntergeladen werden.

Anschließend stellt man in der Datei /etc/default/motion noch ein, dass motion nach jedem Reboot automatisch gestartet wird und startet den Service anschließend per Hand:

sudo editor /etc/default/motion
sudo service motion start

In der Default-Konfiguration werden jetzt bei Bewegungserkennung unter /tmp/motion/ Bilder und Videos abgelegt. Auf dem Raspberry Pi können über den Browser Vorschaubilder der Kamera angezeigt werden. Unter http://localhost:8081 sind Livebilder der Kamera zu sehen und unter http://localhost:8080 ist ein Steuerungsinterface von motion zugänglich.

Standardmäßig sind die Vorschaubilder und das Steuerungsinterface nur lokal auf dem Raspberry Pi abrufbar. Will man die Bilder auch auf einem anderen Rechner im Netzwerk betrachten, muss in der Datei /etc/motion/motion.conf der Eintrag webcam_localhost auf off gestellt und anschließend motion neu gestartet werden.

Fehlersuche

Zuerst sollte überprüft werden, ob sich nach dem Starten von motion im Syslog ungewöhnliche Einträge wiederfinden. Ein normaler Start von motion mit dem Rasperry-Pi-Kameramodul sieht wie folgt aus:

Feb 11 08:38:08 pi motion: [26134344] Processing thread 0 - config file /etc/motion/motion.conf
Feb 11 08:38:08 pi motion: [26134344] Motion 3.2.12 Started
Feb 11 08:38:08 pi motion: [26134344] ffmpeg LIBAVCODEC_BUILD 3482368 LIBAVFORMAT_BUILD 3478785
Feb 11 08:38:08 pi motion: [0] Thread 1 is from /etc/motion/motion.conf
Feb 11 08:38:08 pi motion: [1] Thread 1 started
Feb 11 08:38:08 pi motion: [0] motion-httpd/3.2.12 running, accepting connections
Feb 11 08:38:08 pi motion: [0] motion-httpd: waiting for data on port TCP 8080
Feb 11 08:38:08 pi motion: [1] cap.driver: "raspicam"
Feb 11 08:38:08 pi motion: [1] cap.card: "Camera Board OV5647"
Feb 11 08:38:08 pi motion: [1] cap.bus_info: "CSI"
Feb 11 08:38:08 pi motion: [1] cap.capabilities=0x05000001
Feb 11 08:38:08 pi motion: [1] - VIDEO_CAPTURE
Feb 11 08:38:08 pi motion: [1] - READWRITE
Feb 11 08:38:08 pi motion: [1] - STREAMING
Feb 11 08:38:08 pi motion: [1] Test palette YU12 (640x480)
Feb 11 08:38:08 pi motion: [1] Using palette YU12 (640x480) bytesperlines 960 sizeimage 460800 colorspace 00000000
Feb 11 08:38:08 pi motion: [1] found control 0x00980900, "brightness", range 0,100 
Feb 11 08:38:08 pi motion: [1] #011"brightness", default 50, current 50
Feb 11 08:38:08 pi motion: [1] found control 0x00980901, "contrast", range -100,100 
Feb 11 08:38:08 pi motion: [1] #011"contrast", default 0, current 0
Feb 11 08:38:08 pi motion: [1] found control 0x00980902, "saturation", range -100,100 
Feb 11 08:38:08 pi motion: [1] #011"saturation", default 0, current 0
Feb 11 08:38:08 pi motion: [1] found control 0x0098090e, "red balance", range 0,800 
Feb 11 08:38:08 pi motion: [1] #011"red balance", default 100, current 100
Feb 11 08:38:08 pi motion: [1] found control 0x0098090f, "blue balance", range 0,800 
Feb 11 08:38:08 pi motion: [1] #011"blue balance", default 100, current 100
Feb 11 08:38:08 pi motion: [1] found control 0x08000000, "shutter speed", range 0,65535 
Feb 11 08:38:08 pi motion: [1] #011"shutter speed", default 0, current 0
Feb 11 08:38:08 pi motion: [1] found control 0x08000001, "zoom factor", range 1,8 
Feb 11 08:38:08 pi motion: [1] #011"zoom factor", default 0, current 1
Feb 11 08:38:08 pi motion: [1] mmap information:
Feb 11 08:38:08 pi motion: [1] frames=4
Feb 11 08:38:08 pi motion: [1] 0 length=460800
Feb 11 08:38:08 pi motion: [1] 1 length=460800
Feb 11 08:38:08 pi motion: [1] 2 length=460800
Feb 11 08:38:08 pi motion: [1] 3 length=460800
Feb 11 08:38:08 pi motion: [1] Resizing pre_capture buffer to 1 items
Feb 11 08:38:09 pi motion: [1] Started stream webcam server in port 8081

Ebenfalls kontrolliert werden kann, ob motion auf den voreingestellten Ports lauscht:

sudo netstat -tlpn

In der angezeigten Liste sollte motion bei den Ports 8080 und 8081 auftauchen.

25 Gedanken zu „Raspberry Pi als Webcam bzw. Motion Tracker

  1. Pete

    Hi, ich habe deinen Blog gelesen und wollte endlich mein Problem lösen, dass Motion nach dem Reboot automatisch startet. Händisch klappt es wunderbar, also habe ich entsprechend deinen Vorgaben die Config-Files entsprechend angepaßt bzw. nachdem das nicht funktioniert hat, deines benutzt und die rest händisch angepaßt. Leider passiert nach dem Reboot nichts. Der SYSLOG zeigt nichts. Was komischerweise bei mir nie funktioniert hat ist: sudo service motion start ... hier habe ich von Anfang an die Meldung bekommen: motion: unrecognized service bekommen. Irgendwie scheinet das motion-file in der init.d nicht gelesen zu werden. Hast du ne Idee? Danke schon mal im Voraus ...

    1. shogun

      Ist denn /etc/init.d/motion bei Dir vorhanden? Statt "service motion start" kannst Du dann auch "/etc/init.d/motion start" ausführen. Hast Du evtl. motion selbst kompiliert? Oder kamen bei der Installation mit apt-get irgendwelche Fehlermeldungen? Evtl. hilft es, motion einmal mit "apt-get purge motion" zu deinstallieren und anschließend frisch zu installieren.

  2. Pete

    Hi, danke für die Info, werde mal weiter probieren, sorry für die späte Nachricht ... die Info für deinen Antwort war in den Spam Ordner gerutsch ..... melde mich ....

  3. Thomas

    Im Start-Script musste ich die Zeile
    "export LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so"
    um " $NAME" ergänzen.
    Danach startete Motion nach reboot und ich kann die Bilder im Browser sehen.
    Sobald allerdings eine Bewegung erkannt wird, bricht die Browser-Verbindung ab. Die LED der Kamera erlischt und auf den Befehl "sudo service motion stop" erhalte ich
    "[....] Stopping motion detection daemon: motionNo /usr/bin/motion found running; none killed.
    . ok "
    Es scheint, als ob der Dämon durch die Bewegung angehalten wird.

    Wenn ich aber nach "http://www.karesyk.de/raspicam-webcam-server/" motion mit dem Befehl "sudo LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so motion -c /etc/motion/motion.conf" starte, dann werden bei erkannter Bewegung Bilder in das angegebene Verzeichnis abgelegt, alles scheint normal zu laufen.

    Ich bin mir auch nicht sicher, ob ich obigen "export"-Befehl im Start-Script an die richtige Stelle gesetzt habe. Bei mir steht er unmittelbar nach der Zeile "log_daemon_msg "Starting $DESC" "$NAME" ".

    Hast Du eine Idee, warum Motion abbricht?

    1. known

      HI Thomas,
      hatte gerade das gleiche Problem, es lag an den fehlenden Zugriffsrechten auf das Verzeichnis, wo die Snapshots abgelegt werden.

      1. Dominik

        Wie genau hast du das Problem gelöst?

        Bei mir sollten die Bilder in /var/lib/motion gespeichert werden. Der Ordner User/group ist beides motion.

        Ich bekomme leider immer die Fehlermeldung im Browser Unable to open video device und das Bild bleibt Grau...

  4. Dominik

    Moin leider bleibt schon der Eintrag in das Repository erfolglos.

    echo deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main | sudo tee /etc/apt/sources.list.d/uv4l.list

    Scheint nicht mehr aktuell. Vielleicht hat sich da etwas geändert.

    Bei mir erscheint immer folgende Fehlermeldung:

    The request URL /listing/uv4l_repo/raspbian/ wheezy main was not found on this server

    (404) Not found...

    Vielleicht hast du mal zeit nachzuschauen.

      1. shogun

        Deine Repository-URLs sind die selben, wie im Artikel angegeben. Das Kommando im Artikel sollte die entsprechende URL automatisch in die Datei /etc/apt/sources.list.d/uv4l.list eintragen. Evtl. war die URL nur temporär nicht erreichbar oder irgend etwas ist bei Dir beim Eintragen der URL schief gelaufen.

        Trotzdem Danke für den Kommentar. Leute, die wissen, wo man hinlangt können natürlich Deiner Anleitung folgen ;)

  5. Jörg Jostkleigrewe

    Hallo zusammen,

    ich habe auf meinem Raspberry PI auch Motion installiert, funktioniert auch wunderbar.
    Jetzt habe ich aber noch eine weiterführende Frage:
    Ist es möglich mit einem Raspberry PI und Motion 2 USB-Kameras zu verwalten?

    Gruß Jörg

  6. muhackl

    Hallo zusammen,
    ich bin seit gestern begeisterter Nutzer von "motion". Ich nutze es auf einem Raspberry Pi B+ mit einem frisch installierten Raspbian Wheezy. Habe die Treiber für die original Raspberry Pi Kamera installiert. Danach motion installiert und konfiguriert. Habe den daemon mode auf yes bzw. on gestellt. Wenn ich motion NICHT im daemon mode starte, funktioniert alles einwandfrei. Vorschau über Webserver und Fotos machen bei Bewegung. Sobald ich motion als daemon starte, erhalte ich nur ein graues Bild beim der Webserver-Ansicht und den Schriftzug "unable to open video device". Was ist der Unterschied zwischen dem Start im daemon mode und im normalen Modus, der diese Fehlfunktion hervorrufen könnte?
    Besten Dank im Voraus!
    Grüße
    Muhackl

    1. shogun

      Verwendest Du das von Motion mitgelieferte Init-Script? Wenn ja, dann könnte, wie oben beschrieben, eine Anpassung zum Einlesen des Config-Files notwendig sein und das Einfügen von LD_PRELOAD (wie ebenfalls oben beschrieben) im Script. Was sagt denn das Syslog, wenn Du Motion als Daemon startest?

  7. muhackl

    Ja, ich verwendet das mitgelieferte Init-Sctipt. Ich teste nun die beiden oben beschriebenen Hinweise.
    Zudem finde ich das hier im Syslog. Der "Klassiker" ioctl (VIDIOCGCAP): Invalid argument scheint die Funktionalität zu verhindern. Das erscheint übrigens auch, wenn ich mich per VNC auf den Raspberry Pi schalte und motion normal starten will.

    Feb 4 10:05:30 raspberrypi motion: [3098440] Processing thread 0 - config file /etc/motion/motion.conf
    Feb 4 10:05:30 raspberrypi motion: [3098440] Motion 3.2.12 Started
    Feb 4 10:05:30 raspberrypi motion: [3098440] Created process id file /var/run/motion/motion.pid. Process ID is 7287
    Feb 4 10:05:30 raspberrypi motion: [3098440] Motion running as daemon process
    Feb 4 10:05:30 raspberrypi motion: [3098440] ffmpeg LIBAVCODEC_BUILD 3482368 LIBAVFORMAT_BUILD 3478785
    Feb 4 10:05:30 raspberrypi motion: [0] Thread 1 is from /etc/motion/motion.conf
    Feb 4 10:05:30 raspberrypi motion: [0] motion-httpd/3.2.12 running, accepting connections
    Feb 4 10:05:30 raspberrypi motion: [0] motion-httpd: waiting for data on port TCP 8082
    Feb 4 10:05:30 raspberrypi motion: [1] Thread 1 started
    Feb 4 10:05:31 raspberrypi motion: [1] cap.driver: "raspicam"
    Feb 4 10:05:31 raspberrypi motion: [1] cap.card: "Camera Board OV5647"
    Feb 4 10:05:31 raspberrypi motion: [1] cap.bus_info: "CSI"
    Feb 4 10:05:31 raspberrypi motion: [1] cap.capabilities=0x01000001
    Feb 4 10:05:31 raspberrypi motion: [1] - VIDEO_CAPTURE
    Feb 4 10:05:31 raspberrypi motion: [1] - READWRITE
    Feb 4 10:05:31 raspberrypi motion: [1] Test palette YU12 (640x480)
    Feb 4 10:05:31 raspberrypi motion: [1] Using palette YU12 (640x480) bytesperlines 960 sizeimage 460800 colorspace 00000000
    Feb 4 10:05:31 raspberrypi motion: [1] found control 0x00980900, "brightness", range 0,100
    Feb 4 10:05:31 raspberrypi motion: [1] #011"brightness", default 50, current 50
    Feb 4 10:05:31 raspberrypi motion: [1] found control 0x00980901, "contrast", range -100,100
    Feb 4 10:05:31 raspberrypi motion: [1] #011"contrast", default 0, current 0
    Feb 4 10:05:31 raspberrypi motion: [1] found control 0x00980902, "saturation", range -100,100
    Feb 4 10:05:31 raspberrypi motion: [1] #011"saturation", default 0, current 0
    Feb 4 10:05:31 raspberrypi motion: [1] found control 0x0098090e, "red balance", range 0,800
    Feb 4 10:05:31 raspberrypi motion: [1] #011"red balance", default 100, current 100
    Feb 4 10:05:31 raspberrypi motion: [1] found control 0x0098090f, "blue balance", range 0,800
    Feb 4 10:05:31 raspberrypi motion: [1] #011"blue balance", default 100, current 100
    Feb 4 10:05:31 raspberrypi motion: [1] found control 0x08000000, "shutter speed", range 0,65535
    Feb 4 10:05:31 raspberrypi motion: [1] #011"shutter speed", default 0, current 0
    Feb 4 10:05:31 raspberrypi motion: [1] found control 0x08000001, "zoom factor", range 1,8
    Feb 4 10:05:31 raspberrypi motion: [1] #011"zoom factor", default 0, current 1
    Feb 4 10:05:31 raspberrypi motion: [1] ioctl (VIDIOCGCAP): Invalid argument
    Feb 4 10:05:31 raspberrypi motion: [1] Could not fetch initial image from camera
    Feb 4 10:05:31 raspberrypi motion: [1] Motion continues using width and height from config file(s)
    Feb 4 10:05:31 raspberrypi motion: [1] Resizing pre_capture buffer to 1 items
    Feb 4 10:05:31 raspberrypi motion: [1] Started stream webcam server in port 8083

  8. muhackl

    Leider bringen die Maßnahmen nichts: Habe das hier CONFIG_FILE=/etc/motion/motion.conf in die motion, das hier if start-stop-daemon --start --oknodo --exec $DAEMON -b --chuid motion -- -c $CONFIG_FILE ; then und auch das hier export LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so in die motion.config eingetragen. Das Ergebnis beim Starten von motion als Daemon ist das gleiche. Es scheint, als ob motion die Änderungen kein bisschen interessiert. Auch das Syslog ist völlig identisch.

  9. muhackl

    Habe tatsächlich die Lösung gefunden. Nicht das oben beschriebene musste in die motion-Datei eingetragen werden, sondern nur folgendes (VOR dem gesamten Script bzw. vor dem Start von motion):
    LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libv4l/v4l1compat.so
    Dann klappt es auch mit dem daemon.

  10. muhackl

    So ganz war es das wohl doch noch nicht. Anscheinend muss man vorher doch einmal LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so starten. Wenn ich LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libv4l/v4l1compat.so nur in die motion-Startdatei eintrage, bringt das nichts. Wenn ich motion mit dem Aufruf "LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libv4l/v4l1compat.so motion" starte, funktioniert der Daemon tadellos.

    1. Stephan

      Hi, könntest du das ganze noch einmal etwas zusammenfassen?
      Stehe gerade vor exakt dem selben Problem, wäre super, wenn du nochmal geau sagen könntest, was du wo eingefügt hast!

      Danke
      Stephan

      1. muhackl

        Hi,
        bei mir bringt inzwischen das Einfügen der oben genannten Aufrufe in die motion-Startdatei einfüge, bringt das nichts. Evtl. finde ich nur nicht die richtige Position.
        Ich gebe momentan einfach folgendes manuell hintereinander ein, nachdem ich den Pi neu gestartet habe:
        sudo LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so motion

        killall motion

        sudo LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libv4l/v4l1compat.so motion

        Dann und nur so lässt sich bei mir motion als Daemon starten. Da es aktuell funktioniert, habe ich nicht weiter nachgeforscht.

  11. Klemens

    Hallo Shogun,
    in der Anleitung wird in das Verzeichnis "/etc/defaults" verwiesen.
    Bei mir muß es ohne "s" heißen: "/etc/default/motion"...

    1. Jens Tautenhahn

      Hallo Klemens, vielen Dank für den Hinweis! Ist schon korrigiert.

  12. Pingback: TTAG-Tag-Bericht – TechnikGarage

  13. Joachim

    Habe hier zwei Raspberry mit Motion laufen. Alles ok, die Bilder werden intern abgelegt. Hat schon mal jemand diese Bilder extern z. B. auf einer NAS abgelegt und kann Hinweise zur praktische Realisierung geben?

    1. Jens Tautenhahn

      Das ist eigentlich recht einfach. Entweder man mountet die NAS-Resource und stellt als Ausgabepfad in Motion gleich das NAS-Verzeichnis ein oder man benutzt ein Skript, welches von Motion nach dem Speichern eines Bildes automatisch aufgerufen wird (Einstellung on_picture_save). Dem dort angegebenen Skript kann der Dateiname mit %f übergeben werden. Im Endeffekt also sowas in der Art wie:

      on_picture_save /usr/local/bin/motion_nas_save.sh %f

      In dem Skript kann man dann das Bild nach Belieben irgendwohin kopieren.

  14. Joachim

    Danke Jens für die Tipps. Werde mich damit befassen. Wird sicher nicht auf Anhieb funktionieren weil ich im Aufruf auch die Zugangsdaten für den NAS Server mit unterbringen muss.

Kommentare sind geschlossen.