:: fischer-net.de

Die freie Haussteuerungssoftware FHEM setze ich nun schon seit 2008 ein. In den vergangenen Jahren habe ich meine Hausautomation immer weiter ausgebaut und mittlerweile annähernd 100 Aktoren oder Sensoren im Einsatz. Ab und an trage ich mit eigenen Modulen oder Funktionen auch zur Entwicklung von FHEM bei.

Nun kam mir die Tage die Idee, dass ich FHEM doch irgendwie mit meinen IP-Kameras verbinden könnte. Ich wollte erreichen, das mir Zeit- oder Ereignisgesteuert ein "Schnappschuß" einer Kamera per eMail gesendet wird. Aus dieser Idee entstand das neue Modul IPCAM.

Meine eingesetzten IP-Kameras (siehe auch Artikel: Surveillance - Video-Hardware) unterstützen bereits von Haus aus die Möglichkeit der so genannten "Motion detection" doch die Funktionalität entsprach nicht meinen Anforderungen. Daher nutze ich seit längerem die Surveillance Software meines Synology NAS (siehe auch Artikel: Surveillance - Software). Zwar bin ich mit dieser Lösung soweit zufrieden, dennoch störte mich bisher die Tatsache, dass einerseits FHEM und andererseits die Netzwerk-Kameras jeweils für sich eine Insellösung darstellen.

Gestern (10.08.2012) nahm ich mir also die Zeit und schrieb das Modul IPCAM. Die damit verbundenen Möglichkeiten stelle ich in diesem Artikel kurz vor. Das Modul ist ab sofort über das FHEM SVN verfügbar und wird ab dem 12.08.2012 vormittags über die FHEM interne Updatefunktion verteilt.

 

Modul IPCAM

Die meisten (oder so gut wie alle) Netzwerk-Kameras bieten die Möglichkeit Einzelbildaufnahmen über den Aufruf einer URL bereit zu stellen. So lautet z.B. die URL meiner INSTAR Kameras inkl. geschützem Zugriff "http://CAMERA_IP/snapshot.cgi?user=USERNAME&pwd=PASSWORD". Über diese URL holt sich das Modul IPCAM den entsprechenden Schnappschuß.

Doch das Modul kann noch mehr: Quasi jedes beliebige Bild das mittels einer URL erreichbar ist, kann bei Bedarf "aufgenommen" werden. So erlaubt das Modul z.B. den Zugriff auf öffentliche Wettercams, Wetterkarten, Börsengrafiken oder andere in Websites eingebettete Grafiken. Unterstützt werden die Bildtypen JPEG, PNG, GIF, TIFF, BMP, ICO, PPM, XPM, XBM sowie SVG.

 

Device in FHEM definieren

Die Definition einer "IPCAM" ist einfach:

define <name> IPCAM <ip[:port]>

Der <name> kann frei gewählt werden und als Argument benötigt das Device eine gültige IP- oder Domain-Adresse. Bei Bedarf kann noch eine Portangabe erfolgen.

Alle weiteren notwendigen Angaben werden mittels Attributen gesetzt.

 

Beschreibung der Attribute

Die Attribute ermöglichen bzw. benötigen folgende Angaben. Nicht alle Attribute müssen gesetzt sein; es hängt von der gewünschten Funktionalität ab. Als Minimum werden die Attribute path und storage benötigt.

 

credentials

Dieses Attribut ermöglicht die Angabe einer Datei, die die Zugangsdaten der einzelnen Netzwerk-Kameras beinhaltet. Möchte man also diese Daten nicht in der Konfiguration von FHEM sichtbar anzeigen, dann können die Zugangsdaten in die credentials-Datei ausgelagert werden. In der Befehlsreferenz (commandref.html) von FHEM befindet sich ein Beispiel für den Aufbau der Datei.

 

delay

Um einerseits die definierte Quell-Adresse (Netzwerk-Kamera, Website) nicht mit Anfragen zu Fluten aber andererseits vorallem um eine sinnvolle Serie von Bildern zu ermöglichen, kann eine "Wartezeit" zwischen den Aufnahmen gesetzt werden. Die Angabe erfolgt in Sekunden. Dieses Attribut wird in Kombination mit dem Attribut snapshots genutzt.

 

path

Über dieses Attribut wird der eigentliche Pfad zu dem "Schnappschuß" / Bild definiert. Lautet die URL z.B. "http://CAMERA_IP/snapshot.cgi?user=admin&pwd=password" dann entspricht das der Angabe von "snapshot.cgi?user=admin&pwd=password". Der einleitende Slash (/) ist dabei wegzulassen.

Eigentlich ist die Bezeichnung path an dieser Stelle falsch. Wer mehr darüber lesen will schaue sich den entsprechenden Artikel Uniform Resource Identifier an. In diesem Fall habe ich die Bezeichnung etwas vereinfacht.

 

snapshots

Hier wird festgelegt wie viele "Aufnahmen" von der im Attribut path gesetzten Adresse geholt werden sollen. Wird dieses Attribut nicht gesetzt, so ist der Standardwert 1. Es wird also nur eine "Aufnahme" gemacht. Sinnvoll ist das Zusammenwirken mit dem Attribut delay.

 

storage

Damit die "Aufnahmen" auch gespeichert werden können, benötigt das Modul IPCAM die Angabe eines Speicherortes. Das Zielverzeichnis muss im Vorfeld angelegt werden.

 

Einfache Beispiele

 

Lokale Netzwerk-Kamera

Eine lokale Netzwerk-Kamera die beim Aufruf 5 Aufnahmen im Abstand von 10 Sekunden vornehmen soll:

define ipcam IPCAM 192.168.1.205
attr ipcam delay 10
attr ipcam path snapshot.cgi?user=foo&pwd=bar
attr ipcam snapshots 5
attr ipcam storage /srv/share/surveillance/snapshots

Dieses Device soll bei der Auslösung eines Bewegungsmelders die Aufnahmen holen:

define MOTION.not.01 notify GH.ga.SEC.MD.01:.*on.* get ipcam image

 

Öffentliche WebCam auf einer Internetseite

Von einer öffentliche WebCam soll alle 60 Minuten ein Bild geholt werden:

define schloss IPCAM www2.braunschweig.de
attr schloss path webcam/schloss.jpg
attr schloss storage /srv/share/surveillance/snapshots

Der dazu gehörige Job lautet:

define snapshot_schloss at +*00:01:00 get schloss image

 

Erweitertes Beispiel

Auf Grundlage des oben beschriebenen Beispiels der lokalen Netzwerk-Kamera ipcam, soll bei der Auslösung eines Ereignisses durch den im Beispiel definierten Bewegungsmelder GH.ga.SEC.MD.01 zusätzlich eine eMail mit den 5 Aufnahmen versendet werden.

Da FHEM inzwischen auf den unterschiedlichsten Systeme betrieben wird und das Versenden einer eMail sich auf diesen zum Teil stark unterscheidet, greife ich in diesem Beispiel auf den Stand-Alone Befehl SendEmail zurück. Dieser kann von der Homepage des Entwickler heruntergeladen werden und ist auf fast allen Systemen (Linux, Windows) sofort einsatzbereit. SendEmail ist komplett in Perl geschrieben und benötigt in der Regel keine weiteren Perl-Module.

 

Notfiy nach dem Speichern der Aufnahmen

Im Beispiel wurde erst das Kamera-Device ipcam mit den notwendigen Attributen definiert und desweiteren ein Notify der bei der Auslösung eines Bewegungsmelders das Device ipcam veranlaßt die definierte Anzahl von Schnappschüssen zu holen.

Zur Erinnerung:

define MOTION.not.01 notify GH.ga.SEC.MD.01:.*on.* get ipcam image

Wird der Status on vom Bewegungsmelder GH.ga.SEC.MD.01 gemeldet, ruft diese Notify-Anweisung den Befehl get ipcam image auf.

Das Device ipcam meldet nun im weiteren Verlauf zwei Ereignistypen:

last: <dateiname> und snapshots: <anzahl der aufnahmen>

Letzteres Ereignis, also die Anzahl der Aufnahmen, signalisiert, das alle Aufnahmen gespeichert wurden. Diese Ereignismeldung wird nun in eine eigene Notify-Anweisung "verpackt" (alles in einer Zeile!):

define MOTION.not.02 notify ipcam:.*snapshots.* { sendSnapshot("%NAME","%EVTPART1") }

Die aufzurufende Funktion sendSnapshot wird im folgenden Abschnitt beschrieben.

 

Eine eigene Funktion in FHEM

In FHEM wird für dieses Beispiel eine eigene Funktion benötigt. Rudi hat eine sehr gute Möglichkeit geschaffen, solch Funktionen einfach einzubinden. FHEM bindet alle Dateien die mit einer 99_ beginnen automatisch ein und über das Webfrontend pgm2 (FHEMWEB) können Dateien die mit 99_ anfangen und das Wort Utils beinhalten editiert werden.

 

99_myUtils.pm

Über das Betriebssystem wird die Datei 99_myUtils.pm angelegt, sofern diese noch nicht vorhanden ist. Alternativ kann die folgende Funktion sub sendSnapshot(@) auch in die bereits vorhandene Datei 99_Utils.pm eingefügt werden).

##############################################
package main;
use strict; use warnings; use POSIX;
sub myUtils_Initialize($$) { my ($hash) = @_; }
####################################### sub sendSnapshot(@) { my ($cam,$snapshots) = @_; my $storage = AttrVal($cam,"storage",""); my $rcpt = '<your_email_address>'; my $from = '<from_email_address>'; my $subj = "FHEM: Kamera $cam hat eine Bewegung aufgezeichnet"; my $last = ReadingsTimestamp($cam,"last",""); my $mess = "Kamera $cam hat eine Bewegung am $last aufgezeichnet:";
if(!-d $storage) { Log 1, "IPCAM $cam storagepath does not exists: $storage"; return "storagepath for $cam does not exists: $storage"; } if(!$last) { Log 1, "IPCAM $cam no snapshots available"; return "no snapshots available for $cam"; }
my $cmd = "sendemail -f $from -t $rcpt -u $subj -m $mess "; $cmd .= "-o message-content-type=text -o message-charset=utf-8 -a"; for (my $s=1;$s<$snapshots+1;$s++) { $cmd .= " $storage/".ReadingsVal($cam,"snapshot$s",""); } my $ret = `$cmd`; $ret =~ s/[\r\n]//g; Log 4, "IPCAM sendSnapshot: $ret"; return undef; }
1;

Die wichtigen Abschnitte der Funktion werden kurz erklärt:

Im ersten Drittel werden wichtige Variablen definert.

  • Der Speicherort $storage wird aus dem Device ipcam ausgelesen.
  • Die Empfanger- $rcpt sowie Absende-eMail-Adresse $from wird festgelegt. Die Platzhalter <your_email_address> sowie <from_email_address> müssen durch die eigenen zu verwendenen Adressen ersetzt werden.
  • Der Betreff der eMail wird in $subj definiert und beinhaltet den Namen der Kamera von dem die Bilder stammen.
  • Die Variable $last enthält den Datums-Uhrzeit-Stempel der letzten Aufnahme.
  • $mess ist der eigentliche Nachrichtentext und beinhaltet nochmals den Namen der Kamera sowie das Datum und die Uhrzeit der letzten Aufnahme.

Es erfolgt eine Überprüfung ob das Verzeichnis mit den Aufnahmen vorhanden ist sowie ob überhaupt eine Aufnahme exisitert. Tritt hier ein Fehler auf, wird die Funktion angebrochen.

Im letzten Drittel wird schließlich die eMail zusammengestellt und alle Aufnahmen angehängt. Die Zeile

  my $cmd  = "sendemail -f $from -t $rcpt -u $subj -m $mess ";

sollte man sich nochmals genauer ansehen. Unter Linux könnte der Aufruf sendEmail.pl und unter Windows sendEmail.bat lauten. Bei mir ist sendemail ein symbolischer Link auf sendEmail. Der korrekte Aufruf ist der Anleitung zu SendEmail zu entnehmen.

 

Zusammenfassung

Das neue Modul IPCAM sowie die hier im Beispiel gezeigte Funktion sendSnapshot ermöglicht die automatische Benachrichtigung inkl. der gewünschten Anzahl von Bildern des definierten Ereignisses an eine beliebige eMail-Adresse. 

Viel Spaß damit...

Haus-Automatisierung bei conrad.de
Egal ob Stehlampe, Schrankbeleuchtung, Rollladen oder auch Heizlüfter: Mit Conrad.de steuern Sie die unterschiedlichsten Verbraucher effektiv und bequem vom Sessel aus - zu enorm günstigen Preisen! Hier gehts zu den Produkten...

Powered by ...

 

 

reichelt elektronik – Elektronik und PC-Technik