So nachdem sich jetzt die Hardware materialisiert hat kommt jetzt der mehr spirituelle Teil, die Installation und Konfiguration der Software für die Nistkasten-Kamera.

Die Basisinstallation:

Als erstes muss ein aktuelles Raspbian installiert werden. Dazu lädt man von der offiziellen Webside unter http://www.raspberrypi.org/downloads ein aktuelles Raspbian Image herunter und speichert es auf dem PC. Beim Erstellen dieser Seite wurde der Raspbian-Release vom 2015-02-16 verwendet.

Danach wird dieses Image entpackt und mit dem "Win32 Disk Imager" auf eine mindestens 4GB große SD-Karte geschrieben. Da auch die Bilder/Filme direkt auf der SD-Karte gespeichert werden, wird mindestens eine 8 oder 16GB große Karte empfohlen!. 

Jetzt wird die programmierte SD-Karte in den RaspberryPi gesteckt und der RaspberryPi über den Ethernet-Anschluss mit dem Netzwerk verbunden. Zusätzlich kann auch eine Tastatur/Mouse über USB und ein Monitor über den HDMI-Ausgang angeschlossen werden. Notwendig ist dies aber nicht, da die gesamte Konfiguration über eine SSH-Verbindung mit Putty erfolgt. Jetzt kann der RaspberryPi eingeschaltet werden. Direkt nach dem Einschalten sollte die rote LED (PWR) auf dem RasperryPi leuchten und die grüne LED (ACT) flackern/blinken, dann ist erst alles okay.

Jetzt muss man die IP-Nr, herausfinden, die dem RaspberryPi per DHCP vom Router im Netzwerk zugewiesen bekommen hat. Dazu loggt man sich bei seinem Router ein, sucht dort nach der IP-Nummer des Raspberry Pi und schreibt sich die IP-Nummer auf. Danach kann baut man mit Putty eine Verbindung per SSH zu der IP-Nummer auf.  Hinweis: In Putty->Window->Translation den Zeichensatz am besten auf "UTF-8" umstellen. Das Default-Login auf dem RaspberryPi lautet: pi und das Default Passwort: raspberry .

Die Konfiguration des RaspberryPi wird mit dem Befehl "sudo raspi-config" gestartet. Als erstes wird mit dem Kommando "Expand Filesystem" das Filesystem auf die Größe der SD-Karte angepasst. Da die Anpassung des Filesystems erst beim nächsten Reboot ausgeführt wird, sollte das Konfigurationsprogramm jetzt beendet werden und die Frage nach dem Reboot mit "Yes" beantwortet werden.

Nach dem Neustart wird die Konfiguration mit  "sudo raspi-config" fortgesetzt. Dabei wird als erstes ein neues Passwort für die Anmeldung des Default users unter dem Menüpunkt "2. Change User Password" gesetzt.  Im nächsten Schritt werden die Sprach und Regionalen Einstellungen unter "4. International Options" durchgeführt. Dort sollte man auf alle Fälle die Zeitzonen einstellung unter "Change Timezone" auf Europe->Berlin stellen. Wichtig ist auch unter "5. Enable Camera", dass der Kamera Support mit Enable eingeschaltet wird. Wenn man mehrere RaspberryPi in seinem Netzwerk verwalten will ist es außerdem sinnvoll unter "9. Advanced Options -> A2 Hostname" einen neuen Hostname für den Nistkasten RaspberryPi zu vergeben.

Wlan-Konfiguration

Nachdem man den WLAN-Stick an den RaspberryPi angeschlossen hat, sollte der Stick direkt erkannt werden. Um dies zu überprüfen kann man mit dem Befehl

dmesg

das aktuelle Log-File einsehen.

DMESG-Log

Dort sollte gegen Ende des Logs der erkannte WLAN-Stick und welcher Treiber automatisch geladen wurde angezeigt werden.

Mit dem Befehl

ifconfig

kann man kontrollieren, ob ein neues Netzwerk-Device für den Wlan-Stick angelegt wurde. Im allgemeinen ist das das wlan0-Device. Wenn bis dahin alles geklappt hat, kann jetzt die Wlan0-Schnittstelle konfiguriert werden. Bei der folgenden Konfiguration wird der Wlan0-Schnittstelle eine statische IP-Nummer und Gateway (Internet-Router) aus dem lokalen Netz zugeordnet.

Die Konfiguration der Netzwerkschnittstellen ist in der Datei /etc/network/interfaces gespeichert. Mit dem Aufruf

sudo nano /etc/network/interfaces

wird die Datei im Nano-Editor geöffnet.

Dort müssen folgende Einstellungen vorgenommen werden:

auto lo
iface lo inet loopback
iface eth0 inet dhcp
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.xxx.xxx -- Eine freie IP aus ihren Netz eintragen
netmask 255.255.255.0
gateway 192.168.xxx.xxx -- IP ihres Routers
wpa-ap-scan 1
wpa-scan-ssid 1
wpa-ssid "Ihr WLAN-Name"
wpa-psk "Ihr WLAN-Passwort"
wireless-power off


Anschießend die Änderungen speichern und den Raspberry neu starten durch die Eingabe von:

sudo reboot

 

Installation der Webcam-Software

Vor der Installation der Webcam-Software werden alle Softwarepakete mit den folgenden Befehlen auf den neusten Stand gebracht:

sudo apt-get update
sudo apt-get dist-upgrade
sudo rpi-update
sudo reboot


Als Webcam-Software kommt das RPi-Cam-Web-Interface in der Version 5.1.3 zum Einsatz, das von Silvan Melchior entwickelt wurde. Zur Installation des Paket wird das Installationsscript mit Git auf den RaspberryPi gecloned und dann das Installationsscript gestartet.

git clone https://github.com/silvanmelchior/RPi_Cam_Web_Interface.git
cd RPi_Cam_Web_Interface
chmod u+x RPi_Cam_Web_Interface_Installer.sh
./RPi_Cam_Web_Interface_Installer.sh install


Bei der Installation ist bei mir die Fehlermeldung "cp: cannot stat `/etc/raspimjpeg': No such file or directory" aufgetreten, scheinbar ist dies aber kein Problem. Nach einem Reboot mit "sudo reboot" kann man auf die Webcam unter der IP-Nr über den Webbrowser zugreifen. Das Ergebnis sollte dann in etwa so aussehen.

RPi Cam Control

Was jetzt bei der Webcam noch stört ist die LED auf dem Kamera-Modul, die die ganze Zeit aktiv ist. Die LED kann man aber in der Konfiguration dauerhaft abschalten. Dazu sind folgende Schriite notwendig:

cd /boot
sudo nano config.txt
An Ende einfügen: disable_camera_led=1 und speichern.
sudo reboot


Damit ist die Installation der Webcam-Software abgeschlossen.

"Status-LED" ansteuern und Shutdown-Kontakt auswerten

Im Verzeichnis "/home/pi" das Script „shutdown.py“ anlegen durch:

cd /home/pi
nano shutdown.py


Im Editor das folgende Script eintragen:

shutdown.py
    1. #!/usr/bin/python
    2. # Datei /home/pi/shutdown.py
    3. import os, sys, time, RPi.GPIO as gpio
    4.  
    5. gpio.setmode(gpio.BCM)   # Port-Nummern des Prozessors verwenden
    6. gpio.setwarnings(False)
    7. gpio.setup(9, gpio.IN)   # GPIO09 = Pin 21 ist mit Reset-Button verbunden
    8. gpio.setup(8,gpio.OUT)   # GPIO08 = Pin 24 ist mit der LED verbunden
    9.  
    10. toggle = True
    11.  
    12. while 1:
    13.   if gpio.input(9)==gpio.LOW:
    14.     os.system("halt")
    15.     sys.exit()
    16.  
    17.   if toggle == True:
    18.     toggle = False
    19.     gpio.output(8,gpio.HIGH)
    20.   else:
    21.     toggle = True
    22.     gpio.output(8, gpio.LOW)
    23.   time.sleep(0.3)


Nach dem Speichern muss das Script noch ausführbar gemacht werden:

chmod a+x shutdown.py


Das Skript kann direkt gestartet werden mit:

sudo ./shutdown.py


Die Status-Led sollte jetzt blinken. Wenn man jetzt mit einem Magneten in die Nähe des Reed-Kontaktes Sx kommt sollte sich der Raspberry Pi herunterfahren und stoppen.

Um das Skript als Hintergrund-Process beim Booten zu starten muss es in die rc.local eingetragen werden

sudo nano /etc/rc.local


Am Ende der Datei vor "exit 0" die folgende Zeile einfügen und speichern:

/home/pi/shutdown.py &


Einbinden der Temperatursensoren

Seit Raspbian den 3.18-Kernel verwendet muss zu erst die 1-Wire-Schnittstelle im DeviceTree aktiviert werden. Dazu muss in der Datei "boot/config.txt" eine Zeile hinzugefügt werden:

sudo nano /boot/config.txt
dtoverlay=w1-gpio,gpiopin=4,pullup=on


Damit die Änderungen an der Konfiguration übernommen werden muss der RaspberryPi einmal neu gestartet werden, also ein "sudo reboot" durchgeführt werden.

Dann müssen die 1Wire-Treiber und der Treiber für den Temperatursensor geladen werden:

sudo modprobe w1-gpio pullup=1
sudo modprobe w1-therm


Weil die 1-Wire-Sensoren direkt in das Pfadsystem eingebunden werden, kann man sehr leicht überprüfen, ob sie korrekt eingebunden sind.

Pfad der 1-Wire Sensoren auswählen mit:

cd /sys/bus/w1/devices


Anzeige der gefundenen Sensoren mit:

ls


Es sollten drei Verzeichnisse angezeigt werden, zwei 28-???????? und ein w1_bus_master-Verzeichnis. Bei den 28-????????-Verzeichnissen handelt es sich direkt um die beiden Temperatursensoren. Der Name der Verzeichnisse leitet sich direkt aus der Bausteinkennung und der einmaligen Baustein-ID ab.

Die Temperatur eines Sensors anzuzeigen:

cd 28-??????
cat w1_slave

->81 01 4b 46 7f ff 0f 10 71 : crc=71 YES
->81 01 4b 46 7f ff 0f 10 71 t=24062


Die Temperatur ist t in 1/100 °C kodiert. (Die Genauigkeit des Sensors liegt nur bei +/-0.5°C. Die vielen Nachkommastellen sind also nur Show!)

Um die Module automatisch beim nächsten Systemstart zu laden müssen in der "/etc/modules"-Datei die folgenden Zeilen ergängt werden

sudo nano /etc/modules
w1-gpio
w1-therm
 

Nach dem die Datei gespeichert wurde, kann der Raspberry Pi neu gestartet werden.

Temperatur loggen:

Um die Temperaturwerte mitzuloggen gibt es mindestens eine halbes dutzend Wege. Eine relative einfache Variante ist es die Daten mit Hilfe des Round Robin Datenbank Tools (RRDtool) abzulegen. Bei dieser einfachen Datenbank werden die Daten direkt in ein vorher angelegtes File geschrieben.

Die Installation der RRDTools Datenbank und eines Python-Interfaces dafür erfolgt durch:

sudo apt-get install rrdtool python-rrdtool
 

Alle Daten & Scripte die für die Temperaturaufzeichnung benötigt werden sollen in den Unterverzeichnis "temperature" liegen. Das Verzeichnis wird angelegt durch:

cd /home/pi
mkdir temperature
cd temperature
 

Als nächstes wird das Datenbank-File angelegt und die Struktur initialisiert. Dies erfolgt mit dem Befehl:

rrdtool create temperature.rrd --step 300
DS:temp_inside:GAUGE:3600:-40:80
DS:temp_outside:GAUGE:3600:-40:80
RRA:AVERAGE:0.5:1:2880
RRA:MIN:0.5:288:3600
RRA:MAX:0.5:288:3600
RRA:AVERAGE:0.5:288:3600
 

Mit dem Ausführen des oberen Befehls wird eine Datenbank mit dem Filenamen "temperature.rrd" angelegt. In dieser Datenbank werden die Werte von den zwei Temperatursensoren "temp_inside" & "temp_outside"  in je 3600 Datensätzen gespeichert. Das Speichern der Werte erfolgt in 300 Sekunden Schritten (=alle 5min). Nach 2880 Messwerten (= 10 Tagen) erfolgt eine Reduzierung des Datensatzes auf den Min-, Max- und Average-Wert, der jeweils aus 288 Einzelwerten (= 1Tag) gebildet wird.

Das Einlesen der Temperaturwerte erfolgt durch ein Python-Script, das ich auf der Seite von Martin Kompf gefunden habe, bei dem nur noch die Seriennummern der Sensoren angepasst werden müssen:

gettemp.py
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import re, os, rrdtool, time
  5.  
  6. # function: read and parse sensor data file
  7. def read_sensor(path):
  8.   value = "U"
  9.   try:
  10.     f = open(path, "r")
  11.     line = f.readline()
  12. if re.match(r"([0-9a-f]{2} ){9}: crc=[0-9a-f]{2} YES", line):
  13. line = f.readline()
  14. m = re.match(r"([0-9a-f]{2} ){9}t=([+-]?[0-9]+)", line)
  15.       if m:
  16.         value = str(float(m.group(2)) / 1000.0)
  17.     f.close()
  18.   except (IOError), e:
  19.     print time.strftime("%x %X"), "Error reading", path, ": ", e
  20.   return value
  21.  
  22. # define pathes to 1-wire sensor data -> must be adapted to your device id's
  23. pathes = (
  24.   "/sys/bus/w1/devices/28-000005309ace/w1_slave",
  25.   "/sys/bus/w1/devices/28-000005312211/w1_slave"
  26. )
  27.  
  28. # read sensor data
  29. data = 'N'
  30. for path in pathes:
  31.   data += ':'
  32.   data += read_sensor(path)
  33.   time.sleep(1)
  34.  
  35. # insert data into round-robin-database
  36. rrdtool.update(
  37.   "%s/temperature.rrd" % (os.path.dirname(os.path.abspath(__file__))),
  38.   data)

Bevor das Skript gestartet werden kann muss es noch als ausführbare Datei markiert werden:

chmod +x gettemp.py

Um das Skript alle 5 Minuten automatisch zu starten wird der Cron Dämon benutzt. Um dort einen neuen Job einzutragen fügt man nach dem Aufruf von "crontab -e" die folgende Zeile hinzu:

*/5 * * * * $HOME/temperature/gettemp.py >> $HOME/temperature/gettemp.log 2>&1

So jetzt sammelt der Pi fleissig alle 5 Minuten die Temperaturdaten. Was jetzt noch fehlt ist die Visalisierung der Messergebnisse und die Einbindung in die Webseite. Dazu wird im Webserver-Verzeichnis ein neues Verzeichnis mit dem Namen "temperature" angelegt, in dem später die Temperaturgraphen abgelegt werden.

sudo mkdir /var/www/temperature
sudo chmod a+r /var/www/temperature

Die Erzeugung der Graphen mit den Temperaturmesswerten erfolgt über zwei Shell-Scripte, die wiederum zeitgesteuert über Cron-Jobs aufgerufen werden. Das Skript zur Erzeugung des Tages-Graphen "temp_day.sh" wird alle 5 Minuten aufgerufen, während die Graphen für die Wochen- / Monats- und Jahresverlauf mit dem Skript "temp_wmy.sh" nur einmal täglich zur Geisterstunde aktualisiert werden.

temp_day.sh
  1. #!/bin/sh
  2.  
  3. # Grafik erstellen
  4. rrdtool graph /var/www/temperature/TemperaturDay.png \
  5. -s 'now - 1 day' -e 'now' -w 640 -h 400 \
  6. DEF:temp0=/home/pi/temperature/temperature.rrd:temp_inside:AVERAGE \
  7. LINE2:temp0#00FF00:Innen \
  8. DEF:temp1=/home/pi/temperature/temperature.rrd:temp_outside:AVERAGE \
  9. VDEF:temp1max=temp1,MAXIMUM \
  10. VDEF:temp1avg=temp1,AVERAGE \
  11. VDEF:temp1min=temp1,MINIMUM \
  12. LINE2:temp1#0000FF:Außen \
  13. "GPRINT:temp1max:%.1lf °C" \
  14. "GPRINT:temp1avg:%.1lf °C" \
  15. "GPRINT:temp1min:%.1lf °C"


temp_day.sh
  1. #!/bin/sh
  2.  
  3. # Grafik erstellen Year
  4. rrdtool graph /var/www/temperature/TemperaturYear.png \
  5. -s 'now - 1 year' -e 'now' -w 640 -h 400 \
  6. DEF:temp1=/home/pi/temperature/temperature.rrd:temp_inside:AVERAGE \
  7. DEF:temp0av=/home/pi/temperature/temperature.rrd:temp_outside:AVERAGE \
  8. LINE2:temp0av#0000FF:Außen \
  9. LINE2:temp1#00FF00:Innen \
  10.  
  11. # Grafik erstellen Month
  12. rrdtool graph /var/www/temperature/TemperaturMonth.png \
  13. -s 'now - 1 month' -e 'now' -w 640 -h 400 \
  14. DEF:temp1=/home/pi/temperature/temperature.rrd:temp_inside:AVERAGE \
  15. DEF:temp0av=/home/pi/temperature/temperature.rrd:temp_outside:AVERAGE \
  16. LINE2:temp0av#0000FF:Außen \
  17. LINE2:temp1#00FF00:Innen \
  18.  
  19. # Grafik erstellen Week
  20. rrdtool graph /var/www/temperature/TemperaturWeek.png \
  21. -s 'now - 1 week' -e 'now' -w 640 -h 400 \
  22. DEF:temp1=/home/pi/temperature/temperature.rrd:temp_inside:AVERAGE \
  23. DEF:temp0av=/home/pi/temperature/temperature.rrd:temp_outside:AVERAGE \
  24. LINE2:temp0av#0000FF:Außen \
  25. LINE2:temp1#00FF00:Innen \


Diese beiden Skripte werden im Unterverzeichnis /home/pi/temperature gespeichert und danach mit chmod als ausführbar gekennzeichnet.

chmod +x temp_day.sh
chmod +x temp_wmy.sh

Um die beiden Skripte zeitgesteuert auszuführen müssen jetzt noch zwei Jobs in der Crontab getragen werden. Dazu fügt man nach dem Aufruf von "crontab -e" die folgenden Zeilen hinzu:

*/5 * * * * sudo $HOME/temperature/temp_day.sh >&1
0 0 * * * sudo $HOME/temperature/temp_wmy.sh >&1


Das Ergebnis der Skripte liegt dann im /var/www/temperature-Verzeichnis und sieht in etwa so aus:

Temperatur Graph Tag  

Um die Graphen zugänglich zu machen  wird im Unterverzeichnis /var/www noch eine Webseite mit dem Namen "temperatur.php" angelegt:

sudo nano /var/www/temperatur.php
 
temperatur.php
  1. <?php
  2. //HIER ID ANPASSEN!!!!
  3. $file = '/sys/bus/w1/devices/28-000005309ace/w1_slave';
  4. $lines = file($file);
  5. $temp = explode('=', $lines[1]);
  6. $temp_inside = number_format($temp[1] / 1000, 1, ',', '');
  7. $file = '/sys/bus/w1/devices/28-000005312211//w1_slave';
  8. $lines = file($file);
  9. $temp = explode('=', $lines[1]);
  10. $temp_outside = number_format($temp[1] / 1000, 1, ',', '');
  11. ?>
  12. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  13. <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  14. <head>
  15. <title>http://Nistkasten Temperatur Auswertungen</title>
  16. </head>
  17. <body>
  18. <center>
  19. <div align="center">
  20. <h2>Aktuell</h2>
  21. <p><b>Innen:
  22. <?=$temp_inside?> &deg; C <br>
  23. Au&szlig;en:
  24. <?=$temp_outside?> &deg;C<br>
  25. </b></p>
  26. <div align=center">
  27. <h2>Tagesverlauf</h2>
  28. <div>
  29. <img src="temperature/TemperaturDay.png" alt="Tagesverlauf" />
  30. </div>
  31. <h2>Wochenverlauf</h2>
  32. <div>
  33. <img src="temperature/TemperaturWeek.png" alt="Wochenverlauf" />
  34. </div>
  35. <h2>Monatsverlauf</h2>
  36. <div>
  37. <img src="temperature/TemperaturMonth.png" alt="Monatsverlauf" />
  38. </div>
  39. <h2>Jahresverlauf</h2>
  40. <div>
  41. <img src="temperature/TemperaturYear.png" alt="Jahresverlauf" />
  42. </div>
  43. </div>
  44. </center>
  45. </body>
  46. </html>

Um diese Webseite jetzt auch von der Hauptseite der Nistkasten-Kamera aus zu erreichen fehlt jetzt nur noch eine kleiner Knopf auf der Seite. Bei der aktuellen Version 5.1.3 des RPi-Cam-Web-Interface erreicht man dies z.B. in dem "index.php"-file in der Div-Section "secondary-buttons" die lila eingefärbten Zeilen mit "sudo nano index.php" einfügt:

Ausschnitt aus index.php
  1.  
  2. <div id="secondary-buttons" class="container-fluid text-center" <?php echo $displayStyle; ?> >
  3.          <?php  if (file_exists("pipan_on")) pipan_controls(); ?>
  4.          <a href="temperatur.php" class="btn btn-default">Temperatur</a>
  5.          &nbsp; &nbsp;
  6.          <a href="preview.php" class="btn btn-default">Download Videos and Images</a>
  7.          &nbsp;&nbsp;
  8.          <a href="motion.php" class="btn btn-default">Edit motion settings</a>
  9.          &nbsp;&nbsp;
  10.  

Nach dem Speichern der "index.php" sollte die Knopfleiste im Browser so aussehen:


So das war's schon... Ist doch alles gar nicht so kompliziert, wenn es erstmal läuft.
 
 
 
Das Endergebnis und ein paar Filme aus dem Nistkasten
 
Zurück zur Beschaltung des Raspberry Pi in Nistkastens
 
Zurück zum Zusammenbau des Nistkastens
 
 Zurück zur Projektbeschreibung