====== InfluxDB ====== InfluxDB eignet sich hervorragend dafür wiederholende Messwerte aus dem IoT-Umfeld in einer Datenbank zu speichern. Dazu reicht Anfangs bereits ein [[https://simonhearne.com/2020/pi-influx-grafana/|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. * https://devconnected.com/the-definitive-guide-to-influxdb-in-2019/ 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'-Kombination -''Point'' - ein einzelner Messwert in einer Zeitreihe * https://docs.influxdata.com/influxdb/v1.8/query_language/manage-database/ 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. * https://influxdbcom.readthedocs.io/en/latest/content/docs/v0.9/concepts/schema_and_data_layout/ * https://docs.influxdata.com/influxdb/v1.8/concepts/glossary/ 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: === * Version bis 1.7: https://www.influxdata.com/blog/getting-started-python-influxdb/ * Version >= 1.8: https://www.influxdata.com/blog/getting-started-with-python-and-influxdb-v2-0/ 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) ==== Links ==== * https://www.bjoerns-techblog.de/2017/08/influxdb-mit-node-red-fuellen/ * https://medium.com/@itsHabib/send-metrics-to-influxdb-with-telegrafs-http-plugin-fe90ea3ddf46 * https://www.youtube.com/watch?v=OIPwonjPe3E * [[https://www.influxdata.com/blog/writing-data-to-influxdb-with-python/|Writing Data to InfluxDB with Python]]