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.
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:
Database
- Sammlung von Zeitreihen ( wird in v2.0 als Bucket
bezeichnet)Measurement
- Folge von zusammengehörigen Datenpunkten mit dem gleichen Schema (Zeitreihe)Series
- eine logisch zusammenhängende Folge von Datenpunkten mit der gleichen 'Tag'-KombinationPoint
- ein einzelner Messwert in einer ZeitreiheDas 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/
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
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)