Software

Basisinstallation

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.

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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/python
# Datei /home/pi/shutdown.py
import os, sys, time, RPi.GPIO as gpio
 
gpio.setmode(gpio.BCM)   # Port-Nummern des Prozessors verwenden
gpio.setwarnings(False)
gpio.setup(9, gpio.IN)   # GPIO09 = Pin 21 ist mit Reset-Button verbunden
gpio.setup(8,gpio.OUT)   # GPIO08 = Pin 24 ist mit der LED verbunden
 
toggle = True
 
while 1:
  if gpio.input(9)==gpio.LOW:
	os.system("halt")
	sys.exit()
 
  if toggle == True:
	toggle = False
	gpio.output(8,gpio.HIGH)
  else:
	toggle = True
	gpio.output(8, gpio.LOW)
  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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import re, os, rrdtool, time
 
# function: read and parse sensor data file
def read_sensor(path):
  value = "U"
  try:
	f = open(path, "r")
	line = f.readline()
if re.match(r"([0-9a-f]2 )9: crc=[0-9a-f]2 YES", line):
line = f.readline()
m = re.match(r"([0-9a-f]2 )9t=([+-]?[0-9]+)", line)
	  if m:
		value = str(float(m.group(2)) / 1000.0)
	f.close()
  except (IOError), e:
	print time.strftime("%x %X"), "Error reading", path, ": ", e
  return value
 
# define pathes to 1-wire sensor data -> must be adapted to your device id's
pathes = (
  "/sys/bus/w1/devices/28-000005309ace/w1_slave",
  "/sys/bus/w1/devices/28-000005312211/w1_slave"
)
 
# read sensor data
data = 'N'
for path in pathes:
  data += ':'
  data += read_sensor(path)
  time.sleep(1)
 
# insert data into round-robin-database
rrdtool.update(
  "%s/temperature.rrd" % (os.path.dirname(os.path.abspath(__file__))),
  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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/sh
 
# Grafik erstellen
rrdtool graph /var/www/temperature/TemperaturDay.png \
-s 'now - 1 day' -e 'now' -w 640 -h 400 \
DEF:temp0=/home/pi/temperature/temperature.rrd:temp_inside:AVERAGE \
LINE2:temp0#00FF00:Innen \
DEF:temp1=/home/pi/temperature/temperature.rrd:temp_outside:AVERAGE \
VDEF:temp1max=temp1,MAXIMUM \
VDEF:temp1avg=temp1,AVERAGE \
VDEF:temp1min=temp1,MINIMUM \
LINE2:temp1#0000FF:Außen \
"GPRINT:temp1max:%.1lf °C" \
"GPRINT:temp1avg:%.1lf °C" \
"GPRINT:temp1min:%.1lf °C"
 


temp_day.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/sh
 
# Grafik erstellen Year
rrdtool graph /var/www/temperature/TemperaturYear.png \
-s 'now - 1 year' -e 'now' -w 640 -h 400 \
DEF:temp1=/home/pi/temperature/temperature.rrd:temp_inside:AVERAGE \
DEF:temp0av=/home/pi/temperature/temperature.rrd:temp_outside:AVERAGE \
LINE2:temp0av#0000FF:Außen \
LINE2:temp1#00FF00:Innen \
 
# Grafik erstellen Month
rrdtool graph /var/www/temperature/TemperaturMonth.png \
-s 'now - 1 month' -e 'now' -w 640 -h 400 \
DEF:temp1=/home/pi/temperature/temperature.rrd:temp_inside:AVERAGE \
DEF:temp0av=/home/pi/temperature/temperature.rrd:temp_outside:AVERAGE \
LINE2:temp0av#0000FF:Außen \
LINE2:temp1#00FF00:Innen \
 
# Grafik erstellen Week
rrdtool graph /var/www/temperature/TemperaturWeek.png \
-s 'now - 1 week' -e 'now' -w 640 -h 400 \
DEF:temp1=/home/pi/temperature/temperature.rrd:temp_inside:AVERAGE \
DEF:temp0av=/home/pi/temperature/temperature.rrd:temp_outside:AVERAGE \
LINE2:temp0av#0000FF:Außen \
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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
//HIER ID ANPASSEN!!!!
$file = '/sys/bus/w1/devices/28-000005309ace/w1_slave';
$lines = file($file);
$temp = explode('=', $lines[1]);
$temp_inside = number_format($temp[1] / 1000, 1, ',', '');
$file = '/sys/bus/w1/devices/28-000005312211//w1_slave';
$lines = file($file);
$temp = explode('=', $lines[1]);
$temp_outside = number_format($temp[1] / 1000, 1, ',', '');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>http://Nistkasten Temperatur Auswertungen</title>
</head>
<body>
<center>
<div align="center">
<h2>Aktuell</h2>
<p><b>Innen:
<?=$temp_inside?> &deg; C <br>
Au&szlig;en:
<?=$temp_outside?> &deg;C<br>
</b></p>
<div align=center">
<h2>Tagesverlauf</h2>
<div>
<img src="temperature/TemperaturDay.png" alt="Tagesverlauf" />
</div>
<h2>Wochenverlauf</h2>
<div>
<img src="temperature/TemperaturWeek.png" alt="Wochenverlauf" />
</div>
<h2>Monatsverlauf</h2>
<div>
<img src="temperature/TemperaturMonth.png" alt="Monatsverlauf" />
</div>
<h2>Jahresverlauf</h2>
<div>
<img src="temperature/TemperaturYear.png" alt="Jahresverlauf" />
</div>
</div>
</center>
</body>
</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
 3
 4
 5
 6
 7
 8
 9
10
  
    <div id="secondary-buttons" class="container-fluid text-center" <?php echo $displayStyle; ?> >
             <?php  if (file_exists("pipan_on")) pipan_controls(); ?>
             <a href="temperatur.php" class="btn btn-default">Temperatur</a>
             &nbsp; &nbsp;
             <a href="preview.php" class="btn btn-default">Download Videos and Images</a>
             &nbsp;&nbsp;
             <a href="motion.php" class="btn btn-default">Edit motion settings</a>
             &nbsp;&nbsp;
     

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… 😏