Raspberry Pi als Webcam Server

Aus Laub-Home Wiki

Hier findet ihr eine kleine Anleitung wie man den Raspberry Pi in einen Webcam Server mit Motion Capturing verwandelt. Im Prinzip reicht es wenn ihr noch eine alte USB Webcam rumliegen habt. Was die SD Card angeht, würde hier sicherlich auch eine alte 2GB SD Card reichen, jenachdem wieviel Motion Capture Output man speichern will. In meinem Fall ist das Motion Capturing eher ein Abfallprodukt. Das Ziel für mich ist es eine eigene Webcam ins Netz zustellen, die am Ende eventuell noch die aktuelle Temperatur anzeigt und dann am Ende im LookOut eingebunden wird. Zusätzlich zum Lan Anschluss soll der Webcam Server natürlich via W-Lan ins Netzwerk eingebunden werden, denn wer hat schon im Freien einen Lan Anschluss.

Webcam Server mittels fswebcam

Da mir der Motion Server zu viel Performance gekostet hat, CPU Last wie auch Bandbreite für den Live Stream, habe ich nach einer Lösung gesucht ein Bild aufzunehmen und dieses einfach auf meinen Webserver im Internet zu kopieren. Ich habe dafür einfach das kleine Tool fswebcam aus dem Debian Repository genommen und ein kleines Skript drumherum gebastelt welches auch hier den Temperatur Sensor und das Yahoo Wetter im Webcam Snapshot einbindet.
Das Skript samt Installationsanleitung findet sich hier:

Voraussetzungen

  1. Raspberry Pi (minimal Model B mit USB)
  2. Stromadapter für den Pi
  3. SD Karte (min 2GB)
  4. Debian Installation auf dem Raspberry
  5. Internetverbindung am Pi
  6. W-Lan Adapter oder Raspbberry Pi mit WLAN Modul
  7. USB Webcam

Mein Setup

  1. Raspberry Pi Model B
  2. Blackberry Curve 8900 Netzteil
  3. Transcend Extreme-Speed SDHC 16GB Class 10
  4. Creative VF0470 Live! Cam Notebook Webcam
  5. Raspbian Wheeze
  6. W-Lan Stick Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter

Installation

Als Vorbereitung sollte ein mit Raspbian Wheeze installierter Raspberry Pi vorliegen, der natürlich auch mit allen Updates gefüttert wurde. Eine Anleitung hierfür findet ihr hier. Ist der Pi soweit vorbereitet kann man die USB Webcam anschließen und mittels dmesg prüfen ob Sie erkannt wurde und auch ein Kernel Modul dafür bereitsteht:

dmesg
[    3.198513] usb 1-1.2: new full-speed USB device number 4 using dwc_otg
[    3.310515] usb 1-1.2: New USB device found, idVendor=041e, idProduct=4068
[    3.328244] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    3.338090] usb 1-1.2: Product: VF0470 Live! Cam Notebook
[    3.362554] usb 1-1.2: Manufacturer: Creative Labs
[    3.818599] udevd[137]: starting version 175
[    5.066523] Linux video capture interface: v2.00
[    5.271853] gspca_main: v2.14.0 registered
[    5.363650] gspca_main: ov519-2.14.0 probing 041e:4068
[    8.895776] input: ov519 as /devices/platform/bcm2708_usb/usb1/1-1/1-1.2/input/input0
[    8.922257] usbcore: registered new interface driver ov519
[    9.200515] usbcore: registered new interface driver snd-usb-audio

Um die Webcam am einfachsten kurz zu testen, kann man das Programm fswebcam installieren und ein kurzes Foto aufnehmen und schauen ob es gelungen ist:

aptitude install fswebcam
fswebcam -r 640x480 -d /dev/video0 -v /tmp/test.jpg
gpicview /tmp/test.jpg

Falls kein X-Forward eingerichtet ist, kann das erstellte Foto auch via SCP auf einen PC Übertragen werden auf dem ein Bildbetrachter ist. Oder aber man hat den Pi eh an einem Monitor, dann könnte man auch einfach die X Umgebung hochfahren und das Bild dort anschauen.

startx

Nun kann man die motion Software installieren und konfigurieren:

aptitude install motion

/etc/default/motion

# set to 'yes' to enable the motion daemon
start_motion_daemon=yes
mkdir /srv/motion
chown motion.motion /srv/motion

Nun nach belieben die motion.conf anpassen, bei mir sind folgende Einstellungen gemacht worden: /etc/motion/motion.conf

daemon on
v4l2_palette 0
width 640
height 480
framerate 5
quality 100
ffmpeg_cap_new off
text_right %Y-%m-%d\n%H:%M
target_dir /srv/motion
webcam_quality 100
webcam_maxrate 15
webcam_localhost off

Nach den Anpassungen kann der Dienst neu gestartet werden:

/etc/init.d/motion restart

Das Ergebnis ist dann unter folgender URL verfügbar (geht nicht im Internet Explorer)

  • http://IPofYourPi:8081

Motion und Internet Explorer

Die meisten Browser unterstützen mittlerweile das Motion JPEG Streaming. Leider einer der meist verwendeten Browser nicht, der Microsoft Internet Explorer. Mehr Informationen zum Motion JPEG Stream findet man hier. Will man eine Unterstützung für den Internet Explorer bereitstellen kann man dies durch das zum Beispiel durch das Java Applet Cambozola machen.

Wettervorschau im Webcam Bild

Powered by Yahoo Weather:

Idee und Anleitungen von:

Will man in seiner Webcam noch eine Wettervorschau haben, kann man dies mit Hilfe eines Python Skriptes, dem Motion HTTP Control und dem Online Wetter von Yahoo machen.

Als erstes holen wir uns das weather.py aus dem Git Repository:

cd /srv
git clone git://github.com/tupton/python-yahoo-weather.git
chmod +x python-yahoo-weather/weather.py

Den Code für euren Ort findet ihr über http://de.weather.yahoo.com. Hier einfach euren Ort oder PLZ eingeben und in den Suchergebnissen die richtige Location auswählen. Nun unten auf "10 Tages Vorschau" klicken und oben in die Adressleiste eures Browsers schauen (z.B. http://de.weather.com/weather/local/GMXX2088..._pla=10day)
Nun kann ein erster Test Erfolgen:

cd /srv/python-yahoo-weather/
./weather.py -mlvf2 GMXX1081 --output='weather.txt' && cat weather.txt
Location:
Heddesheim 

Current conditions:
13C and Mostly Cloudy

Forecast:
  27 Sep 2012
    High: 18C
    Low: 9C
    Conditions: Showers Late
  28 Sep 2012
    High: 19C
    Low: 6C
    Conditions: Partly Cloudy

Nun brauchen wir noch ein Skript, das uns das Wetter im Motion Webcam Bild platziert:
/srv/python-yahoo-weather/weather2motion.sh

#!/bin/bash
#########################################################################
#Name: weather2motion.sh
#Subscription: This script fetches the weather from yahoo and send teh forecast to motion
#by A. Laub
#andreas[-at-]laub-home.de
#
#License:
#This program is free software: you can redistribute it and/or modify it
#under the terms of the GNU General Public License as published by the
#Free Software Foundation, either version 3 of the License, or (at your option)
#any later version.
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
#or FITNESS FOR A PARTICULAR PURPOSE.
#########################################################################
#Set the language
export LANG="en_US.UTF-8"
#Load the Pathes
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 
#set the variables:
LOCATION=GMXX1081
WEATHER=/srv/python-yahoo-weather/weather.txt
WEATHERBIN=/srv/python-yahoo-weather/weather.py

#start the things
$WEATHERBIN -mlvf2 GMXX1081 -o $WEATHER

LOCATION1=$(sed -n '1p' $WEATHER)
LOCATION2=$(sed -n '2p' $WEATHER)
CONDITIONS1=$(sed -n '4p' $WEATHER)
CONDITIONS2=$(sed -n '5p' $WEATHER)
FORECAST1=$(sed -n '7p' $WEATHER)
FORECAST2=$(sed -n '8p' $WEATHER)
FORECAST3=$(sed -n '9p' $WEATHER)
FORECAST4=$(sed -n '10p' $WEATHER)
FORECAST5=$(sed -n '11p' $WEATHER)
FORECAST6=$(sed -n '12p' $WEATHER)
FORECAST7=$(sed -n '13p' $WEATHER)
FORECAST8=$(sed -n '14p' $WEATHER)
FORECAST9=$(sed -n '15p' $WEATHER)

WEATHERTEXT="$LOCATION2- $CONDITIONS2\n\n$FORECAST1\n$FORECAST2\n$FORECAST3\n$FORECAST4\n$FORECAST5\n$FORECAST6\n$FORECAST7\n$FORECAST8\n$FORECAST9"
# Set on Camera Image0
wget -q --delete-after "http://localhost:8080/0/config/set?text_left=$WEATHERTEXT"
chmod +x /srv/python-yahoo-weather/weather2motion.sh

damit der Text Platziert werden kann muss in der motion.conf noch der HTTP Control aktiviert werden. Es reicht hierbei ihn nur auf Localhost laufen zu lassen:
/etc/motion/motion.conf

############################################################
# HTTP Based Control
############################################################

# TCP/IP port for the http server to listen on (default: 0 = disabled)
control_port 8080

# Restrict control connections to localhost only (default: on)
control_localhost on

# Output for http server, select off to choose raw text plain (default: on)
control_html_output on

# Authentication for the http based control. Syntax username:password
# Default: not defined (Disabled)
; control_authentication username:password

Nun sollte der Motion Server Dienst neu gestartet werden

/etc/init.d/motion restart

Nun kann ein erster Test erfolgen

/srv/python-yahoo-weather/weather2motion.sh

Nun sollte beim Aufruf des Motion Live Streams das Wetter auf der Linken Seite stehen! Damit das Wetter immer aktuell ist lassen wir das Skript nun jede Stunde laufen:

ln -s /srv/python-yahoo-weather/weather2motion.sh /etc/cron.hourly/weather2motion

Temperatur Sensor Anzeige im Webcam Bild

Als Vorbereitung sollte ein funktionsfähiger Temperatur Sensor am Raspberry Pi angeschlossen sein, die benötigten Module geladen und der Sensor auslesbar sein. Wer wissen will wie das geht, kein Problem, das ganze ist hier dokumentiert:

Also, eine Ausgabe des folgenden Befehles sollte den Sensor einwandfrei auslesen können:

echo "scale=3; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-000004118a7f/w1_slave | awk -F't=' '{print $2}')/1000" | bc -l

Sollte ein Fehler kommen, dass bc nicht gefunden werden kann, dann installiert es einfach nach. So, nun wollen wir die Ausgabe des oben stehenden Befehls ins Webcam Bild einblenden. Das machen wir mit dem folgenden kleinen Skript. Voraussetzung hierfür ist, dass der HTTP Control Server wie oben beschrieben läuft.
/usr/local/sbin/sensor2motion.sh

#!/bin/bash
#########################################################################
#Name: sensor2motion.sh
#Subscription: This script fetches the tempreature from a sensor and send the forecast to motion
#by A. Laub
#andreas[-at-]laub-home.de
#
#License:
#This program is free software: you can redistribute it and/or modify it
#under the terms of the GNU General Public License as published by the
#Free Software Foundation, either version 3 of the License, or (at your option)
#any later version.
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
#or FITNESS FOR A PARTICULAR PURPOSE.
#########################################################################
#Set the language
export LANG="en_US.UTF-8"
#Load the Pathes
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 
#set the variables:
TEMP=$(echo "scale=2; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-000004118a7f/w1_slave | awk -F't=' '{print $2}')/1000" | bc -l)


#start the things
TEXT="%Y-%m-%d\n%H:%M\nTemperature: $TEMP C"
# Set on Camera Image0
wget -q --delete-after "http://localhost:8080/0/config/set?text_right=$TEXT"
chmod +x /usr/local/sbin/sensor2motion.sh

nun das ganze am besten alle Minute laufen lassen:

crontab -e
# start sensor2motion.sh
* * * * * /usr/local/sbin/sensor2motion.sh

Fertig :-)

Konfiguration W-Lan

Um W-Lan am Pi zur Verfügung zu stellen braucht man einen USB W-Lan Stick. Ich habe folgende Sticks erfolgreich testen können:

  • Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter

Ob der W-Lan Adapter beim Einstecken richtig erkannt wird sagt uns wieder dmesq:

dmesg
[ 5746.557850] usb 1-1.3: new high-speed USB device number 5 using dwc_otg
[ 5746.676023] usb 1-1.3: New USB device found, idVendor=148f, idProduct=3070
[ 5746.676056] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 5746.676108] usb 1-1.3: Product: 802.11 n WLAN
[ 5746.676123] usb 1-1.3: Manufacturer: Ralink
[ 5746.676136] usb 1-1.3: SerialNumber: 1.0
[ 5746.835297] cfg80211: Calling CRDA to update world regulatory domain
[ 5747.137881] usb 1-1.3: reset high-speed USB device number 5 using dwc_otg
[ 5747.352997] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[ 5747.355984] Registered led device: rt2800usb-phy0::radio
[ 5747.356517] Registered led device: rt2800usb-phy0::assoc
[ 5747.357103] Registered led device: rt2800usb-phy0::quality
[ 5747.369758] usbcore: registered new interface driver rt2800usb

oder lsusb

lsusb -v
Bus 001 Device 005: ID 148f:3070 Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x148f Ralink Technology, Corp.
  idProduct          0x3070 RT2870/RT3070 Wireless Adapter
  bcdDevice            1.01
  iManufacturer           1 Ralink
  iProduct                2 802.11 n WLAN
  iSerial                 3 1.0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           67
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              450mA
    Interface Descriptor:
.......

Wenn dies alles geprüft ist, kann es mit der Konfiguration losgehen.
Wir prüfen nun wie das W-Lan Interface heißt:

ifconfig
wlan0     Link encap:Ethernet  HWaddr 00:1f:1f:be:0e:39
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Hier wird das Interface als wlan0 erkannt, was auch auf fast alle W-Lan Karten zutreffen sollte.
Nun brauchen wir noch den WPA Key. Man kann den Key zwar auch im Klartext in der Konfigurationsdatei hinterlegen, dass wäre allerdings zu unsicher, deshalb holen wir uns den verschlüsselten Key mit wpa_passphrase:

wpa_passphrase mynetworkSSID
# reading passphrase from stdin
mypassword
network={
ssid="mynetworkSSID"
#psk="mypassword"
psk=69e49214ef4e7e23d0ece077c2(...verkürzt)
}

Die Konfiguration erfolgt nun in der interfaces Datei, die bei mir folgenden Inhalt hat:
/etc/network/interfaces

auto lo

iface lo inet loopback
iface eth0 inet dhcp

dieser Datei fügen wir nun das WLan Interface hinzu, welches sich via DHCP eine IP Adresse zieht:

auto wlan0
iface wlan0 inet dhcp
    wpa-ssid mynetworkSSID
    wpa-psk 122e13db6316dacaff9e9a32277fa9de6ca(...verkürzt)

will man eine Feste IP vergeben sollte man folgendes eintragen:

auto wlan0
iface wlan0 inet static
        address 192.168.0.100
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        wpa-ssid mynetworkSSID
        wpa-psk 122e13db6316dacaff9e9a32277fa9de6ca(...verkürzt)

Nun geben wir nur dem root Benutzer Rechte auf die Netzwerkkonfigurationsdatei

chmod 0600 /etc/network/interfaces

Bereitstellung der Webcam im Internet

Es gibt mehrere Wege die Webcam nun im Netz bereitzustellen. Ich verwende meinen bereits bestehenden Apache2 Webserver. Das Einfachste ist natürlich einfach eine Firewall Freischaltung zu machen.

Via Firewall Freischaltung

Mann kann den Pi natürlich auch direkt übers Internet verfügbar machen, hierfür empfiehlt es sich den HTTP Port von 8081 auf 80 zu ändern. Nun kann man einen Port Forward auf den Port 80 einrichten und schon ist die Cam von außen verfügbar. Ich würde diesen Weg allerdings nicht unbedingt machen.

Via Apache2 mod_proxy

Hier brauche ich zuerst das proxy_http Modul:

a2enmod proxy_http

nun erweitere ich meine bestehende vhost Konfiguration:

        ProxyRequests Off
        <Proxy *>
                AddDefaultCharset off
                Order deny,allow
                Allow from all
        </Proxy>
        ProxyVia On
        ProxyPass /webcam http://192.168.0.166:8081

dann noch einen Neustart des Webservers:

/etc/init.d/apache2 restart

und schon sollte die Cam von außen erreichbar sein:

  • http://yourwebserveradress/webcam

Via Cambozolla Installation

Als erstes laden wir das aktuelle Paket herunter und entpacken es.

cd /usr/src
wget http://www.charliemouse.com/code/cambozola/cambozola-latest.tar.gz
tar -xzvf cambozola-latest.tar.gz

Wir benötigen nur das cambozola.jar. Diese kopieren wir einfach auf den Webserver:

cp cambozola-0.92/dist/cambozola.jar /srv/httpd/vhosts/yourdomain/htdocs/cambozola

Dann erstellen wir noch eine HTML Datei, die das Applet lädt:
cambozola/index.html

<html>
<head>
    <title>Webcam</title>
</head>
<body text="#000000" bgcolor="#EEF0E0" link="#0000EE" vlink="#551A8B" alink="#FF0000">
    <center>
        <applet code=com.charliemouse.cambozola.Viewer
            archive=cambozola.jar width=640 height=480>
            <param name=url value=http://192.168.0.44:8081>
            <param name="accessories" value="ZoomIn,ZoomOut"/>
        </applet>
    </center>
</body>
</html>

Nun sollte jeder Browser der auch Java unterstützt beim Aufruf der combozola/index.html den Webcam Live Stream anzeigen.

Apache Freigabe via Cambozola oder Mod_Proxy

Will man, dass automatisch für den Internet Explorer Cambozola verwendet wird und für alle anderen Browser der direkte Zugriff mittels mod_proxy genutzt wird, muss der Apache wie folgt eingerichtet werden. Voraussetzung ist natürlich die oben beschriebene Cambozola Installation.

        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT} .*MSIE.*
        RewriteRule   ^/$ /cambozola/index.html  [R=permanent]
        RewriteRule   ^/$ /webcam/  [R=permanent]

        ProxyRequests Off
        <Proxy *>
                AddDefaultCharset off
                Order deny,allow
                Allow from all
        </Proxy>

        ProxyVia On
        ProxyPass /webcam http://192.168.50.187:8081

In Lookout einbinden

Der Lookout Server braucht lediglich Zugriff auf den Webcam Live Stream (Standardmäßig TCP Port 8081) oder auf die Apache Mod_Proxy Konfiguration. Auf jeden Fall auf eines von beidem was von extern erreichbar ist. Im Admin Interface kann dann einfach die URL verwendet werden und alles funktioniert. Außer natürlich im Internet Explorer da dieser kein Motion JPEG nutzen kann. Deshalb zeigt Lookout im IE einfach nur ein rotes X an.

Quellen