Raspberry Pi als Webcam Server
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
- Raspberry Pi (minimal Model B mit USB)
- Stromadapter für den Pi
- SD Karte (min 2GB)
- Debian Installation auf dem Raspberry
- Internetverbindung am Pi
- W-Lan Adapter oder Raspbberry Pi mit WLAN Modul
- USB Webcam
Mein Setup
- Raspberry Pi Model B
- Blackberry Curve 8900 Netzteil
- Transcend Extreme-Speed SDHC 16GB Class 10
- Creative VF0470 Live! Cam Notebook Webcam
- Raspbian Wheeze
- 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:
- http://www.lavrsen.dk/foswiki/bin/view/Motion/WeatherData
- http://www.mandrivauser.de/forum/viewtopic.php?f=71&t=28996
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.