Seit Mitte Juli misst und protokolliert unsere Wetterstation auf der Terrasse nun schon Temperatur, Luftfeuchte und Luftdruck. Damit die entwickelte Hardware auch eine schöne Auswertung der Messwerte produziert ist natürlich eine entsprechende Software notwendig.

Dieser Artikel ist Teil einer vierteiligen Serie:

  1. Wetterstation — der Prototyp
  2. Wetterstation
  3. Wetterstation — die Auswertung
  4. Wetterstation — das erste Jahr

Ziel des Projektes war es eine Ansicht der aktuellen Werte und der Entwicklung der Wetterdaten in der Vergangenheit zu haben. Dazu habe ich eine Software für den Mikrocontroller entwickelt, welche die Messwerte über das lokale Funknetz an einen Server überträgt. Auf dem Server läuft eine Datenbank, welche die aktuellen Messwerte entgegen nimmt und als Zeitreihe speichert. Auf diese Datenbank greift eine Software zu, welche eine Visualisierung der Werte erzeugt, die mit einem Webbrowser betrachtet werden kann.

Das Ergebnis sieht dann so aus:

Zusätzlich zu den aktuellen Werten und der Wertentwicklung werden noch die Werte zum selben Zeitpunkt am Vortag angezeigt. Außerdem wird noch eine Ansicht der minimalen und maximalen Tagestemperatur für das gesamte Jahr erzeugt:

Im Folgenden gehe ich etwas genauer auf die verwendete Software ein.

Visualisierung der Messwerte

Für die Visualisierung der Messwerte verwende ich Grafana. Diese Open Source Software erlaubt es Daten aus einer Vielzahl verschiedener Datenquellen grafisch hochwertig in HTML zu präsentieren. Dazu ist es nach der Installation lediglich notwendig die gewünschte Datenquelle bekannt zu machen und anschliessend können die verschiedenen Graphen über eine komfortable Weboberfläche konfiguriert werden.

Die Anzeige der aktuellen Temperatur klappt mit dieser Abfrage der Datenbank:

SELECT "temperature1" FROM "weather" WHERE "location" = 'terrace' AND $timeFilter

Oder die Darstellung des Temperaturverlaufs mit dieser Abfrage:

SELECT mean("temperature1") FROM "weather" WHERE "location" = 'terrace' AND $timeFilter GROUP BY time(15m) fill(null)

Die Gruppierung der Messwerte und die Berechnung des arithmetische Mittels über 15 Minuten sorgt hier für eine leichte Glättung der Verlaufskurve.

Schliesslich noch die Abfrage für die maximale und der minimalen Tagestemperatur im Jahresverlauf:

SELECT max("temperature1") FROM "weather" WHERE "location" = 'terrace' AND $timeFilter GROUP BY time(1d) fill(null)

SELECT min("temperature1") FROM "weather" WHERE "location" = 'terrace' AND $timeFilter GROUP BY time(1d) fill(null)

Speicherung der Messwerte

Für die Speicherung der Messwerte verwende ich InfluxDB. Diese Open Source Software ist geeignet um Zeitreihen zu speichern und in einfacher Art und Weise abzufragen. Dazu wird auf dem System nach der Installation eine Datenbank für die Wetterdaten angelegt und anschliessend können über eine HTTP Schnittstelle die Daten zur Speicherung übermittelt werden.

Die Anlage einer Datenbank mit dem Namen home für die Wetterdaten klappt wie folgt:

curl -XPOST "http://localhost:8086/query" --data-urlencode "q=CREATE DATABASE home"

Und die Speicherung der aktuellen Werte Temperatur, Luftfeuchte und Luftdruck mit dieser Anfrage:

curl -XPOST "http://localhost:8086/write?db=home&precision=s" -d 'weather,location=terrace,logger=ESP8266 temperature1=21.5,humidity0=73.9,pressure0=100100'

Gespeichert wird hier ein Datenpunkt weather mit den Datenfeldern temperature1, humidity0 und pressure0. Als Zeitstempel für den Datenpunkt wird hier die aktuelle Zeit beim Speichern verwendet. Ausserdem wird der Datenpunkt noch mit den Etiketten location und logger versehen, die später in den Abfragen verwendet werden können.

Die Datenbank verwendet ein sehr effizientes Speichermodell. Die Wetterstation erzeugt etwa alle fünf Minuten einen Datenpunkt. In den bisherigen drei Monaten sind damit ingesamt nur 1,9 MiB Daten angefallen.

Erfassung der Messwerte

Für die Erfassung der Messwerte und die Übertragung zum Server habe ich eine eigene Software geschrieben. Das in C/C++ geschriebene Programm kann in der Arduino IDE oder mit der PlatformIO IDE kompiliert und anschliessend auf den Mikrocontroller übertragen werden.

Der Ablauf ist einfach:

  1. Sensoren initialisieren
  2. Messwerte der Sensoren auslesen
  3. Verbindung zum lokalen Funknetz herstellen
  4. Messwerte zur Datenbank übertragen
  5. Verbindung zum lokalen Funknetz trennen
  6. Tiefschlafmodus des Mikrocontrollers für 5 Minuten aktiveren
  7. Nach dem Restart von vorne beginnen

Die Software verwendet eine Status-LED um verschiedene Fehlerzustände anzuzeigen.

Erwähnenswert ist die Verwendung der zusätzlichen Software WiFiManager, so dass es nicht notwendig ist den Zugang zum lokalen Funknetz im Vorhinein zu konfigurieren. Falls der Controller keine Verbindung zum WLAN herstellen kann, wird er selbst ein eigenes WLAN starten in dem dann über eine Weboberfläche der Zugang zum gewünschten WLAN konfiguriert werden kann.

Kalibrierung des DS18B20 Temperatursensors

Den Temperatursensor DS18B20 habe ich mit Hilfe einer Zwei-Punkt-Messung kalibriert. Das heißt ich habe mit dem Sensor die Temperatur von kochendem Wasser und Eiswasser gemessen. Die rechnerische Kalibrierung in der Software klappt dann folgendermaßen:

#define LO_TEMP 1.4 // reference 0.01°C
#define HI_TEMP 98.8 // reference 100°C
#define RANGE_TEMP (HI_TEMP - LO_TEMP)
// corrected temperature based on preceding calibration
t = (((t - LO_TEMP) * 99.99) / RANGE_TEMP) + 0.01;

Konfiguration des BME280 Sensors

Den Sensor BME280 für Temperatur, Luftfeuchte und Luftdruck habe ich entsprechend der Dokumentation im Datenblatt für die Verwendung als Wettersensor konfiguriert:

bme280.setSampling(
    Adafruit_BME280::MODE_FORCED,
    Adafruit_BME280::SAMPLING_X1, // temperature
    Adafruit_BME280::SAMPLING_X1, // pressure
    Adafruit_BME280::SAMPLING_X1, // humidity
    Adafruit_BME280::FILTER_OFF,
    Adafruit_BME280::STANDBY_MS_10
);