Pi-Kamera mit Meldern aus homematic verbinden

Hat man eine Hausautomatisierung und externe Hardware, welche beispielsweise Kameraaufnahmen macht, möchte man vielleicht beide Systeme verbinden. Ist die Hausinstallation auf Basis FHEM und die externe Hardware auf Basis eines Raspberry Pi, dann kann man wie in diesem Artikel vorgehen.

Wie eine Überwachung mittels Pi-Cam und motion-Paket geht, haben wir ja im letzten Code-Schnipsel gezeigt. Jetzt soll der Pi nach wie vor als Aufnahmegerät dienen, getriggert wird das Ganze aber nun durch einen homematic-Bewegungsmelder. Nehmen wir an, Softwarebasis und Firmware des Kleinrechners sind aktuell und es steht die Pi-Kamera zur Verfügung, dann müssen wir uns darum nicht mehr kümmern.

Also zuerst zur FHEM-Software. Die einfachste Art der Verbindung ist eine Dateischnittstelle. Also legen wir uns eine Subroutine (Perl) im Modul 99_myUtils.pm an, welche bei Aufruf ein Kennzeichen „B“ in die Übergabedatei (hier: beweglog.txt auf dem Server, wo FHEM läuft) schreibt.

sub
beweglog
{
  my $text = „B“;
  my $status = system(„echo ‚$text‘ > /home/pi/scripts/beweglog.txt“);
}

Jetzt muss festgelegt werden, unter welchen Umständen geschrieben werden soll. Nämlich dann, wenn am Bewegungsmelder eine Bewegung erkannt wird:

define Bewegungsmelder_Aussen_move notify Bewegungsmelder_Aussen:motion {\
  {beweglog()}\
}

Wie zu sehen, heißt unser Melder „Bewegungsmelder_Aussen“ und dazu haben wir nun das Skript „Bewegungsmelder_Aussen_move“ kreiert, was bei einem „notify“ (erkannte Bewegung) unser Perl-Modul „beweglog“ aufruft.

Es liegt nun eine Datei beweglog.txt auf /home/pi/scripts/ des Hausservers vor, welche nichts weiter als eine Textzeile mit dem String „B“ enthält. Diese soll vom Kamera-Raspi kontrolliert werden und sollte sich der entsprechende String darin befinden, soll der Pi eine Aufnahme auslösen. Dazu widmen wir uns nun dem Raspi und legen dort ein Skript ab, welches genau das tut:

scp pi@homeserver:/home/pi/scripts/beweglog.txt /home/cam/scripts
for i in $(cat /home/pi/scripts/beweglog.txt); do
  if [[ $(echo $i) = „B“ ]]; then
    timestamp=$(date +“%Y-%m-%d-%H-%M“)
    raspistill -o /home/cam/images/$timestamp.jpg -w 800 -h 600
    scp /home/cam/images/$timestamp.jpg pi@homeserver:/mnt/disk1/temp
    echo „K“ > /home/pi/scripts/beweglog.txt
  fi
done
scp /home/cam/scripts/beweglog.txt pi@homeserver:/home/pi/scripts/

sleep 6
scp pi@homeserver:/home/pi/scripts/beweglog.txt /home/cam/scripts

Zuerst wird mittels scp vom entfernten Hausserver die Übergabedatei auf den Raspi geholt (dessen Zielverzeichnis /home/cam/scripts/ heißt). Danach sucht das Bashskript nach einer Textzeile mit „B“. Wenn gefunden, wird die Kameraaufnahme mittels raspistill ausgelöst und danach der Zustand auf „Keine Bewegung“ zurückgesetzt, in dem in das Dateilog ein „K“ geschrieben wird. Unsere Überwachungsbilder werden im Script oben ebenfalls noch übertragen und liegen wieder auf dem Server unter /mnt/disk1/temp. Dort kann man sie dann weiter auswerten und (da freigegebenes Verzeichnis) auch von einem Client-PC aus dem Netzwerk heraus anschauen.

Anschließend wird die Datei noch auf den Server zurückgespielt, damit bei der nächsten Überprüfung auch der neutrale Zustand anliegt, solange wie dieser nicht durch den Bewegungssensor in FHEM bei einer neuen Bewegung wieder nach „B“ gewandelt wird…

Danach bedienen wir uns einer etwas unkonventionellen Methode, da wir unser gerade geschaffenes Skript read_beweglog.sh mit einem crontab-Eintrag aufrufen wollen. Da dieser im Minimum jede Minute stattfinden kann, wiederholen wir unsere Abfrage nach einer kurzen Wartezeit von 6 Sekunden jeweils weitere 3 Mal. Somit können wir zeitnah auf erkannte Bewegungen reagieren. Der entsprechende Eintrag in der lokalen Crontab sieht dann so aus:

*/1 * * * * /home/cam/scripts/read_beweglog.sh

Mehr braucht es an dieser Stelle nicht, denn es geht nur um eine zeitnahe Aufnahme. Durch den Melder erkannte Bewegungen gehen nicht verloren, da der Bewegungsmelder eine deutliche höhere Karenzzeit hat, bis er für eine nächste Erkennung bereit ist.

Zum Schluss noch eine weitere Voraussetzung. Damit Secure-Copy mittels scp ohne Passwort-Eingabe zwischen zwei Netzwerkrechnern funktioniert (bei uns der Hausserver mit FHEM und Bewegungsmelder und der Raspberry-Pi mit der Kamera) muss noch ein keygen (RSA- oder DSA-Schlüsselpaar erzeugen) und Schlüsselaustausch des Public-Key stattfinden. Zwischen den sich dann vertrauenden Rechnern kann man scp und ssh ohne Passworteingabe nutzen. Dazu dann in einem späteren Codeschnipsel…

Swen Hopfe

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.