Zufällig bin ich beim Stöbern nach neuen Gimmicks auf Wireless Wifi IP Kameras gestossen und da ich immer nach weiteren Möglichkeiten der Heimautomatisierung suche, habe ich vier Stück davon bestellt.

Es handelt sich dabei um die abgebildete Kamera der Firma wanscam.

Die Kameras lassen sich wunderbar über WLAN in das bestehende Heimnetzwerk einbinden und bieten folgende Funktionen:

  • Live Video und Audio
  • Webinterface
  • Bewegungserkennung / Alarm
  • FTP- und Dateiupload

Also die besten Voraussetzungen, um in Verbindung mit dem Raspberry Pi herumzuspielen.

Projektbeschreibung

Ziel des Projekts ist es, die genannte(n) WLAN Kamera(s) in das Heimnetz einzubinden und folgende Überwachungsfunktionen zu realisieren:

  1. Upload eines Kamerabildes auf den Raspberry Pi per FTP in einem frei definierbaren Intervall.
  2. Aktivierung der Überwachungsfunktion der Kamera(s) und Realisierung einer Alarmfunktion per Email.

Einbindung der Kameras in das Heimnetz

Die Einbindung in das Heimnetz und die anschließende Konfiguration stellt sich relativ einfach dar.

  1. Kamera mit Strom versorgen und per LAN-Kabel an das Heimnetz anbinden.
  2. Die mitgelieferte SearchTool.exe starten, die Kamera sollte nach erfolgtem Booten kurze Zeit später dort erscheinen (sofern DHCP verwendet wird).
wanscam SearchTool
wanscam SearchTool

Im SearchTool sieht man jetzt, welche IP der Kamera zugewiesen wurde und über den Standardport 99 kann jetzt im Browser das Webinterface für die weitere Konfiguration gestartet werden.

Soll die Kamera per WLAN betrieben werden, dann muss im Webinterface das WLAN eingerichtet werden (siehe folgenden Abschnitt).

Nach Übernahme der WLAN-Einstellungen rebootet die Kamera, nach ca. 10 Sekunden sollte das LAN-Kabel dann abgezogen werden. Die Kamera sollte nach einem Neustart wieder im SearchTool sichtbar sein (mit anderer IP und MAC-Adresse – das ist wichtig, wenn man z.B. im Router nur bekannte Geräte im WLAN zulässt).

Ansteuerung der Kamera über das Webinterface

Das Webinterface ist simpel und selbsterklärend und wird pro Kamera über folgende URL aufgerufen:

http://IPDERKAMERA:PORTDERKAMERA/

Die IP-Adresse und den Port hat man über das search-Tool festgelegt.

Zwei Anmerkungen zum Webinterface:

  1. Die Funktionalität des Webinterface im Internet Explorer und im Firefox unterscheiden sich erheblich. Vermutlich sind die erweiterten Funktionen im Internet Explorer durch die Verwendung eines eigenen OCX Controls begründet.
  2. Über das Webinterface können Zugangsdaten für das Webinterface konfiguriert werden. Hinterlegt man allerdings Zugangsdaten, dann kann man sich mit diesen im Weninterface einloggen, komischerweise aber nicht mehr die Kamera steuern. Hier muss ich mal beim Support nachfragen.

WLAN-Einrichtung

Die Einrichtung der WLAN-Verbindung erfolgt recht einfach über folgenden Dialog:

wanscam WLAN-Konfiguration
wanscam WLAN-Konfiguration

Einfach das passende WLAN-Netz auswählen, die Zugangsdaten hinterlegen und fertig!

Die Kamera bootet anschließend. Aus meiner Erfahrung heraus sollte man das LAN-Kabel noch ca. 10 Sekunden nach Beginn des Reboots in der Kamera lassen, da offenbar noch einige Daten mit der Software ausgetauscht werden. Nach dem Reboot sollte sich die Kamera im WLAN-Netz befinden.

Einrichtung FTP-Upload auf den Raspberry Pi

Die von mir verwendete Distribution raspbian wheezy bringt von Hause aus keinen installierten FTP-Server mit. Aber das kann ganz einfach nachgeholt werden:

<div class="fvch-codeblock"><table class="fvch-code "><tr><td class="fvch-line-number" data-line-number="1"></td><td class="fvch-line-code"><pre>sudo apt<span class="general-operator">-</span>get install proftpd<br></pre></td></tr></table></div>
[/codesyntax]

Und die Installationsart "standalone" whlen.

Die Konfigurationsdatei ffnen:

[codesyntax lang="php" lines="no" container="none" blockstate="expanded" doclinks="0"]
<div class="fvch-codeblock"><table class="fvch-code "><tr><td class="fvch-line-number" data-line-number="1"></td><td class="fvch-line-code"><pre>sudo nano <span class="general-operator">/</span>etc<span class="general-operator">/</span>proftpd<span class="general-operator">/</span>proftpd<span class="general-operator">.</span>conf<br></pre></td></tr></table></div>
[/codesyntax]

und folgende Befehle am Ende der Datei einfgen:
[codesyntax lang="php"]
<div class="fvch-codeblock"><table class="fvch-code "><tr><td class="fvch-line-number" data-line-number="1"></td><td class="fvch-line-code"><pre>DefaultRoot <span class="general-operator">~</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="2"></td><td class="fvch-line-code"><pre>AuthOrder mod_auth_file<span class="general-operator">.</span>c mod_auth_unix<span class="general-operator">.</span>c<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="3"></td><td class="fvch-line-code"><pre>AuthUserFile <span class="general-operator">/</span>etc<span class="general-operator">/</span>proftpd<span class="general-operator">/</span>ftpd<span class="general-operator">.</span>passwd<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="4"></td><td class="fvch-line-code"><pre>AuthPAM off<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="5"></td><td class="fvch-line-code"><pre>RequireValidShell off<br></pre></td></tr></table></div>
[/codesyntax]

Anschlieend einen neuen, virtuellen FTP-Benutzer <em>wlancam</em> mit dem Standardverzeichnis <em>/var/www/temp/campics/</em> einrichten:

[codesyntax lang="php"]
<div class="fvch-codeblock"><table class="fvch-code "><tr><td class="fvch-line-number" data-line-number="1"></td><td class="fvch-line-code"><pre>cd <span class="general-operator">/</span>etc<span class="general-operator">/</span>proftpd<span class="general-operator">/</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="2"></td><td class="fvch-line-code"><pre>sudo ftpasswd <span class="general-operator">-</span><span class="general-operator">-</span>passwd <span class="general-operator">-</span><span class="general-operator">-</span>name wlancam <span class="general-operator">-</span><span class="general-operator">-</span>uid <span class="general-number">3</span><span class="general-number">3</span> <span class="general-operator">-</span><span class="general-operator">-</span>gid <span class="general-number">3</span><span class="general-number">3</span> <span class="general-operator">-</span><span class="general-operator">-</span>home <span class="general-operator">/</span>var<span class="general-operator">/</span>www<span class="general-operator">/</span>temp<span class="general-operator">/</span>campics<span class="general-operator">/</span> <span class="general-operator">-</span><span class="general-operator">-</span>shell <span class="general-operator">/</span>bin<span class="general-operator">/</span>false<br></pre></td></tr></table></div>
[/codesyntax]

&nbsp;

Anschlieend den FTP-Server neu starten:

[codesyntax lang="php"]
<div class="fvch-codeblock"><table class="fvch-code "><tr><td class="fvch-line-number" data-line-number="1"></td><td class="fvch-line-code"><pre>sudo <span class="general-operator">/</span>etc<span class="general-operator">/</span>init<span class="general-operator">.</span>d<span class="general-operator">/</span>proftpd restart<br></pre></td></tr></table></div>
[/codesyntax]

&nbsp;

Und gegebenenfalls noch die Rechte auf das Verzeichnis setzen:

[codesyntax lang="php"]
<div class="fvch-codeblock"><table class="fvch-code "><tr><td class="fvch-line-number" data-line-number="1"></td><td class="fvch-line-code"><pre>chmod g<span class="general-operator">+</span>s <span class="general-operator">/</span>var<span class="general-operator">/</span>www<span class="general-operator">/</span>temp<span class="general-operator">/</span>campics<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="2"></td><td class="fvch-line-code"><pre>chmod <span class="general-number">7</span><span class="general-number">7</span><span class="general-number">5</span> <span class="general-operator">/</span>var<span class="general-operator">/</span>www<span class="general-operator">/</span>temp<span class="general-operator">/</span>campics<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="3"></td><td class="fvch-line-code"><pre>chown <span class="general-operator">-</span>R www<span class="general-operator">-</span>data<span class="general-operator">:</span>www<span class="general-operator">-</span>data <span class="general-operator">/</span>var<span class="general-operator">/</span>www<span class="general-operator">/</span>temp<span class="general-operator">/</span>campics<br></pre></td></tr></table></div>
[/codesyntax]

&nbsp;

Anschlieend kann der FTP-Server im Webinterface der Kamera konfiguriert werden:

[caption id="attachment_287" align="aligncenter" width="300"]<a class="thumbnail" href="http://e-realm.de/wp-content/uploads/2013/09/wanscam_ftp-upload.jpg"><img class="size-medium wp-image-287" src="http://e-realm.de/wp-content/uploads/2013/09/wanscam_ftp-upload-300x95.jpg" alt="wanscam FTP-Konfiguration" width="300" height="95" /></a> wanscam FTP-Konfiguration[/caption]

In diesem Fall erfolgt ein Bildupload alle 10 Minuten.

<strong>Hinweis:</strong> Bei mir ist die Testfunktion immer fehlgeschlagen, obwohl die Bilder korrekt hochgeladen werden. Also nicht verwirren lassen ;-)
<h2>Anzeigen der Bilder in einem Webfrontend</h2>
Die berwachungsfunktion mit der Kamera ist Teil meines Projekts <a title="HomeControl" href="http://e-realm.de/raspberry-pi/projekte/homecontrol/">HomeControl</a> und wurde daher in das stetig wachsende Webfrontend integriert.

Da jeder einen eigenen Geschmack hat und die Bilder einbinden und darstellen kann wie er mag, habe ich nachfolgend nur die PHP-Funktionen aufgefhrt, die ich fr den Zugriff auf die Bilder in dem oben genannten Verzeichnis auf dem Pi verwende.
<h3>Anzeige des letzten Bildes einer Kamera</h3>
Das jeweils letzte Bild einer Kamera kann ber folgende PHP-Funktion referenziert werden:

[codesyntax lang="php"]
<div class="fvch-codeblock"><table class="fvch-code "><tr><td class="fvch-line-number" data-line-number="1"></td><td class="fvch-line-code"><pre><span class="general-operator"><</span><span class="general-operator">?</span>php<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="2"></td><td class="fvch-line-code"><pre>function GetLatestCamPic<span class="general-brackets">(</span>$camid<span class="general-brackets">)</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="3"></td><td class="fvch-line-code"><pre><span class="general-brackets">{</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="4"></td><td class="fvch-line-code"><pre>$heute <span class="general-operator">=</span> date<span class="general-brackets">(</span><span class="general-string">"Ymd"</span><span class="general-brackets">)</span>;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="5"></td><td class="fvch-line-code"><pre>$files <span class="general-operator">=</span> glob<span class="general-brackets">(</span><span class="general-string">"campics/"</span> <span class="general-operator">.</span> $heute <span class="general-operator">.</span> <span class="general-string">"/"</span> <span class="general-operator">.</span> $camid <span class="general-operator">.</span> <span class="general-string">"*.jpg"</span><span class="general-brackets">)</span>;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="6"></td><td class="fvch-line-code"><pre>$files <span class="general-operator">=</span> array_combine<span class="general-brackets">(</span>$files, array_map<span class="general-brackets">(</span><span class="general-string">"filemtime"</span>, $files<span class="general-brackets">)</span><span class="general-brackets">)</span>;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="7"></td><td class="fvch-line-code"><pre>arsort<span class="general-brackets">(</span>$files<span class="general-brackets">)</span>;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="8"></td><td class="fvch-line-code"><pre>$latest_file <span class="general-operator">=</span> key<span class="general-brackets">(</span>$files<span class="general-brackets">)</span>;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="9"></td><td class="fvch-line-code"><pre>return $latest_file;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="10"></td><td class="fvch-line-code"><pre><span class="general-brackets">}</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="11"></td><td class="fvch-line-code"><pre><span class="general-operator">?</span><span class="general-operator">></span><br></pre></td></tr></table></div>
[/codesyntax]

Das Verzeichnis, in dem per FTP die Bilder gespeichert werden, muss angepasst werden. In diesem Beispiel ist es das zum Webscript relative Verzeichnis "campics/".

Der Dateiname kann anschlieend durch bergabe der Kamera-ID erhalten werden. Der Dateiname ist nach folgendem Schema aufgebaut:
<div class="fvch-codeblock"><table class="fvch-code "><tr><td class="fvch-line-number" data-line-number="1"></td><td class="fvch-line-code"><pre>MACADRESSE_KAMERAID_DATUMUNDUHRZEIT_LFDNUMMER<span class="general-operator">.</span>jpg<br></pre></td></tr></table></div>
Beispiel
<div class="fvch-codeblock"><table class="fvch-code "><tr><td class="fvch-line-number" data-line-number="1"></td><td class="fvch-line-code"><pre><span class="general-number">0</span><span class="general-number">0</span>_B1_<span class="general-number">0</span><span class="general-number">1</span>_<span class="general-number">1</span><span class="general-number">3</span>_1C_<span class="general-number">6</span><span class="general-number">8</span>_JWEV<span class="general-operator">-</span><span class="general-number">0</span><span class="general-number">8</span><span class="general-number">8</span><span class="general-number">5</span><span class="general-number">6</span><span class="general-number">3</span><span class="general-operator">-</span>CBRYG_<span class="general-number">0</span>_<span class="general-number">2</span><span class="general-number">0</span><span class="general-number">1</span><span class="general-number">3</span><span class="general-number">0</span><span class="general-number">9</span><span class="general-number">2</span><span class="general-number">6</span><span class="general-number">0</span><span class="general-number">2</span><span class="general-number">4</span><span class="general-number">5</span><span class="general-number">1</span><span class="general-number">3</span>_<span class="general-number">5</span><span class="general-operator">.</span>jpg<br></pre></td></tr></table></div>
Durch folgenden PHP-Aufruf im HTML-Code einer Seite kann der Dateiname ausgegeben werden. Da Datum und Uhrzeit variabel sind, geben wir den festen Teil davor als Referenz an:

[codesyntax lang="php"]<!--?php echo GetLatestCamPic("00_B1_01_13_1C_68_JWEV-088563-CBRYG"); ?-->[/codesyntax]
<h3>Anzeige aller verfgbaren Tage</h3>
Mchte man (zustzlich) eine Auswahlanzeige nach Tagen haben, kann folgender Code verwendet werden, der eine Liste der verfgbaren Tages-Order im Bilderverzeichnis ausgibt:

[codesyntax lang="php"]
<div class="fvch-codeblock"><table class="fvch-code "><tr><td class="fvch-line-number" data-line-number="1"></td><td class="fvch-line-code"><pre><span class="general-operator"><</span><span class="general-operator">?</span>php<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="2"></td><td class="fvch-line-code"><pre>function GetCamPicDays<span class="general-brackets">(</span><span class="general-brackets">)</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="3"></td><td class="fvch-line-code"><pre><span class="general-brackets">{</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="4"></td><td class="fvch-line-code"><pre>if <span class="general-brackets">(</span>$handle <span class="general-operator">=</span> opendir<span class="general-brackets">(</span><span class="general-string">'/var/www/temp/campics'</span><span class="general-brackets">)</span><span class="general-brackets">)</span> <span class="general-brackets">{</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="5"></td><td class="fvch-line-code"><pre>while <span class="general-brackets">(</span>false <span class="general-operator">!</span><span class="general-operator">=</span><span class="general-operator">=</span> <span class="general-brackets">(</span>$file <span class="general-operator">=</span> readdir<span class="general-brackets">(</span>$handle<span class="general-brackets">)</span><span class="general-brackets">)</span><span class="general-brackets">)</span> <span class="general-brackets">{</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="6"></td><td class="fvch-line-code"><pre>if <span class="general-brackets">(</span>$file <span class="general-operator">!</span><span class="general-operator">=</span> <span class="general-string">"."</span> <span class="general-operator">&</span><span class="general-operator">&</span> $file <span class="general-operator">!</span><span class="general-operator">=</span> <span class="general-string">".."</span><span class="general-brackets">)</span> <span class="general-brackets">{</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="7"></td><td class="fvch-line-code"><pre>$dirs<span class="general-brackets">[</span><span class="general-brackets">]</span> <span class="general-operator">+</span><span class="general-operator">=</span> $file;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="8"></td><td class="fvch-line-code"><pre><span class="general-brackets">}</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="9"></td><td class="fvch-line-code"><pre><span class="general-brackets">}</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="10"></td><td class="fvch-line-code"><pre>closedir<span class="general-brackets">(</span>$handle<span class="general-brackets">)</span>;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="11"></td><td class="fvch-line-code"><pre>rsort<span class="general-brackets">(</span>$dirs<span class="general-brackets">)</span>;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="12"></td><td class="fvch-line-code"><pre>return $dirs;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="13"></td><td class="fvch-line-code"><pre><span class="general-brackets">}</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="14"></td><td class="fvch-line-code"><pre><span class="general-brackets">}</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="15"></td><td class="fvch-line-code"><pre><span class="general-operator">?</span><span class="general-operator">></span><br></pre></td></tr></table></div>
[/codesyntax]

Zustzlich kann man folgenden Code verwenden, um sich die Tage in einer Dropdownliste anzeigen zu lassen:

[codesyntax lang="php"]
<div class="fvch-codeblock"><table class="fvch-code "><tr><td class="fvch-line-number" data-line-number="1"></td><td class="fvch-line-code"><pre>function CreateCamPicDayList<span class="general-brackets">(</span><span class="general-brackets">)</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="2"></td><td class="fvch-line-code"><pre><span class="general-brackets">{</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="3"></td><td class="fvch-line-code"><pre>$days <span class="general-operator">=</span> GetCamPicDays<span class="general-brackets">(</span><span class="general-brackets">)</span>;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="4"></td><td class="fvch-line-code"><pre>echo <span class="general-string">'<select name="day" size="1">'</span>;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="5"></td><td class="fvch-line-code"><pre>foreach <span class="general-brackets">(</span>$days as $value<span class="general-brackets">)</span> <br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="6"></td><td class="fvch-line-code"><pre><span class="general-brackets">{</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="7"></td><td class="fvch-line-code"><pre>echo <span class="general-string">"<option>"</span> <span class="general-operator">.</span> $value <span class="general-operator">.</span> <span class="general-string">"</option>"</span>;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="8"></td><td class="fvch-line-code"><pre><span class="general-brackets">}</span><br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="9"></td><td class="fvch-line-code"><pre>echo <span class="general-string">"</select>"</span>;<br></pre></td></tr><tr><td class="fvch-line-number" data-line-number="10"></td><td class="fvch-line-code"><pre><span class="general-brackets">}</span><br></pre></td></tr></table></div>
[/codesyntax]

An einer beliebigen Stelle im HTML-Code kann die Liste dann wie folgt erzeugt werden:

[code type=php]<!--?php CreateCamPicDayList(); ?-->

Anzeige aller Bilder eines Tages

Um alle Bilder (bzw. die URLs) eines Tages zu erhalten, kann folgender Code verwendet werden:

xxx

Einrichten der Überwachungsfunktion mit Alarm

xxx

Ein Gedanke zu „Videoüberwachung mit Raspberry Pi

  1. Hallo,

    danke für den interessanten Artikel. Die Idee mit dem FTP-Upload finde ich super. Ich habe auch schon mit der Kamera von wanscam geliebäugelt, allerdings habe ich diese auf einer Seite mit zertifiziertem Zubehör nicht gefunden, und habe davon schon beinahe Abstand genommen. Jetzt werde ich das aber mal wie beschrieben ausprobieren.

    Viele Grüße,

    Wolfgang

    Kommentiere

Schreibe eine Antwort

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Erforderlich