Aus Raspberry Pi Geek 10/2017

Nistkästen mit der Pi-Cam ins Internet bringen (Seite 4)

Das Skript geht davon aus, dass es im Stammverzeichnis den Ordner archiv gibt. Dorthin lädt das Programm das Bild, sobald die Bilderkennung eine Veränderung meldet.

Listing 9

 

<?php
// Vorbelegungen
$mode=0; //default, nur aktuelles Bild speichern
// mode = 1 Bild Kopieren
if(isset($_GET['mode'])) if ($_GET['mode']==1) $mode=1;
// Dateinamen auf dem Webserver
$target_file='meisencam.jpg'; // aktuelles Bild
$target_file_cont='archiv/meisencam'.date("ymd-His").'.jpg'; // Archivbild
// Bild hochladen
if(isset($_FILES['file']) && $_FILES['file']['size'] != 0){
        $target_dir = "";
        // Falls Bild so heißen soll wie das hochgeladene:
        // $target_file = $target_dir . basename($_FILES['file']['name']);
        // $target_file = $target_dir . $_FILES['file']['name']);
        if (move_uploaded_file($_FILES['file']['tmp_name'], $target_file)) {
        echo "Bild ". basename( $_FILES['file']['name']). " erfolgreich hochgeladen.";
        }
}
if ($mode==1) copy ($target_file,$target_file_cont);
// Loggen
$Logdatei='meisencam.log';
$IP=getenv("REMOTE_ADDR");
$Domain=gethostbyaddr($IP);
$var='nichts übertragen';
if (isset($_POST)) $var=implode("-",$_POST);
if (isset($_FILES['file'])) $var.='-'.$_FILES['file']['name'];
$Ausgabe=time().';'.$IP.';'.$Domain.';'.date("d.m.Y").';'.date("H:i:s").';'.$var."\r\n";
$fh=fopen($Logdatei,"a");
fwrite($fh,$Ausgabe);
fclose($fh);
?>

Sobald Sie das PHP-Skript auf den Webserver gespielt und den Aufruf im Python-Skript entsprechend angepasst haben, bietet es sich an, die Aufnahme- und Upload-Funktion mit dem Aufruf von ./meisencam.py zu testen. Das Ergebnis prüfen Sie mit einem FTP-Programm oder mit einem Aufruf im Browser, in dem Sie in die Adresszeile den Pfad zum Verzeichnis des Skripts eingeben, gefolgt von /meisencam.jpg.

Im nächsten Schritt kopieren Sie das Programm zur Anzeige des Bilds auf den Webserver. Die recht umfangreiche HTML-Datei dazu mit einigen Javascript-Befehlen finden Sie auf der Heft-DVD als anzeigeseite.html. In den ebenfalls auf der Heft-DVD befindlichen Dateien navigator.html und navigator.php liegen die Skripte, mit denen Sie die Archivbilder in einer Art Mini-Galerie ansehen können. Spielen Sie beide in das Unterverzeichnis Archiv/ADM/ auf dem Webserver ein.

Temperaturmessung

Die Temperaturmessung erfolgt mit einem preiswerten Temperatursensor DS1820, der gleich eine serielle Schnittstelle mitbringt. Sie schließen ihn wie in Abbildung 4 gezeigt an den GPIO des Raspberry Pi an. Danach fügen Sie in der Konfigurationsdatei /boot/config.txt folgende Zeile hinzu:

dtoverlay=w1-gpio,gpiopin=4

Anschließend starten Sie das System neu. Nun wechseln Sie ins Verzeichnis /sys/bus/w1/devices/ und geben den Befehl dir ein, um eine Übersicht über den oder die Temperatursensoren zu bekommen (Listing 10, Zeile 2). Es sollte so viele Ordner geben, wie Sie Temperatursensoren angeschlossen haben, dazu noch den Eintrag w1_bus_master1. In den Ordnern mit den Zahlenkolonnen stehen die Messwerte der Temperatursensoren. Die Daten lassen sich manuell auslesen (Zeile 6), die Temperaturen sind in Tausendstel Grad Celsius angegeben.

Listing 10

 

$ cd /sys/bus/w1/devices
$ dir
28-0000074b2995
28-0000074b2e47
w1_bus_master1
$ cat 28-0000074b2e47/w1_slave
aa 00 4b 46 7f ff 06 10 b9 : crc=b9 YES
aa 00 4b 46 7f ff 06 10 b9 t=10625

Mit einem kleinen Python-Skript automatisieren Sie nun das Auslesen der Temperatur. Dazu erzeugen Sie im Programmordner die Datei temptest.py und fügen dort den Inhalt von Listing 11 ein. Passen Sie dabei die Adresse des Temperatursensors an. Dann machen Sie die Datei mit chmod +x temptest.py ausführbar und testen das Programm mit dem Aufruf ./temptest.py.

Listing 11

 

#!/usr/bin/python
tempfile = open("/sys/bus/w1/devices/28-0000074b2e47/w1_slave")
inhalt = tempfile.read()
tempfile.close()
tempdata = inhalt.split("\n")[1].split(" ")[9]
temperatur = float(tempdata[2:])
temperatur = temperatur/1000print "Temperatur betraegt: " + str(temperatur) + " Grad"

Auf der Heft-DVD finden Sie in der Datei temperatur.py ein Python-Skript, mit dem Sie die Temperatursensoren auslesen und die Daten an einen Webservice übertragen. Dort liegt auch das Skript für den zugehörigen Webservice temperaturloggerWS.php, der die Temperaturdaten entgegennimmt und in einer CSV-Datei speichert, sowie der PHP-Webservice für die Anzeige der aktuellen Temperaturen gettemperaturWS.php. Letzterer kommuniziert mit dem Javascript-Programm der Anzeigeseite und liefert die aktuellen Temperaturen aus der CSV-Datei aus.

Spielen Sie die beiden PHP-Skripte von der Heft-DVD auf den Webserver. Rufen Sie danach das Python-Skript temperatur.py von Hand auf, sollte das System die Temperaturdaten an den Webserver übertragen und die Anzeigeseite die aktuellen Temperaturen auflisten.

Automatisierung

Bislang müssen Sie die Skripte für die Bildaufnahme und die Temperaturmessung noch manuell aufrufen. Spannend wird der Raspberry-Nistkasten aber erst, wenn die Prozesse automatisch ablaufen. Zur Automatisierung kommt der Cron-Dienst zum Einsatz, der die einzelnen Skripte in definierten Intervallen aufruft – zum Beispiel alle 5 Sekunden das Programm für die Bildaufnahme und jede Minute das Skript für die Temperaturmessung.

Das kürzeste Zeitintervall von Cron liegt normalerweise bei einer Minute: Mit einem kleinen Trick, indem Sie denselben Prozess mehrfach, aber mit einer fünfsekündigen Verzögerung aufrufen, gelingen mit Cron jedoch auch Aufruffrequenzen unter einer Minute. Für die Aufnahmen der Bilder legen Sie daher eine Cron-Tabelle mit zwölf Einträgen an, die alle zur selben Minute starten, die Sie jedoch mit sleep Sekunden um ein paar Sekunden verzögern.

Der zyklische Aufruf des Skripts durch Cron hat sich in vielen Experimenten als stabilere Lösung erwiesen als etwa eine zeitgesteuerte Endlosschleife direkt im Python-Skript. Erzeugen Sie also die Steuerung über Cron mittels crontab -e und tragen Sie die Zeilen aus Listing 12 ein. Der Ausdruck >/dev/null 2>&1 am Ende sorgt jeweils dafür, dass kein Log geschrieben wird, und entlastet so die SD-Karte.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 9 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben