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… ­čśĆ