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

08/2019
Smarte Hacks

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

Neuigkeiten

  • Immer der Reihe nach

    Mit einer einfachen Schaltung testen Sie Bausteine, die über den SPI-Bus miteinander kommunizieren.

  • Einzigartig

    Eine MAC-Adresse ermöglicht die Kommunikation im Netzwerk. Der 24AA02E48 liefert sie für Setups, die aus grundlegenden Komponenten bestehen.

  • Steinkuchen

    Der Raspberry Pi hat viele Fans, doch nicht ohne Grund sehnen sich viele Anwender nach einem RasPi 4. Der Rock Pi 4 übertrumpft den RasPi 3 in Sachen Leistung um Längen und schlägt sich auch in der Praxis gut.

  • Kerngeschäft

    Der Einstieg in die Welt der Mikrocontroller fällt nicht ganz leicht. Mit dem Nucleo F401RE haben Sie jedoch ein Entwicklerboard samt abgestimmter Entwicklungsumgebung an der Hand.

  • Himbeer-Geräte

    Mit Maus und Tastatur im weiß-roten Raspberry-Look macht die Raspberry Pi Foundation das eigene Angebot an Peripheriegeräten für den Mini-Rechner komplett.

  • Unter Kontrolle

    PiCockpit ist eine speziell auf den RasPi zugeschnittene Online-Monitoring-Lösung. Wir werfen einen ersten Blick auf den brandneuen und in Ausbau befindlichen kostenlosen Dienst.

  • Ins rechte Licht gesetzt

    Selbst ohne eigenen Garten holen Sie sich Pflanzen mithilfe von LEDs in jeden Raum und sehen ihnen mit dem RasPi beim Wachsen zu.

  • Helligkeit nach Maß

    Wer bei wechselnden Lichtverhältnissen nicht ständig die Beleuchtung manuell nachregeln möchte, der spannt dafür einen PiXtend ein.

  • Geschrumpft

    Kleine Bildschirme gibt es zwar viele, aber der Support von Raspbian ist überraschend schlecht. Mit ein paar Tricks erzielen Sie trotzdem ein optimales Ergebnis.

  • Brüllwürfel

    Kompakt-Stereoanlagen mit CD-Spieler und Kassettendeck sind inzwischen oft ein Fall für den Recyclinghof – oder für die digitale Wiederbelebung mit einem RasPi und etwas Geschick.