Daten sammeln und an Server übertragen

Ziel ist es Daten, Temperatur, Luftfeuchte usw. zu erfassen und Grafen zu erstellen mit denen die Daten ausgewertet werden können. Dazu werden die gesammelten Daten an einen Server übertragen und dort verarbeitet.
Die lokale Erfassung erfolgt derzeit mit einem Raspberry Pi und DS18B20 und DHT22 Sensoren.

 

DS18B20 Temperatur am Pi auslesen

Wir erfassen die Temperatur am Pi die wir dann an unseren Server übergeben werden. Der Pi ist natürlich etwas überdimensioniert. Die Aufgabe könnte auch ein Mini-Arduino übernehmen. Aber erstmal reicht das.
Also, besorgt euch einen DS18B20 und aktiviert das One Wirrer Protokoll in den Raspi-Configs.
Zum Anschließen gibts im Netz zahlreiche Tutorials.
Wenn der DS18B20 läuft nutzen wir ein kleines Python Script um die Daten auszulesen.

text = open("/sys/bus/w1/devices/28-*/w1_slave", "r")
lines=text.readlines()
temp = lines[1][29:34]
temp = float(temp) / 1000
print temp

Zeile 1 öffnet die Datei in der der One Wirrer Sensor die Daten schreibt.
Zeile 2 schreibt die Datei in ein Array, Zeile für Zeile.
Zeile 3 liest Zeile 1, der Datei, aus und Beschneidet die Ausgabe so dass nur die Temperatur übrig bleibt.
Zeile 4 speichert die Temperatur als Float (Kommazahl) und Teilt sie durch 1000 damit das Komma an der richtigen Stelle sitzt.
Zeile 5 gibt die Temperatur aus; z.B. 21,51

Die erfassten Daten übergeben wir nun an unseren Server, auf dem wir diese Speichern wollen. Dafür nutzen wir eine kleine Mini-API als Übergabepunkt.

Eigene API erstellen

Es gibt bestimmt „bessere“ Wege um das zu erreichen, aber meine PHP Kenntnisse sind nicht so gut und irgendwie reicht meine kleine Lösung für meinen Bedarf. Wir übergeben unsere gesammelten Daten per URL und schreiben diese in eine Datei. Dabei fügen wir den neusten Wert am Ende hinzu und fügen das Datum und die Uhrzeit mit ein. Man sollte sich bewusst sein, dass die Daten bei der verwendeten Methode von dritten mitgelesen werden könnten.
Ziel ist es dass wir über die URL https://DOMAIN/temp.php?daten=TEMPERATUR die aktuelle Temperatur übergeben können und diese auf dem Server speichern.

Also was brauchen wir:
1. Daten entgegen nehmen
2. Datum und Uhrzeit ermitteln
3. Datei öffnen
4. Daten schreiben

<?php
$datum = date("d.m.Y - H:i");
$temp = $datum . " " . $_GET["temp"] . "\n";

$datei = fopen("t.txt","a+");
rewind($datei);
fwrite($datei, $temp);
fclose($datei);
?>

Zeile 2 erfasst das aktuelle Datum und die Uhrzeit im Format Tag.Monat.jahr – Stunde:Minute
Zeile 3 verbindet das erfasste Datum die als temp übergebenen Daten und fügt am Ende ein \n (Zeilenumbruch) hinzu.
Ab Zeile 5 öffnen wir die Datei t.txt und hängen unsere erfassten Daten hinten an.

Später könnte man das mal ausbauen und die Daten in eine Datenbank schreiben. Für den Moment reicht die Lösung mit der Datei.

Das Script speichern wir auf unserem WebServer als temp.php, jetzt können wir mit dem Aufruf https://DOMAIN/temp.php?temp=TEMPERATUR Daten übergeben und diese werden dann in die t.txt geschrieben. Simples kleines Temperatur Monitoring.

Daten an Server übertragen

Um die Daten an den Server zu Übergeben müssen wir die oben genannte URL aufrufen.
Dafür erweitern wir unter Pythonscript um ein paar Zeilen:

import urllib

text = open("/sys/bus/w1/devices/28-01159179acff/w1_slave", "r")
lines=text.readlines()
temp = lines[1][29:34]
temp = float(temp) / 1000
print temp
url = "http://minimint.de/temp.php?temp=" + str(temp)
html_quelltext = urllib.urlopen(url).read()

Zeile 1 bindet die urlib Bibliothek ein.
Die letzten beiden Zeilen definieren einmal die URL und in der letzten Zeile den eigentlichen Aufruf.

Script automatisch ausführen

Damit das Script automatisch alle 10 Minuten ausgeführt wird nutzen wir einen einfachen Cronjob
*/10 * * * * python /home/pi/temp.py

Jetzt werden alle 10 Minuten die Temperatur des DS18B20 abgerufen, an den Server übergeben und dort gespeichert.