In diesem Gastbeitrag wird das Projekt “Raspi’s Wetterauskunft” mit dem Kleinrechner Raspberry Pi von mir vorgestellt. Dabei wird der Raspi mit zwei Sensoren für Temperatur und Luftfeuchtigkeit (außen und innen) ausgestattet. Die Werte werden in einer Datenbank für die spätere Auswertung und Visualisieurng mittels einem PHP-Skript aufgezeichnet. Der folgende Screenshot gibt einen Blick auf diese Auswertung:

Wetterdaten Übersicht

Hardware und Verkabelung

DHT11 (Innentemperatur und Luftfeuchtigkeit: 0 bis 50°C)

DHT11

PIN-Belegung (Ansicht von oben, Kontakte zeigen nach unten, wie auf dem Bild):

PIN 1 => ganz links (VCC)
PIN 2 => nächster von links (SIG)
PIN 3 => nächster von links (NC)
PIN 4 => ganz rechts (GND)

Raspberry Pi Verbindung (DHT11-PINs auf GPIO-PINs)

PIN 1 => 3,3V
PIN 2 => 4 (PIN zur Übermittlung der Daten; hier GPIO 4)
PIN 3 => –
PIN 4 => GND

DHT22 (Aussentemperatur und Luftfeuchtigkeit: -40 bis 125°C)

 

DHT22PIN-Belegung (Ansicht von oben, Kontakte zeigen nach oben, wie auf dem Bild):

PIN 1 => ganz links (GND)
PIN 2 => nächster von links (VCC)
PIN 3 => nächster von links (NC)
PIN 4 => ganz rechts (SIG)

Raspberry Pi Verbindung (DHT22-PINs auf GPIO-PINs)

PIN 1 => GND
PIN 2 => 3,3V
PIN 3 => –
PIN 4 => 17 (PIN zur Übermittlung der Daten; hier GPIO 17)

Ansteuerung der Sensoren

Die Ansteuerung und der Abruf von Temperatur und Luftfeuchtigkeit der Sensoren findet über ein einfaches Signal-Protokoll statt. Hierbei werden Signale an die Sensoren gesandt und daraufhin antworten diese mit den Sensor-Daten. Diese Signal-Daten müssen von Raspi in eine Zahl füt die Temperatur (z.B. 21,5 °C) und Luftfeuchtigkeit (z. B. 80 %) interpretiert werden. Hierfür stehen kleine Programme zur Verfügung, die hier heruntergeladen werden können:

Die Programme liegen im Quelltext vor, sodass hier Änderungen (z. B. ein abweichender Signal-PIN als oben angegeben; eine abweichende Ausgabe der Temperatur und Luftfeuchtigkeit) vorgenommen werden können. Vor der Ausführung muss der Quelltext in Maschinencode übersetzt (kompiliert) werden. Hierfür werden Entwicklungstools benötigt (z. B. Installation in Debian: sudo apt-get install build-essential) und ggf. zusätzliche Pakete wie Wiring Pi. Falls solche Abhängigkeiten  nicht erfüllt sind, sollte der Übersetzungsprozess mit entsprechenden Meldungen abbrechen.

Speicherung der Daten in einer Datenbank

Für eine Auswertung historischer Temperatur- und Luftfeuchtigkeitsdaten werden diese in einer Datenbank gespeichert. Dafür müssen zusätzlich Pakete auf dem Raspi installiert werden:

  • Datenbankmanagementsystem (hier Postgres DB; denkbar z. B. auch MySQL)
  • Webserver mit PHP-Unterstützung (hier lighttpd; denkbar z. B. auch Apache)
  • Datenbank-Bindings für PHP (hier php5-pgsql)

Nun muss eine Datenbank zur Speicherung der Werte entworfen werden. In diesem Fall werden alle Werte in einer Datenbank mit Tabellen jeweils für ein Messdatum (Temperatur innen und außen, Luftfeuchtigkeit innen und aussen) erstellt. Die folgenden SQL-Befehle erzeugen unter Postgres eine entsprechende Datenbank:

CREATE DATABASE temphumid;
CREATE TABLE temp_inside_record(
 temp_id serial primary key,
 temperature real not null,
 stamptime TIMESTAMP
 );
CREATE TABLE temp_outside_record(
 temp_id serial primary key,
 temperature real not null,
 stamptime TIMESTAMP
 );
CREATE TABLE humid_inside_record(
 humid_id serial primary key,
 humidity real not null,
 stamptime TIMESTAMP
 );
CREATE TABLE humid_outside_record(
 humid_id serial primary key,
 humidity real not null,
 stamptime TIMESTAMP
 );

Hinweis:

Im Fall von Problemen bei der Erstellung der Datenbank-Struktur hat Manuel in einem Kommentar eine mögliche Ursache und die Behebung des Problems beschrieben (siehe auch Kommentar am Ende des Beitrags):

Nach dem erstellen der Datenbank (CREATE DATABASE temphumid;) muss man diese VOR dem Erstellen der Tabellen erst einmal auswählen mittels: “\c temphumid” innerhalb der psql Konsole.

Zur Speicherung von  Temperatur- und Luftfeuchtigkeitsdaten in der oben erstellten Datenbank wird folgendes Bash-Skript genutzt:

#/bin/bash
dht11="Fehler"
dht22="Fehler"
path="PATH_TO_SENSOR_EXECUTABLES"

while [ "$dht11" = "Fehler" ]
do
        dht11=`$path/DHT11`
done

while [ "$dht22" = "Fehler" ]
do
        dht22=`$path/DHT22`
done

humidAussen="`echo $dht22 | awk -F':' '{print $1}'`"
tempAussen="`echo $dht22 | awk -F':' '{print $2}'`"

humidInnen="`echo $dht11 | awk -F':' '{print $1}'`"
tempInnen="`echo $dht11 | awk -F':' '{print $2}'`"

set -e
set -u

# Set these environmental variables to override them,
# but they have safe defaults.
export PGHOST=${PGHOST-localhost}
export PGPORT=${PGPORT-5432}
export PGDATABASE=${PGDATABASE-temphumid}
export PGUSER=${PGUSER-#####################}
export PGPASSWORD=${PGPASSWORD-####################}

# Update temperature and humidity
RUN_PSQL="psql -X --set ON_ERROR_STOP=on "
${RUN_PSQL} <<SQL
INSERT INTO humid_inside_record (humidity, stamptime) VALUES ($humidInnen,to_timestamp(`date +%s`));
INSERT INTO humid_outside_record (humidity, stamptime) VALUES ($humidAussen,to_timestamp(`date +%s`));
INSERT INTO temp_inside_record (temperature, stamptime) VALUES ($tempInnen,to_timestamp(`date +%s`));
INSERT INTO temp_outside_record (temperature, stamptime) VALUES ($tempAussen,to_timestamp(`date +%s`));
SQL

Das Skript kann auch hier heruntergeladen werden: updateTempHumidDB.tar.gz

Hinweis:

Falls Daten nicht in die Datenbank geschrieben werden hat Manuel in einem Kommentar eine mögliche Ursache und die Behebung des Problems beschrieben (siehe auch Kommentar am Ende des Beitrags):

Zum erfolgreichen Schreiben und Senden der Daten fehlt als vorletzte Zeile innerhalb des Bashscripts (also vor der Zeile “SQL”) noch ein “commit;”. Dieses ist nötig, da du bei der Parametrisierung ja auch “autocommit=off” gesetzt hast.

Danach erhält man auf der Console nicht nur die Insert-Bestätigung, sondern auch das Commit:
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
COMMIT

Die DB-Konfiguration sowie der Pfad zu den DHT-Programmen muss in dem Skript angepasst werden. Danach lassen sich durch den Aufruf des Skripts die Sensordaten in die Datenbank schreiben.

Damit die Sensordaten in regelmäßigen Abständen in die Datenbank geschrieben  werden, wird folgender Cron-Eintrag erstellt (hier: jede halbe Stunde):

 0,30 * * * * root /PFAD_ZUM_SKRIPT/updateTempHumidDB.sh

Aufgrund der notwendigen Privilegien zur Ansteuerung der GPIO-PINs bei der Ermittlung der Sensordaten muss das Programm unter dem Administratorkonto root gestartet werden.

 Visualisierung

Zur Auswertung und Visualisierung der gespeicherten Messwerte in der Datenbank wird das JavaScript-Framework NVD3.js eingesetzt. Dieses basiert auf D3.js und ermöglicht schöne Effekte bei der Darstellung der Daten. Die Homepages der Frameworks zeigen einige Beispiele zu den Möglichkeiten der Tools.

Als erstes müssen diese JavaScript-Frameworks von den Homepages heruntergeladen werden:

Die heruntergeladenen Dateien müssen ggf. extrahiert und in dem Unterverzeichnis “js” des Webverzeichnisses gespeichert werden (relativ zu dem PHP-Skript). Auf diese Dateien wird im HTML-Code des Auswertungs-PHP-Skriptes verwiesen.

Anschließend wird das PHP-Skript weather.php in dem Webverzeichnis gespeichert. In dem Skript muss die Datenbank-Konfiguration noch angepasst werden, dann kann das Skript über den Browser von dem Webserver des Raspberry Pi abgerufen werden.

Bedienung und Kompatibilität

Im oberen Bereich der Anzeige wird der letzte Datenbankeintrag angezeigt und somit werden die letzten Messwerte ausgegeben. Über ein Formular mit einer HTML5-Datumsauwahl (nicht unterstützt von Firefox, jedoch Chrome) kann ein Zeitraum zur Visualisierung vorgegeben werden. Bei dem ersten Aufruf ist der vergangene Tag als Zeitraum gewählt.

Anpassungen und Weiterentwicklung

Ausgehend von diesem Projekt lässt sich die Darstellung der Daten leicht über die JavaScript-Framework-Funktionen anpassen und ändern. So stehen die Daten den JavaScript-Frameworks nun in einem unterstützten Format zur Verfügung. Die Homepages der Bibliotheken bieten eine gute Übersicht über mögliche Darstellungsformen mit direkten Code-Beispielen zur Übernahme in das eigene Skript.

Über Feedback würde ich mich freuen, insbesondere über neue Darstellungsformen, die dann in diesen Blog-Beitrag einfließen.