Videoüberwachung mit dem Raspberry Pi

Anpassungen

Mit wenigen Handgriffen erweitern Sie die Überwachungskameralösung um zusätzliche Funktionen. Dabei stehen Ihnen, anders als bei einer gekauften Anlage, alle Möglichkeiten offen, die sich aus einem Netzwerk aus Linux-(Raspberry-Pi)-Rechnern ergeben. Soll beispielsweise regelmäßig ein Backup der neu aufgenommenen Bilder auf einem Server im Internet erfolgen, legen Sie einfach einen Cronjob an, der jeweils das Unterverzeichnis /var/www/cam/bilder/ über das Kommandozeilentool Rsync spiegelt.

Damit Sie unkompliziert weitere Anpassungen vornehmen können, haben wir das Projekt absichtlich mittels leicht lesbarer und ausführlich kommentierter PHP-Skripte umgesetzt. Im Folgenden schildern wir als Hilfe den Ablauf der Skripte.

Die Datei config_einlesen.php (Listing 2) parst die aktuelle Konfigurationsdatei und schreibt alle Ergebnisse in ein Array. Das Skript steuere_kamera.php (Listing 3), das auf jedem eingebundenen RasPi im Hintergrund läuft, realisiert in einer Endlosschleife den immer gleichen Ablauf: Die Datei config.txt wird per HTTP-Request vom zentralen Steuerungsrechner angefordert und anschließend durch das Einbinden von config_einlesen.php geparst. Dann nimmt das angeschlossene Kameramodul gemäß des Config-Arrays ein Foto auf und legt es im Unterverzeichnis /bilder/ ab. Nun friert der Ablauf für die im Intervallwert konfigurierte Sekundenanzahl ein, bevor die Schleife von vorne beginnt.

Listing 3

 

<?php
// IP-Adresse des Haupt-RasPis
$config_server = '192.168.2.50';
// Standard-Intervall von fünf Sekunden verwenden
$intervall = 5;
// Eigene IP feststellen
$eigene_ip = eigene_ip_herausfinden();
while (TRUE) {
  // Vom Hauptserver die aktuelle Config holen
  $handle = curl_init();
  curl_setopt($handle, CURLOPT_URL, "http://$config_server/cam/config.txt");
  curl_setopt($handle, CURLOPT_HEADER, FALSE);
  curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
  $config_daten = curl_exec($handle);
  $http_code = curl_getinfo($handle, CURLINFO_HTTP_CODE);
  // Nur etwas unternehmen, wenn die aktuelle Konfiguration
  // gelesen werden konnte, also der Haupt-Raspi online ist
  if ( ($config_daten <> FALSE) AND ($http_code == 200) ) {
    require('config_einlesen.php');
    // Anhand der IP das richtige Config-Unterarray herausfinden
    foreach ($lokale_einstellungen as $schluessel => $einzelne_kamera) {
      if ($einzelne_kamera['IP'] == $eigene_ip) {
        $diese_kamera = $lokale_einstellungen[$schluessel];
        break;
      }
    }
    // Raspistill aufrufen
    $schaerfe = (int)$diese_kamera['SCHAERFE'];
    $kontrast = (int)$diese_kamera['KONTRAST'];
    $helligkeit = (int)$diese_kamera['HELLIGKEIT'];
    $saettigung = (int)$diese_kamera['SAETTIGUNG'];
    $iso = (int)$diese_kamera['ISO'];
    $intervall = (int)$diese_kamera['INTERVALL'];
    $qualitaet = (int)$diese_kamera['QUALITAET'];
    $breitefotos = (int)$diese_kamera['BREITEFOTOS'];
    $hoehefotos = (int)$diese_kamera['HOEHEFOTOS'];
    $cmd = "raspistill -o ./bilder/neuestes_bild.jpg --timeout 0 --encoding jpg --nopreview --sharpness $schaerfe --contrast $kontrast --brightness $helligkeit --saturation $saettigung --ISO $iso --quality $qualitaet --width $breitefotos --height $hoehefotos";
    if ( $diese_kamera['RAW'] == 1) $cmd .= ' --raw';
    // Kopie von neuestes_bild.jpg anlegen, Dateinamen aus Datum und Uhrzeit bilden
    // Zur besseren Sortierbarkeit stehen Jahr und Monat im Namen vorne
    $dateiname = date('Y-m-d__H:i:s').".jpg";
    exec($cmd);
    copy('./bilder/neuestes_bild.jpg','./bilder/'.$dateiname);
  }
  else print "Konfigurationsdatei konnte nicht empfangen werden --> Haupt-RasPi ist offline?\n";
  curl_close($handle);
  // Für die Wartezeit eine Sekunde abziehen, die bereits für die Aufnahme verbraucht wurde
  sleep($intervall-1);
}
function eigene_ip_herausfinden()
{
  // ifconfig aufrufen
  exec("/sbin/ifconfig eth0", $ausgabe);
  // IP so ausfiltern, dass dies sowohl für EN als auch DE funktioniert
  $eigene_ip = $ausgabe[1];
  $eigene_ip = strstr($eigene_ip, 'inet ');
  $eigene_ip = substr($eigene_ip, strpos($eigene_ip,':')+1);
  $eigene_ip = substr($eigene_ip, 0, strpos($eigene_ip,' '));
  return $eigene_ip;
}
?>

Um eine Erweiterung zu schreiben, die beispielsweise nach einiger Zeit ältere Bilder löscht, ist das Schema der Dateinamen von Bedeutung. Das Skript bildet sie nach dem Prinzip Jahr-Monat-Tag__Stunde:Minute:Sekunde.jpg. Diese Reihenfolge bietet den Vorteil, dass bei ein nach Zahlengröße sortiertes Directory-Listing den neuesten Eintrag zuerst und der ältesten als Letztes zurückgibt. Zusätzlich legt das Skript die aktuellste Aufnahme immer auch unter dem Dateinamen neuestes_foto.jpg ab.

Die über den Browser aufzurufende Datei index.php ist hier aus Platzgründen nicht abgedruckt, steht jedoch zusammen mit den anderen Dateien des Projekts auf der Heft-DVD zur Verfügung. Sie bezweckt nicht viel mehr, als zuerst unter Einbindung von config_einlesen.php die Konfiguration einzulesen und anschließend eine HTML-Seite auszugeben: Unter dem Namen jeder Kamera erscheint dabei jeweils deren zuletzt geschossenes Bild.

Die Fotos der an anderen Standorten aufgestellten Raspberrys, auf denen ja ebenfalls ein Apache2-Daemon läuft, bindet das Skript per HTTP-Request ein. Die ständige Aktualisierung der Darstellung erzwingt die HTML-Seite über eine Meta-Anweisung im <head>. Änderungen an der Datei index.php sollten für Sie nur dann von Interesse sein, wenn Sie das Layout der Weboberfläche verändern möchten.

Schlaue Einbrecher?

In Krimis oder auch im dystopischen Rollenspiel Shadowrun gilt ein Szenario als sehr beliebt: Einbrecher heuern einen Hacker an, der über das Internet die Videoüberwachungsanlage eines Objekts lahmlegt. Anschließend räumen die restlichen Täter das Haus in Ruhe leer. Alternativ ersetzt der Hacker angefertigte Aufnahmen durch ein älteres Standbild, auf dem nichts Verdächtiges passiert. Auf diese Weise fällt der Einbruch unter Umständen erst viel später auf.

Nun dürften in der Realität die meisten Kleinkriminellen nicht über solch einen Organisationsgrad verfügen. Sie werden sich eher darauf beschränken, Überwachungskameras, die sie entdecken, mit physischer Gewalt zu zerstören. Wenn auf den RasPis ein kurzgetakteter Cron läuft, der minütlich via Rsync die neuesten Bilder auf Ihren Server lädt, dann verfügen Sie trotzdem über alle bis zu diesem Zeitpunkt angefertigten Aufnahmen der Täter. Um auch gegen den eher seltenen Fall von "hackenden" Einbrechern geschützt zu sein, sollten Sie dennoch auf ein sicheres Passwort für Ihr LAN achten.

Dies alles geht jedoch vermutlich schon weit über das hinaus, was Durchschnittskriminelle bei einem einfachen Wohnhaus als Sicherheitsvorkehrungen erwarten. Schließlich nimmt die vorgestellte Lösung an mehreren Orten des überwachten Objekts farbige Bilder in einer Auflösung von jeweils 5 Megapixeln auf und sichert diese optional unmittelbar danach im Netz. Macht Ihnen aber das Tüfteln Spaß, dann können Sie die Sicherheit des Systems weiter maximieren.

Eine denkbare Erweiterung wäre etwa, ein Skript zu schreiben, das auf dem Backup-Server regelmäßig kontrolliert, ob längere Zeit kein Upload von neuen Kamerabildern stattfand. Ist das der Fall, könnten Sie beispielsweise einprogrammieren, dass der Server über ein SMS2Mail-Gateway eine Alarmmeldung an Ihr Handy versendet. Es könnte aber auch ein abschreckender Alarm ertönen, der die Täter in die Flucht schlägt. Wie so oft sind beim Raspberry Pi der Fantasie bezüglich eigener Erweiterungen keine Grenzen gesetzt. 

Infos

  1. RasPi-Kamera-Modul: Marko Dragicevic, "Auge des Pi", RPG 01/2014, S. 44, http://www.raspberry-pi-geek.de/31272
  2. Pi-NoIR: http://www.raspberrypi.org/archives/5128

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Aktuelle Ausgabe

02/2019
Neue Energien

Diese Ausgabe als PDF kaufen

Preis € 9,99
(inkl. 19% MwSt.)

Stellenmarkt

Neuigkeiten

  • Scheibchenweise

    Zu den Stärken von Sonic Pi gehört es, mit wenigen Zeilen Code Samples dynamisch auszuwählen und zu zerlegen.

  • Unter Strom

    Für einen kleinen Spannungsmesser wie den INA3221 gibt es viele Einsatzmöglichkeiten. Wir zeigen, wie Sie den flexiblen Baustein richtig verdrahten.

  • Vermittlungsstelle

    Fischertechnik-Modelle bieten sich zum Fernsteuern an. Mit dem Ftduino schlagen Sie die Brücke zwischen dem RasPi und dem Technik-Spielzeug.

  • Durchgeschlängelt

    Mit den M0-Boards steigen Sie unkompliziert in die Welt der Mikrocontroller ein – ganz ohne C-Kenntnisse.

  • Gesiebt und gefiltert

    Filter und Werbeblocker einzurichten ist besonders auf Smartphones aufwendig. Den eBlocker hingegen schließen Sie einfach nur an Ihren Router an.

  • Es werde Licht

    Wollen Sie bei beginnender Dämmerung nicht ständig die Helligkeit der heimischen Beleuchtung nachregeln, überlassen Sie das einfach einem RasPi – der macht es automatisch.

  • Energiekontrolle

    Der Gesetzgeber erschwert das Direktvermarkten von Strom durch technische Hürden: So muss sich die Einspeisung etwa aus der Ferne abschalten lassen. Der RasPi löst das Problem.

  • H<->2<->-Power

    Gilt es, Energie aus einer regenerativen Quelle zu speichern, erweist sich die Kombi aus einer Brennstoffzelle und dem RasPi als ideale Lösung.

  • Kleine Wolke

    Lokale Cloud-Lösungen im Heimnetz finden immer mehr Nutzer. Mit dem RasPi und Seafile haben Sie eine Lösung zur Hand, die selbst professionellen Ansprüchen genügt.

  • Planvoll verdrahtet

    Die Leiterplattendesign-Software KiCad leistet trotz einer etwas umständlichen Bedienung auch Hobbybastlern gute Dienste.