≡ Menü

HowTo: Überwachungskamera mit Push-Benachrichtigung (fast) ohne Cloud

Fast alle IP-Kameras für den privaten Gebrauch hängen mehr oder weniger tief im Internet. Meist nur, damit der Hersteller auf seiner Website damit werben kann, dass ein Blick in die eigene Wohnung von überall per Smartphone möglich ist. Das der Anbieter dazu auf irgendeine Weise eine Verbindung vom Internet zur in der heimischen Wohnung angebrachten Kamera herstellen muss, vergessen viele. Und manche von uns möchten das nicht. Es geht aber auch (fast) ohne fremde Hilfe.

Ziel soll es hier nicht sein, von außerhalb des eigenen Netzes die Live-Bilder der Kamera zu betrachten. Dazu empfehle ich dringend ein eigenes, selbst verwaltetes VPN. Oft reicht es aber aus, eine Pushnachricht auf’s Handy zu bekommen, wenn die Kamera eine Bewegung registriert. Und das lässt sich mit den meisten IP-Kameras und einem kleinen Linux-Server in wenigen Schritten aufsetzen.

Server tut not

Ja, so ganz ohne ein laufendes Linux-System kommt man (im Moment! Vielleicht habe ich da bald was für euch!) nicht aus. Die Ansprüche sind nicht besonders hoch. Ein einfaches Minimalsystem tut es vollkommen. Für unser Projekt sind die einzigen Voraussetzungen die Standard-Tools inotifywait, curl und ein FTP-Server. Das mit dem ‚S‘ vor dem „FTP“ können die meisten IP-Kameras leider immer noch nicht. Aber da sich alles in unserem eigenen Netz abspielt und von Außen (hoffentlich) nicht zugreifbar ist, können wir das hier verschmerzen.

FTP-Server

Das gute alte File Transer Protocol muss immer noch herhalten, wenn man möchte, dass IP-Kameras einen Snapshot (also ein Bild) auf einen Server schieben, wenn sie eine Bewegung erkannt haben.

inotifywait

Ein Command line tool, dass mit Hilfe des inotify Interfaces von Linux auf Änderungen im File-System lauscht. Also z.B., ob ein neues File in einem Verzeichnis unseres FTP-Servers erstellt wurde.

curl

Das Schweizer Taschenmesser der Kommandozeilen-Werkzeuge, wenn es um das Versenden und/oder Empfangen von Daten geht. In unserem Fall nutzen wir curl, um die JSON-Schnittstelle von Pushover zu bedienen.

Die Kamera

Welche Kamera ihr euch letztlich in die Bude, oder vor den Eingang hängt, überlasse ich ganz euch. Das einzige, was sie können muss, ist die Bewegungserkennung. Das sollte heute aber eigentlich Standard sein. Normalerweise kann man irgendwo in der (zumeist äußerst hässlichen und nur schwer bedienbaren) Administrationsoberfläche der Kamera einen Bereich des Bildes auswählen, dass die Kamera auf Änderungen überwacht. Ändert sich im Bildausschnitt etwas, erkennt sie also eine „Bewegung“, kann man meist verschiedene Aktionen auslösen. Wir möchten nur, dass die Kamera einen Snapshot, oft ein Bild im JPG-Format, per FTP auf unserem Linux-Rechner ablegt und richten das entsprechend in der Oberfläche der Kamera ein.

Ein kleiner Tipp noch: Achtet beim Kauf der Kamera darauf, dass für die Adminoberfläche der Kamera kein irgendwie geartetes Plugin im Web-Browser notwendig ist. Die sind IMMER schlimm!
Und noch einer: Eine eventuell vorhandene Funktion zur Anbindung an die Hersteller-Cloud sollte natürlich abschaltbar sein. Alles andere liefe ja unserer Idee hier zuwider. Alternativ kann man natürlich im WAN-Router (Fritzbox o.Ä.) den ausgehenden Verkehr für die Kamera komplett abdrehen. Dann bekommt man aber auch keine Firmware-Updates mehr. Falls es die überhaupt je geben wird. Was Erfahrungsgemäß eher selten der Fall ist.

Pushover

Wie ich oben schon angedeutet habe, geht es dann doch nicht ganz ohne fremde Hilfe. Irgendwer muss uns nämlich die Pushnachrichten auf unser Smartphone zustellen. Zum Glück gibt es da einen netten, kleinen Dienst namens Pushover. Die Registrierung selbst ist kostenlos, solange man nicht vorhat, mehr als 7500 Nachrichten pro Monat (und Applikation) zu verschicken. Allerdings braucht man die App des Dienstes, um die Pushnachrichten zu empfangen. Diese schlägt nach einer 7-tägigen Ausprobierphase mit einmaligen – IMHO sehr modraten – 4,99€ pro Plattform zu Buche.

[appext 506088175]

Dafür bekommt man eine Unmenge an Schnittstellen, über die man künftig Pushmitteilungen erhalten kann. Wer genaueres wissen möchte, dem sei die „Apps & Plugins“ Site von Pushover ans Herz gelegt.

Die Einrichtung

Für den Versand der Nachricht muss man in Pushover verschiedene Dinge einrichten:

  • Zuerst bekommt man mit der Anmeldung einen User Key. Mit diesem Identifiziert ihr euch am Ende gegen den Dienst.
  • Dann muss man noch die Geräte einrichten, auf denen man die Push-Nachrichten empfangen möchte. Das geschieht mit Hilfe der oben erwähnten App, die man auf dem jeweiligen Device installiert. Registriert man mehrere Geräte kann man beim Versenden der Nachricht sogar unterscheiden, ob diese von allen Devices, oder nur von bestimmten empfangen werden soll.
  • Zuletzt muss man eine Applikation/einen Dienst definieren, der quasi als Absender der Nachricht fungiert und in der Nachricht erscheint. Damit bekommt ihr ein sog. API-Token.

Mit allen drei Infos zusammen kann man dann die Schnittstelle von Pushover füttern und so veranlassen, dass eine Push-Mitteilung an unser Smartphone verschickt wird.

Zusammenspiel

FTP-Server und Kamera einrichten

Wie bereits erwähnt, müssen wir auf dem Linux-Server einen FTP-user einrichten, mit dem sich die Kamera anmeldet und in dessen (FTP-)Home-Verzeichnis sie ein Bild ablegt, sobald eine Bewegung erkannt wird. Das ist sicher der schwierigste Schritt der gesamten Konfiguration und eine genaue Erklärung würde hier zu weit führen. Ich bin sicher, mit ein wenig Recherche bekommt ihr das schon hin 🙂

Das iNotifyWait-Script

Etwas genauer möchte ich die Überwachung des Verzeichnisses erklären, denn hier passiert die eigentliche Arbeit.

Ich habe mir ein kleines Shell-Script geschrieben, dass das FTP-Verzeichnis überwacht und bei Änderungen die Pushmitteilung auslöst:

#!/bin/bash

# Define Logfile
LOGFILE=/var/log/detectWebcamMotion.log

# Define Folder to be monitored for changes
FOLDERWATCHED=~/webcamSnapshots

# log a message with timestamp
function log {
  echo "[`date  +%y/%m/%d-%H:%M:%S`] $1" | tee -a $LOGFILE
}

log "Starting inotitywait infinite loop"

# capture the output of inotifywait and put it into LINE 
inotifywait --format "%f %e"  -mre create $FOLDERWATCHED | while read LINE
do
  log "processing $LINE..."

  # disassemble the output und put filename and events into an array
  set -- "$LINE"
  IFS=" "; declare -a Array=($*)
  FILE="${Array[0]}"
  EVENT="${Array[1]}"

  # get the filename and the file extension from the array 
  FILENAME=${FILE%.*}
  FILEEXT=${FILE##*.}
  IFS=""

  # select by file extension
  case $FILEEXT in

  jpg)
    log "Send data via curl to Pushover and trigger a push notification"
    curl -s -F "token=zAf@JHqA4DkLF_:!UkSDWovGhmsCtAMA" -F "user=JX@bD8toT28iE9-rdhuUz7fNtNJ?Uzy7" -F "message=ALARM - Bewegung erkannt - ALARM" -F "device=iPhone" "https://api.pushover.net/1/messages.json"
  ;;

  *)
    log "nothing to do with $FILE"
  ;;
  esac
done

Solange dieses Script läuft, überwachen wir per inotifywait ob im Verzeichnis ~/webcamSnapshots ein File erzeugt wird. Das ganze machen wir rekursiv über alle Unterverzeichnisse, weil z.B. meine Kamera für jeden Snapshot eine Verzeichnisstrukutur mit Datum und Uhrzeit anlegt. Wird ein File erzeugt, schreibt inotifywait eine Zeile nach stdOut, die wir per Pipe in die Variable LINE umleiten. Diese Ausgabe nehmen wir noch Stück für Stück auseinander und prüfen, ob eine Datei mit der Endung .jpg erzeugt wurde. Nur dann schicken wir per curl die Anweisung an Pushover, uns eine Push-Nachricht zu senden.

Hier der curl-Aufruf in etwas leserlicher Form:

curl -s \
 -F "token=zAf@JHqA4DkLF_:!UkSDWovGhmsCtAMA" \
 -F "user=JX@bD8toT28iE9-rdhuUz7fNtNJ?Uzy7" \
 -F "message=ALARM - Bewegung erkannt - ALARM" \
 -F "device=iPhone" \
 https://api.pushover.net/1/messages.json > NUL

Wie man sieht, schicken wir die bei der Einrichtung von Pushover erhaltenen Daten für User, Applikation und Device an die JSON-Schnittstelle. Im Aufruf hier, leiten wir die Antwort ins Nichts (NUL) um.

Das Script als Dienst einrichten

Nun möchte man natürlich nicht bei jedem Systemstart daran denken müssen, das Script von Hand zu starten. Es gibt verschiedene Möglichkeiten, dies zu automatisieren. Eine wäre ein cron-Job, der nach dem Systemstart ausgeführt wird. Eine Andere – zumindest auf einem Debian-basierten System – ist ein systemd Service-Script. Ich habe mich für die zweite Möglichkeit entschieden, da ich die Überwachung an einen anderen Dienst gekoppelt habe.

Um das Script als Dienst zu starten, legt man ein File mit der Endung .service (z.B. detectWebcamMotion.service) in /etc/systemd/system/ mit folgendem Inhalt ab:

[Unit]
Description=Detect webcam motion by monitoring a directory
Wants=network-online.target
After=network-online.target

[Service]
User=serviceuser
Group=servicegroup
WorkingDirectory=/home/ftpuser/webcamSnapshots
ExecStart=/pfadZumScript/detectWebcamMotion.sh &
ExecStop=/bin/kill -SIGTERM $MAINPID
Restart=on-failure

[Install]
WantedBy=openhab2.service

Die Pfade und User muss man natürlich an die jeweiligen Gegebenheiten anpassen. Wie man sieht, sorgt die Definition dafür, dass der Server eine bestehende Netzwerkverbindung hat, da sonst der FTP-Server gar nicht erreichbar wäre. In meinem Fall startet der Dienst automatisch, wenn der openHAB2 Service ausgeführt wird.

Allerdings ist nach der Erstellung des Scripts noch die Aktivierung per

systemctl enable detectWebcamMotion

nötig. (Siehe auch die Doku zu systemd im Debian wiki).

Nochmal in Kurzform (TL;DR)

Die Kamera so einrichten, dass sie bei erkannter Bewegung ein Bild per FTP auf unserem Server ablegt. Dort überwachen wir mit iNotifywait das FTP-Verzeichnis auf neue Bilder und schicken per curl einen Aufruf an Pushover, das uns dann eine Pushnachricht auf unser Smartphone schickt. Eigentlich ganz einfach.

Fazit

Es ist auch ohne Cloud-Anbindung möglich eine Kamera zur Überwachung der eignen vier Wände einzusetzen. Reicht eine Pushmitteilung, ist der Aufwand sehr überschaubar. Das Einzige, was nach außen gelangt, ist der Aufruf des Push-Dienstes.

Durch den Einsatz eines beliebigen Skriptes kann man natürlich nicht nur Push-Nachrichten verschicken, sondern z.B. auch Licht einschalten, Emails verschicken, oder was man sonst noch so skripten kann. Den möglichen Szenarien sind fast keine Grenzen gesetzt.

{ 0 comments… add one }

Trackbacks

Leave a Comment

*