InfluxDB

Am Beispiel von InfluxDB[1]. Diese Datenbank zählt zu den NoSQL-Datenbanken und speichert die Daten im Gegensatz zu einer relationalen Datenbank schemalos. Das bedeutet, dass keine Tabellen angelegt werden sondern sich die Struktur aus den Daten selbst ergibt. Daher eignet sie sich für die Speicherung von Messwerten, da sie mit einer zeitlichen Auflösung im Nanosekundenbereich schneller ist als eine SQL-Datenbank und Daten mit einer SQL-ähnlichen Abfragesprache auch automatisch einfacher zusammengefasst werden können. Wie bei relationalen Datenbanken ist eine genaue Planung der Speicherung für die spätere Auswertbarkeit zwingend erforderlich. Zudem gibt es zahlreiche Konnektoren, z.B. für NodeRed, ESP8266 und Grafana.

Weitere Informationen:

1 Installation

Achten Sie bei produktivem Einsatz einer InfluxDB auf eine Absicherung und ein User-Management!

1.1 Docker-Container

  1. Starten Sie einen InfluxDB-Container: https://hub.docker.com/_/influxdb in der Version 1.8.6.
    Erstellen Sie dabei für die Datenbank ein Volume.
    docker run -d --name influxdb -p 8086:8086 -v influxdbdata:/var/lib/influxdb influxdb:1.8.6
    Alternativ: Einbindung in Stack.
  2. Öffnen Sie die Kommandozeile in diesem Container. docker exec -it influxdb bash
  3. Starten Sie dort das CLI der Datenbank influx -precision rfc3339

1.2 Lokale Installation

InfluxDB ist für alle gängigen Server-Betriebssystem erhältlich - die aktuelle Version leider nicht mehr für Windows.

  1. Installieren Sie InfluxDB, indem Sie diese zip-Datei entpacken[2]. Weitere Versionen und andere Programme finden Sie hier.
  2. Starten Sie die Datenbank durch Ausführen des Dienstes: C:\influx-1.8.6-n>influxd.exe. Das Fenster darf nicht geschlossen werden. Der Dienst kann mit Strg+C beendet werden.
  3. Öffnen Sie eine weitere Eingabeaufforderung und starten Sie mit C:\influx-1.8.6-n>influx.exe -precision rfc3339 das CLI (Command Line Interface) der Datenbank. Durch den Parameter werden die Timestamps in einem verständlichen Format ausgegeben.
    Verlassen Sie später das CLI mit exit.

2 Daten erfassen

Zur Speicherung muss zunächst eine Datenbank angelegt werden create database datenbankname. Danach muss diese Datenbank ausgewählt werden use datenbankname.

Jetzt können beliebige Datenpunkte eingefügt werden. Hierbei muss der Name der Messungen angeben werden (z.B. 'temp'), was in etwa der Tabelle im relationalen Datenmodell entspricht. Ein Datenpunkt besteht hierbei aus:

  • tag value - z.B. 'Bad' (entspricht dem Spaltennamen)
  • field value - die Messwerte, Standard ist der Datentyp float, andere sind möglich, nach der ersten Speicherung muss der Typ beibehalten werden
  • timestamp - optional, wenn er fehlt, wird er automatisch vom Server übernommen

Hier einige Beispiele:
insert temp,ort=Bad,sensor=1 value=22.8
insert temp,ort=Bad,sensor=1 value=23.2 1613415973169237754 - hier wurde ein Timestamp angegeben
insert pres,ort=Bad,sensor=1 value=825

Datenpunkt können nach ihrer Speicherung nicht mehr verändert oder gelöscht werden.

  1. Legen Sie über das CLI eine neue Datenbank an und fügen Sie ca. zwanzig beliebige Datenpunkte gemäß obigem Beispiel mit unterschiedlichen Tag Values, Field Values und Werten ein.
  2. Schreiben Sie mit dem ESP8266 Daten direkt in die InfluxDB
    1. Installieren Sie in der Arduino-IDE über die Bibliotheksverwaltung die Erweiterung 'ESP8266 influxdb' von Tobias Schürg[3]
    2. Öffnen Sie 'Datei - Beispiele - ESP8266 - BasicWrite'
    3. Schreiben Sie in regelmäßigen Zeitabständen Werte in die InfluxDB. Nutzen Sie dazu entweder einen Poti, Zufallszahlen oder inkrementierte Werte.

3 Daten auswerten

Zur Auswertung der Daten steht die Abfragesprache InfluxQL zur Verfügung, die stark an SQL angelehnt ist. Mit dem Befehl show measurements können die Messungen aus der Datenbank ausgegeben werden. Genauere Informationen zu den Inhalten erhält man mit den Befehlen show series, show tag keys und show field keys. Die Daten lassen sich dann mit SELECT-Abfragen ausgeben - z.B. select * from temp - und mit where und group by einschränken und gruppieren.

  1. Erstellen Sie verschiedene Abfragen auf die Daten, die folgendes ausgeben:
    1. alle Daten in der 'temp'-Messung
    2. alle Daten in der 'temp'-Messung, die Werte enthalten
    3. alle Daten des Sensors 1 in der 'temp'-Messung
    4. alle Daten in der 'temp'-Messung aus dem Bad
    5. alle Daten in der 'temp'-Messung, bei denen der Wert im Bad unter 21°C liegt
    6. alle Daten in der 'temp'-Messung gruppiert nach Ort
    7. alle Daten in der 'temp'-Messung, die in den letzten 30 Minuten geschrieben wurden
  2. Daten importieren
    1. Laden Sie die Datei https://s3.amazonaws.com/noaa.water-database/NOAA_data.txt herunter und speichern Sie diese im Verzeichnis der Influx-Datenbank. Diese Datenbank enthält 15.258 Datenpunkte zur Wasserqualität an zwei Orten, die zwischen dem 17.08.2019 und 17.09.2019 erhoben wurden.
    2. Importieren Sie die Datei mit dem Befehl influx -import -path=NOAA_data.txt -precision=s
  3. Dokumentieren Sie die Struktur der beiden Datenbanken mit den oben genannten Befehlen.

Links:

4 Daten automatisiert weiterverarbeiten

Mit Continous Queries können Daten von mehreren Messung zu einem neuen Messwert zusammengefasst werden und anschließend mit einer Retention Policy automatisiert gelöscht werden.

Links:

Arbeitsauftrag:

  1. Zeigen Sie zunächst die Datenpunkte Ihrer Datenbank an. Halten Sie fest, wie diese zusammengefasst werden sollen. Erstellen Sie anschließend eine Abfrage, die die Datenpunkte sinnvoll zusammenfasst und kontrollieren Sie das Ergebnis.

5 Daten visualisieren

Influxdata stellt ein eigenes Visualisierungs-Tool names Chronograf zur Verfügung, allerdings lassen sich ebenso andere andere Tools nutzen.

  1. Visualisieren Sie die erfassten Daten mit Grafana.