Einleitung

Im ersten Teil dieses Artikel habe ich gezeigt, wie man einen 433 MHz Temperatursensor einer Wetterstation auf dem Raspberry mit pilight auslesen kann. Doch nur das Auslesen mit dem Befehl pilight-receive ist ja nun nicht so richtig befriedigend. Wir wollen die Daten ja auch speichern und grafisch anzeigen lassen. Es existieren im Netz ein paar Beiträge zu diesem Thema, bei denen die Ausgabe des Befehls pilight-receive in einem Shellscript in eine Textdatei umgeleitet wird. Diese Script wird dann über einen Cron Job in definierten Zeitabständen aufgerufen. Die erzeugteTextdatei müsste man dann wiederum auslesen ,den Sensor mit den Werten identifizieren und die Daten z.B. in einer Datenbank oder einer CSV-Datei speichern.

Doch wozu dieser ganze Aufwand. Wir haben ja schließlich pilight installiert, welches einen inegrierten Webserver hat. In dem Abschnitt settings der Konfigurationsdatei /etc/pilight/config.json ist ein webserver-http-port angegeben. Sandardmäßig ist dieser 5001. Das bedeutet, dass Sie mit dem Aufruf http://ip-des-raspberry:5001 die Web-GUI des pilight Servers anspechen können. Und laut Dokumentation liefert der Aufruf http://ip-des-raspberry:5001/values die Werte der Sensoren. Dafür muss der Sensor aber im Abschnitt devices in der Konfigurationsdatei config.json eingetragen sein.

Sensordaten auslesen

Der Aufruf des Programms pilight-receive hat folgende Ausgabe erzeugt.

{
	"message": {
		"id": 2047,
		"temperature": 409.5
	},
	"origin": "receiver",
	"protocol": "alecto_wsd17",
	"uuid": "0000-b8-27-eb-5564a4",
	"repeats": 1
}
{
	"message": {
		"id": 1,
		"temperature": 18.1,
		"humidity": 21.0,
		"battery": 1
	},
	"origin": "receiver",
	"protocol": "alecto_ws1700",
	"uuid": "0000-b8-27-eb-5564a4",
	"repeats": 1
}

Wobei das der Abschnitt protocol = alecto_ws1700 die Werte des Temperatursensors beinhaltet. Dieser Abschnitt hat die id 1.

Nun fügen Sie folgenden Inhalt in den Bereich devices der config.json hinzu, so dass der Abschnitt devices folgendermaßen aussieht:

        "devices": {
                "Temperatursensor1": {
                        "protocol": [ "alecto_ws1700" ],
                        "id": [{
                                "id": 1
                        }],
                        "temperature": 20.7,
                        "humidity": 51.0,
                        "battery": 1
                }
        },

Wichtig ist hierbei das protocol und die id. Es muss mit der Ausgabe des Befehls pilight-receive übereinstimmen. temperatur, humidity und battery sind Werte, die ausgegeben werden, wenn der Sensor nicht gefunden wird. Bearbeiten Sie die Datei nur, wenn Sie vorher den pilight Server beendet haben. Ansonsten werden ihre Änderungen bei beenden des Server wieder entfernt. Starten Sie nun den pilight Server neu und rufen Sie die URL http://ip-des-raspberry:5001/values im Brwoser auf.

Sie sollten nun folgende Ausgabe sehen

Pilight Ausgabe JSON

Pilight Ausgabe JSON

Die Ausgabe der Daten erfolgt im JSON Format. Also kann man in bestimmten Zeitabständen diese URL aufrufen und die Daten entsprechend weiterverarbeiten. In dem Fall ist es besonderst einfach, da nur die Darten eines Sensors geliefert werden. Bei mehreren Sensoren muss man die Daten entsprechend filtern.

Sensordaten speichern

Nachdem wir nun eine Möglichkeit haben die Sendordaten abzurufen, müssen wir noch einen Weg finden diese Daten zu speichern. Da es bei Temperaturdaten um zeitliche Verläufe  geht, bietet sich eine Datenbank zum speichern der Daten an. Die gebrächlichste Datenbank ist die MySql Datenbank. Diese ist auf einem Raspberry Pi Zero aber wegen des Speicherverbrauchs nicht zu empfehlen. Daher habe ich mich für SQlite3 entschieden. Es ist eine Datenbank ohne viel Overhaed, die ihre Daten in reinen Textdateien speichert. Damit kann man ohne viel Aufwand die Daten sichern, indem man lediglich die Textdatei kopiert. Die Installation von SQlite 3 auf einem Rasperry Pi ist in diesem Artikel beschrieben.

Für das Speichern der Daten habe ich mich für ein PHP-Script entschieden, dass auf dem Apache Webserver läuft. Das Script mit dem Namen db.php liegt im root Verzeichnis des Webservers hat folgenden Inhalt:

<?php

// Daten auslesen mit curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,"http://127.0.0.1:5001/values");
$result=json_decode(curl_exec($ch));
$datum = date('d.m.Y H:m:s');
$temperatur = $result[0]->values->temperature;
$luftfeuchtigkeit = $result[0]->values->humidity;

// Daten in SQLite Datenbank schreiben
$dbh = new PDO("sqlite:/var/www/db/temperatur.db3");
$insert = $dbh->prepare("INSERT INTO temperaturdaten (datum, temperatur, luftfeuchtigkeit) VALUES ('$datum', $temperatur, $luftfeuchtigkeit)");
$insert->execute();

Damit dieses Script funktioniert müssen die Module curl und sqlite3 für php installiert werden.

sudo apt-get install php-curl
sudo apt-get install php-sqlite3

Die Datenbank temperatur.db3 liegt dabei im Verzeichnis /var/www/db und hat eine Tabelle temperaturdaten mit folgenden Feldern

Tabelle temperaturdaten

Tabelle temperaturdaten

Als letztes wird noch ein neuer Cronjob erstellt, der alle 15 Minuten die Seite http://127.0.0.1/db.php aufruft und damit die aktuellen Daten in die Datenbank speichert.

*/15 * * * * wget -q http://127.0.0.1/db.php

Wie Sie nun die Sensordaten grafisch aufbereiten und anzeigen können, zeige ich ihnen im dritte Teil dieses Artikels. Ein Beispiel für die Anzeige der Sendordaten finden Sie hier.