Inhaltsverzeichnis

InfluxDB

InfluxDB eignet sich hervorragend dafür wiederholende Messwerte aus dem IoT-Umfeld in einer Datenbank zu speichern. Dazu reicht Anfangs bereits ein Raspberry PI aus.
:!: Momentan werden wohl nur Versionen < 2.0 auf dem Raspberry unterstützt, da 2.0 ein 64-bit Linux voraussetzt.

Grundlegende Konzepte

Wichtig ist es die grundlegenden Konzepte von InfluxDB zu verstehen. Leider ist die offizielle Doku hier nur mäßig hilfreich, weil Sie immer die Nähe zu SQL betont, was aber leicht dazu führen kann, dass man auf die falsche Fährte gerät.

InfluxDB speichert Daten nicht in relationalen Tabellen!

Daten werden in einer oder mehreren Zeitreihen (Measurements) gespeichert, wobei jede Zeitreihe ein in sich konsistentes Datenschema aufweisen muss. Man kann verschiedene Schemas nicht mischen oder anpassen. Sollte sich das Datenformat ändern, legt man einfach eine neue Zeitreihe an.

Die Gliederungsebenen sind:

  1. Database - Sammlung von Zeitreihen (:!: wird in v2.0 als Bucket bezeichnet)
  2. Measurement - Folge von zusammengehörigen Datenpunkten mit dem gleichen Schema (Zeitreihe)
  3. Series - eine logisch zusammenhängende Folge von Datenpunkten mit der gleichen 'Tag'-Kombination
  4. Point - ein einzelner Messwert in einer Zeitreihe

Das Datenschema wird anders als bei relationalen Datenbanken nicht in der Datenbank erzeugt. Statt dessen es ist Aufgabe der Datenquelle das Datenformat festzulegen (beim ersten Schreiben eines Datenpunktes). Man kann das Datenformat auch nicht nachträglich ändern, sondern startet einfach eine neue Zeitreihe mit dem geänderten Format.

Die Daten in Messpunkten können für die spätere schnelle Suche und Gruppierung indiziert werden. Dazu werden ein oder mehrere Datenfelder als Tag gekennzeichnet (:!: Tags werden immer als Strings interpretiert!). Die weiteren Daten werden als Fields bezeichnet und als Name/Wert-Paare gespeichert die den Datentyp float, integer und boolean unterstützen.

Jedem Messpunkt ist ein timestamp zugeordnet. Dieser wird entweder von der Datenquelle mitgeliefert, oder von InfluxDB erzeugt.

Am einfachsten versteht man diesen Aufbau, wenn man das LineProtokoll benutzt. Im LineProtokoll werden Tags und Fields einfach durch ein Lehrzeichen voneinander getrennt geschrieben. https://docs.influxdata.com/influxdb/cloud/reference/syntax/line-protocol/

InfluxDB und Python

Aus Python kann man mit auf InfluxDB (Version >= 1.8) mit der folgenden Python Library zugreifen: https://github.com/influxdata/influxdb-client-python Für Versionen bis 1.7 wird diese Library benötigt: https://github.com/influxdata/influxdb-python

Tutorial:

Bis Version 1.7 können Daten entweder im LineProtokoll, oder einfach im JSON-Format geschrieben werden: https://influxdb-python.readthedocs.io/en/latest/examples.html

Ein Minimalbeispiel für Version 1.8+ sieht folgendermaßen aus:

from influxdb_client import InfluxDBClient, Point
 
bucket = "my-bucket"
client = InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org")
write_api = client.write_api()
 
p = Point("temp_measurement").tag("location", "Berlin").field("temperature", 21.3)
write_api.write(bucket=bucket, record=p)