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

04/2019
TV & Multimedia

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

Neuigkeiten

  • Finger weg

    Ein Temperatursensor verrät, ob Sie einen Gegenstand gefahrlos berühren dürfen. Beim Messen brauchen Sie dabei noch nicht einmal Kontakt zum Objekt.

  • Aus einer Hand

    Um einen Mikrocontroller zu programmieren, genügt ein Raspberry Pi. Wir zeigen, was Sie dazu noch benötigen.

  • Im Gleichtakt

    Synchronisierte Live-Loops und selbst erstellte Funktionen helfen dabei, Sonic Pi wie ein Live-Instrument zu spielen.

  • Mach mal

    Das Ftduino-Modul schlägt die Brücke zu Fischertechnik und ermöglicht es unter anderem, einen Drei-Achsen-Roboter anzusteuern.

  • Eleganter Diener

    Jeden Morgen dieselben Handgriffe, um zu sehen, ob die S-Bahn fährt und wie das Wetter wird? Ein cleverer Infoscreen auf RasPi-Basis automatisiert den Vorgang.

  • Bienenflüsterer

    Bienenzüchter, die ihre Völker besser kennenlernen möchten, müssen die fleißigen Insekten nicht pausenlos stören. Mit einem Raspberry Pi und verschiedenen Sensoren überwachen sie Temperatur, Luftfeuchtigkeit und bald auch das Gewicht des Bienenstocks.

  • Beerige Musik

    Für echten Hi-Fi-Sound braucht es mehr als einen kleinen Bluetooth-Brüllwürfel. Mit Volumio und einem Raspberry Pi rüsten Sie Ihre klassische Hi-Fi-Anlage mit smarten Funktionen auf.

  • Ton ab!

    Auf den ersten Blick erscheint der RasPi zu schwachbrüstig für den Betrieb leistungshungriger DAW-Software. Doch der Schein trügt.

  • Himbeer-TV

    Der DVB TV µHAT rüstet den Raspberry Pi mit einem DVB-T/T2-Tuner auf. Die deutsche TV-Landschaft schränkt dessen Möglichkeiten allerdings ein.

  • Git à la RasPi

    Mit wenigen Handgriffen zum Git-Hoster: Die dezentrale Arbeitsweise von Git erleichtert in Kombination mit der Netzwerkfähigkeit des RasPi das Verwalten von Quellcode.