Archiv für das Jahr: 2019

(M)eine kleine Wetterstation mit einem Raspberry Pi (Teil 7)

Theorie zur Langzeitspeicherung von Wetterdaten

Wie im letzten Teil 6 beschrieben, werden die Daten des Chart-Nodes nur zur Laufzeit des Dashboards im Node gespeichert. Nach einem Neustart des Raspberry sind die Daten weg und bauen sich nach den Einstellungen des Nodes erst wieder auf. Nun gibt es einige Überlegungen, die das Speichern dieser Daten auch auf lange Sicht gewährleistet.

  1. Speichern der Chart-Node-Daten in eine oder mehrere Dateien wie z.B. CSV.
  2. Speichern der ankommenden Daten in einer SQL-Datei, wie z.B. MySQL.
  3. Speichern der ankommenden Daten in einer Round-Robin-Datenbank (RRD), wie z.B. RRDtool von Tobias Oetiker.
  4. Speichern der ankommenden Daten in einer weiteren Version einer RRD, wie z.B. InfluxDB.

Alle genannten Methoden haben für sich gesehen einen gewissen Charme, ihre Vorteile und aber auch ihre Nachteile.

Zu 1.

Das Speichern der Daten aus dem Chart-Node macht vielleicht dann Sinn, wenn man es einmal macht und die Daten hinterher für irgendwelche anderen Zwecke weiter verwendet. Die Ausgabe in eine Datei oder in eine Datenbank ist ohne Zweifel möglich, aber für meine weiteren Überlegungen sinnlos.

Zu 2.

Ja, die ankommen Daten können im Nodered in einen Chart-Node geschoben werden und parallel dazu in eine SQL-Datenbank. Bei der SQL-Datenbank hat man sogar die Freiheit sich seine eigene Datenbank aufzubauen, wie auch die Struktur der Tabellen. Beim Wegschreiben der Daten gibt es zunächst keine Probleme. Problematisch wird es allerdings, wenn man eine Abfrage gestaltet.

Dazu ein Beispiel:
Alle zwei Minuten kommen Daten aus meiner Wetterstation. Das bedeutet, Nodered erzeugt alle zwei Minuten einen Datensatz, der zwar im Moment nur aus der Temperatur besteht, aber auch weitere Felder haben könnte. Z.B. Luftfeuchte, Luftdruck, Windgeschwindigkeit, Windrichtung, Lichtdauer und was einem noch so alles einfällt.

So entstehen im Laufe eines Tages 30 x 24 = 720 Datensätze, pro Woche dann schon 5.040 Datensätze. Im Jahr werden somit 262.080 Datensätze erzeugt. Der kleine Raspberry Pi muss dann z.B. in einer Jahresübersicht 262.080 Daten in den Chart-Node schicken. Die Abfrag ginge vielleicht noch recht schnell, aber das Auffüllen des Knoten könnte schon mal 5 Minuten und mehr benötigen. Außerdem ist es noch abhängig vom Speicher des Raspberry, der in älteren Versionen schnell zugestopft wird.

Eine andere Methode wäre die Aufbereitung von z.B einem Stundenmittel. Dabei würden alle 30 Werte einer Stunde zu einem Mittelwert gebildet, was in einer Jahresübersicht durchaus gefällig ist. Dann wären statt der 262.080 Datensätze nur noch 52w x 7d x 24h = 8.736 Datensätze zu berücksichtigen. Man kann sich schnell ausmalen, welchen Vorteil dies mit sich bringt. Besonders beim Vergleich über Monate oder Jahre hinweg, könnte man alle diese Daten mitteln und diese Mittelwerte in weitere Tabellen einer Datenbank speichern.

Da sind dann die SQL-Programmierer, so wie ich, wieder gefragt, die z.B. über Stored Procedures o.ä. diese Berechnungen fortwährend durchführen. Der Aufwand ist mir aber ehrlich gesagt zu hoch.

Und sowas gibt es schon fertig und bringt mich weiter zu 3.

Zu 3.

Die Round Robin Datenbank RRDtool macht genau das, wie zu 2. in den letzten Absätzen geschrieben. Die Datenbank wird im Vorfeld konstruiert. Dabei werden die zyklischen Abstände und die Anzahl der Messpunkte pro Zyklus definiert. Beim Ankommen der Daten, werden nicht nur die aktuellen Werte oder die Durchschnittswerte auf Basis der Konfiguration verarbeitet, sondern auch gleich die korrekte Zeit mitgegeben. Diese Datenbank ist dann in ihrer Eigenschaft fest eingestellt und kann nachträglich nur sehr umständlich verändert werden. Wenn überhaupt, ich hab’s noch nicht gemacht oder versucht.

Die Ausgabe der Daten erfolgt dann als Grafiken, die mit einem Skript erzeugt werden und als Datei im Filesystem des Raspberry abgelegt werden. Sinnvollerweise macht man das z.B. in einem Verzeichnis, das über einen Webservice (z.B. Apache mit PHP-Skripts) im Raspberry in einem Browser beim Client dargestellt wird. Das hat dann mit dem Nodered Dashboard eher weniger zu tun.

Vorteil:
Die Datei, die die Datenbank beinhaltet (z.B. wetter.rrd) hat immer die selbe Größe. Daten, die aus einem Zyklus herausfallen, z.B. nach einer Woche, werden nach draußen geschoben, um den neuen Datensatz zu speichern.

Nachteil
Eine dynamische Bedienung ist nicht möglich. Ausgabe nur auf Grafikdateien möglich (.PNG, .JPG).

Zu 4.

Aus all den vorangegangenen Überlegungen, komme ich somit nun zu einer ganz anderen Lösung, nämlich eine Kombination aus allen Vorteilen. In aller Munde ist momentan (2019) der Einsatz eines kostenlosen Trios, erhältlich im Internet:

  • NodeRed
  • InfluxDB
  • Grafana

Hier wird Nodered lediglich als Plattform zur Übermittlung der Daten an die InfluxDB Datenbank genutzt. Das Dashboard mit seinen Nodes von NodeRed wird hier nicht mehr benutzt, sondern Grafana.

  1. ist Nodered dafür wie geschaffen mit Hilfe seine Knoten Daten zu empfangen, zu verarbeiten und weiter zu geben.
  2. bietet InfluxDB als weiter entwickelte sog. Timeline Datenbank wie die Round Robin Datenbank alle erforderlichen Mechanismen wie bei den RRDtools an und
  3. liefert Grafana ein Dashboard mit allen Möglichkeiten zur Darstellung von Werten in bestimmten Zeitfenstern, Perioden oder sonstigen Formen an, die um einiges flexibler sind in ihrer Gestaltung, Darstellung und Bedienung als das Nodered Dashboard.

 

Die Praxis zur Langzeitspeicherung von Wetterdaten

Ich entscheide mich somit für meine weitere Entwicklung meiner kleinen Wetterstation für genau diese Konstellation von Werkzeugen.

Vorbereitung

Es kann nicht schaden das Betriebssystem des Raspberry auf den neuesten Stand zu bringen:

$ sudo apt update
$ sudo apt upgrade
$ sudo reboot

Installation NodeRed

Diese Installation wurde schon beschrieben. Hier ist nichts weiter mehr erforderlich.

 

Installation InfluxDB

Download vom Internet und Installation

Die nachfolgenden Aktivitäten beschreiben die Erweiterung des Repos im Raspberry, die Installation und die Konfiguration zum automatischen Start beim Booten des Raspberry.

$ curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -

$ echo "deb https://repos.influxdata.com/debian stretch stable" | sudo tee /etc/apt/sources.list.d/influxdb.list

$ sudo apt update

$ sudo apt install influxdb

$ sudo systemctl enable influxdb

$ sudo systemctl start influxdb

Einrichten InfluxDB

Nun richte ich mir erstmal einen Benutzer dafür ein.

$ influx
> CREATE USER "pi" WITH PASSWORD 'raspberry' WITH ALL PRIVILEGES
> show users
user admin
---- -----
pi   true
> quit
$

Anpassen der Umgebung

Die Datei /etc/influxdb.conf muss nun noch angepasst werden, In der Sektion [http] sind die Zeilen zu finden, bei denen im Grunde nur die Raute # entfernt werden muss. Ich benutze dafür meinen Midnight Commander und rufe ihn mit sudo mc auf, navigiere auf die Datei und prüfe die folgenden Einträge:

[http]
enabled = true
bind-address = ":8086"
auth-enabled = true

Wenn man nun in einem Browser die Adresse des Raspberry mit der Portadresse der Datenbank http://raspberry-pi:8086 eingibt, sollte eine Meldung 404 page not found erscheinen. Das ist richtig so, weil noch kein Seite angelegt ist. Alles andere deutet auf eine falsche Installation hin.

 

Installation Grafana

Am besten schaut man direkt bei Grafana vorbei und holt sich die aktuelle Installation für seine Rechner-Plattform. Zu diesem Zeitpunkt hat Grafana speziell für den Raspberry eine Installation der Version 6.4.3 veröffentlicht, die ich von dieser Webseite aufrufe: https://grafana.com/grafana/download?platform=arm

Dort steht unter Ubuntu & Debian (ARMv6) die Vorgehensweise zur Installation

$ wget https://dl.grafana.com/oss/release/grafana-rpi_6.4.3_armhf.deb
$ sudo dpkg -i grafana-rpi_6.4.3_armhf.deb

Bei dieser Installation gibt es eine Meldung, dass eine Abhängigkeit nicht vorhanden ist und deswegen die Installation abgebrochen ist. Diese Abhängigkeit installiere ich nach:

$ sudo apt install libfontconfig

und beende die unfertige Installation mit

$ sudo apt --fix-broken install

Nun wird der Dienst in das System eingebunden

$ sudo systemctl daemon-reload
$ sudo systemctl enable grafana-server
$ sudo systemctl start grafana-server

Wenn alles korrekt durchgelaufen ist, sollte nun in einem Browser Grafana aufrufbar sein, Grafana benutzt den Port 3000 zur Kommunikation. Also: http://raspberry-pi:3000. In der nachfolgenden Anmeldung wird der Standardbenutzer admin mit Kennwort admin eingetragen.

In den weiteren Schritten werde ich nun meine Datenquellen, also die Sensoren einrichten und die gelieferten Daten abholen, speichern und zur Anzeige bringen.

Im Übrigen benutze ich immer noch den Raspberry Pi 2 mit Raspbian 9 (Stretch)!

(M)eine kleine Wetterstation mit einem Raspberry Pi (Teil 6)

Sensoren

Temperatur mit dem DS18B20

Aus dem Internet habe ich mir seinerzeit ein paar Temperatursensoren vom Typ Dallas (Maxim) DS18B20 beschafft. Der Stückpreis für einen solchen Sensor liegt mittlerweile weit unter 1 Euro. Der Vorteil dieses Sensors ist, dass er mit dem I2C-Protokoll angesprochen werden kann. Somit kann er mit einem Raspberry Pi direkt kommunizieren. D.h. man stellt ein Anfrage an das Device und man erhält eine Antwort. In diesem Fall die Temperatur des Gerätes. Die Kommunikation findet dabei von Haus aus über den GPIO 4 des Raspberry statt und kann im Grunde direkt angeschlossen werden.

Um aber keinen unkontrollierten Datenwust auf der Leitung zu bilden, benötigt der Daten-Pin GPIO 4 einen Pull-Up-Widerstand von irgendwas zwischen 1 und 47 kOhm gegen VDD (3,3V). Da es sich bei dem I2C-Anschluss um einen sog. Bus handelt, können an dieser Leitung mehrere Devices unabhängig voneinander angeschlossen werden. Sie unterscheiden sich voneinander erstmal in ihrer I2C-Bus-Nummer. Der DS18B20 hat zudem noch eine eigene Seriennummer, die über den Bus mit ausgeliefert wird. Dadurch kann man jeden einzelnen Sensor direkt mit seiner individuellen ID ansprechen und bestimmte Ausgaben zuordnen.

Der DS18B20 ist in einem TO-92-Gehäuse untergebracht und sieht demnach aus wie ein kleiner Transistor. Hier ein Bild mit der Pin-Belegung:

DQ ist dabei die Datenleitung, VDD ist die Stromversorgung 3,3V und GND eben die Masse (0V). Die nachfolgenden Anschluss-Bilder habe ich bei instructables.com ausgeliehen.

Single Anschluss DS18B20

 

Multipler Anschluss DS18B20

Natürlich nimmt man die Verkabelung im stromlosen Zustand des Raspberry vor. Nach dem Neustart des Raspberry kann man an der Konsole das Vorhandensein des Sensors abfragen.

Der DS18B20 Sensor mit der ID 28-00000756f09e ist somit ordentlich erkannt.

Nun braucht man natürlich noch eine Software zur Kommunikation mit dem Sensor. Nodered kann dafür einen zusätzlichen Knoten bereit stellen. Über den Paletten-Manager im Nodered wird das Modul node-red-contrib-sensor-ds18b20 dazu nachinstalliert. Bitte auf die Schreibweise achten, es gibt auch andere Nodes, die ähnlich geschrieben werden.

Nach der Installation ist in der Palette der Node zu sehen.

In der Node-Liste Raspberry Pi taucht nun auch der Knoten zur weiteren Verwendung auf:

Ich brauche diesen Node zweimal auf meinem Flow und schiebe dazu noch einen Chart- und einen Gauge-Node auf den Flow. Jetzt verbinde ich den ersten Sensor-Node mit dem Chart-Node und den zweiten Sensor-Node mit dem Gauge-Node.
Mit jeweils Doppelklick auf die Nodes öffnen sich die Eigenschaften. Beim Sensor-Node werden in einer Dropdown-Liste alle verfügbaren DS18B20-Sensoren angezeigt. Im ersten Node setze ich eine 300-Sekunden-Abfrage an meinen Sensor. Die zurückgegebene Temperatur wird dann im Chart-Node ausgegeben.

Einstellung des ersten Sensor-Nodes

 

Einstellung des Chart-Nodes

Nun die Einstellungen für den zweiten Sensor-Node und der verbundene Gauge-Node.

 

 

Einstellung des zweiten Sensor-Node

 

Einstellung des Gauge-Node

 

Mit dem Klick auf Deploy wird dieser Flow nun generiert und veröffentlicht.

Das sieht dann nach 7 Tagen Laufzeit in etwa so aus:

Dabei aktualisiert der Temperatur-Zeiger alle 10 Sekunden und die Temperatur-Kurve alle 5 Minuten.

Das sieht nun schon recht fluffig aus. Jedoch werden die Daten im Chart-Node nur solange zwischengespeichert, wie der kleine Rechner läuft. Nach jedem Neustart des Raspberry Pi beginnt der Node mit leeren Daten und füllt das Chart alle 5 Minuten mit einem neuen Wert auf.

Also wieder 7 Tage warten? Nicht doch… Das führt mich nun dahin, dass ich solche Daten in einer Datenbank ablege und nach Bedarf eine Darstellung von aktuellen sowie historischen Daten generiere. Wie man das macht erkläre ich im nächsten Teil 7 (m)einer kleinen Wetterstation.

Andere Sensoren

Der Vollständigkeit halber: Es gibt für den schmalen Geldbeutel eine Menge weiterer Sensoren und Aktoren für die unterschiedlichsten Anwendungen. Eine Übersicht findet man im Internet z.B. auf dieser Seite https://tutorials-raspberrypi.de/raspberry-pi-sensoren-uebersicht-die-50-wichtigsten-module/