FHEM #6 – Grafana und InfluxDB

Blogbanner 6: Grafana + InfluxDB

Einleitung

Daten aus FHEM in die InfluxDB-Datenbank zu bekommen war bisher gar nicht so einfach. Man konnte dies über den Umweg mittels Telegraf machen, welches vor allem das FHEM Zeitformat so umformatierte das es die InfluxDB-Datenbank verarbeiten konnte.

Dank des users "d.schoen" aus dem FHEM-Forum, hat sich der oben genannte und komplizierte Weg erledigt. Er hat ein Modul gezaubert, welches direkt aus FHEM heraus in die InfluxDB-Datenbank schreiben kann.

Installation des FHEM-Moduls

Die Integration des Moduls in FHEM ist dabei denkbar einfach. Im ersten Schritt wird dazu in das obere Eingabefeld folgender Befehl eingegeben:

Code
  1. update add https://raw.githubusercontent.com/dsgrafiniert/fhem-InfluxDBLog/master/controls_influx.txt

Dieser Befehl fügt das Modul zur Updateroutine hinzu. Das heißt mit dem nächsten Befehl

Code
  1. update

wird das System inkl. dem neuen Modul geupdatet.



Danach kann mit der Definition der InfluxDB weitergemacht werden. Die allgemeine Beschreibung sieht wie folgt aus:

Code
  1. define <name> InfluxDBLog <host> <port> <DB> <username> <passwort> <regex>

Ich betreibe meine InfluxDB-Datenbank nicht auf dem gleichen Server auf dem FHEM läuft. Daher sieht meine Definition so aus.

Code
  1. define InfluxDBLog_UG.Pergola.Temperatur.Luftfeuchtesensor InfluxDBLog 192.168.178.143 8186 fhem_thd user passwort UG.Pergola.Temperatur.Luftfeuchtesensor:.*
  2. attr InfluxDBLog_UG.Pergola.Temperatur.Luftfeuchtesensor group Temperatursensor/Luftfeuchtesensor
  3. attr InfluxDBLog_UG.Pergola.Temperatur.Luftfeuchtesensor room InfluxDBLog

Betreibt man InfluxDB auf dem gleichen System wie FHEM kann man die IP durch "localhost" ersetzen. Nicht vergessen den "user" und das "passwort" entsprechend den eigenen Vorgaben zu ersetzen.

Achtung bei mir liegt die InfluxDB nicht auf dem Standardport sondern auf Port 8186.


Vergleich InfluxDB und MariaDB

Zur Zeit hab ich 3 Datenbanken in InfluxDB am laufen. Eine für Temperaturen, Feuchtigkeiten und Taupunkte (THD) sowie jeweils eine für Stromverbräuche und Spritpreise.



Der Vorteil von InfluxDB ist, das ich Datenbanken so definieren kann, das Werte nur einen bestimmten Zeitraum lang gespeichert werden um die Datenbank klein und performant zu halten. So enthält z .B. bei mir die Datenbank mit den Spritpreisen nur Daten der letzten 30 Tage, was für mich und meine Grafana-Plots ausreicht.



In MariaDB vielleicht so auch möglich, aber ich selber habe zumindest bisher die Vorhaltezeit von 30 Tagen über ein tägliches Löschkommando direkt in FHEM bewerkstelligt. Im Beispiel-Code beschreibe ich das Löschen von Daten einer gespeicherten Tankstelle täglich um 2:33Uhr in einem Intervall von 30 Tagen bis 1 Jahr, was ja locker ausreicht, da ja täglich gelöscht wird. So bleiben immer exakt die letzten 30 Tage in der MariaDB Datenbank gespeichert.

Code
  1. define DbLog_Spritpreise_alte_DbLog_Eintraege_loeschen_Tanken_Weissenstein_bft at *02:33:00 set DbLog_Spritpreise userCommand delete FROM history WHERE TIMESTAMP BETWEEN DATE_SUB(CURRENT_DATE(),INTERVAL 1 year) AND DATE_SUB(CURRENT_DATE(),INTERVAL 30 day) AND DEVICE = "Tanken_Weissenstein_bft"
  2. attr DbLog_Spritpreise_alte_DbLog_Eintraege_loeschen_Tanken_Weissenstein_bft group Spritpreise
  3. attr DbLog_Spritpreise_alte_DbLog_Eintraege_loeschen_Tanken_Weissenstein_bft room DbLog

Mit den Löschkommandos sollte man sehr vorsichtig sein, daher am besten vorher immer Testen (über das select-Kommando) und vor allem Backups machen.

InfluxDB mit Grafana verbinden

Zuerst sollte man eine Datenbank in InfluxDB erstellen. Dies geht das am schnellsten mit dem Dropdown-Menü "Query Templates" -> "Create Database"





Danach noch einen Namen für die Datenbank vergeben.



Danach in Grafana über das Dropdown-Menü auf "Data Sources" klicken



und danach auf "+Add data source"



Jetzt kann sollte man alle notwendigen Verbindungsdaten eingeben.



Danach auf "Save & Test" klicken um die Verbindung zu überprüfen und abzuspeichern. So sehen dann meine verknüpften Datenbanken aus:




Plots in Grafana erstellen

Plots in Grafana zu erstellen ist recht simpel. Zuerst klickt man in Grafana über das Dropdown-Menü auf "Dashboards".



Danach kann man ein vorhandenes Dashboard verwenden oder ein neues Erstellen.



Erstellt man ein neues Dashboard stehen einem verschiedene Möglichekiten der Darstellung zur Verfügung. Ich wähle hier in der Regel "Graph" aus.



Danach erscheint ein neues und leeres "Panel".

Um das Panel zu editieren muss man auf den "Panel title" klicken und danach auf "Edit"

Der wichtigste Reiter ist hierbei der "Metrics"-Reiter. In ihm werden die Abfragen aus der InfluxDB-Datenbank definiert. Die Definition für eine Temperaturkurve sieht bei mir dann so aus:



Wichtig ist hierbei auch die richtige Datenbank, bei mir fhem_thd, auszuwählen. Die restlichen Kurven sind über die rechten Buttons einfach nur kopiert und entsprechend angepasst.

Die Einstellungen in den restlichen Reiter sehen bei mir dann so aus:








In den nicht dargestellten Reitern habe ich vorerst nichts eingestellt.

Ist alles eingestellt muss das Dashboard noch gespeichert werden. Die gelingt in dem man zuerst zum Dashboard zurückkehrt



und danach auf die Diskette klickt.



Ich hab bei mir mal eine kleine Auswahl an Sensoren und Messwerten in Dashboards zusammengefasst:




Erwähnen möchte ich hier noch die Zeitbereichs-Auswahl. Diese erreicht man oben rechts:



Hier lassen sich verschiedene vordefinierte Zeitbereiche auswählen. Daneben lassen sich auch eigene Zeitbereiche definieren. Dabei kommen so schöne Plots wie hier zu sehen heraus:




Plots aus Grafana wieder in FHEM einbinden

Plots die in Grafana definiert wurden, können natürlich wieder in FHEM eingebunden werden. Dazu muss zuerst in Grafana in einem beliebigen Plot das Share-Panel mit rechtem Mausklick auf "Share" geöffnet werden.



Danach auf "Embed" klicken, Haken bei "time range" entfernen und den Link kopieren.



Zurück in FHEM kann mit folgendem Code der Plot integriert werden:

Code
  1. define Grafana_Spritpreise weblink iframe http://192.168.178.143:3000/dashboard-solo/db/spritpreise?panelId=1&orgId=1
  2. attr Grafana_Spritpreise htmlattr width="1024" height="560" frameborder="0"
  3. attr Grafana_Spritpreise room Spritpreise

Den Link muss man dann noch entsprechend anpassen.
Das Ergebnis sieht dann bei mir so aus:



Auch in das Tablet-UI kann ein Grafana-Plot integriert werden. Dafür ergänze ich folgenden Code in meiner html-Datei:

Code
  1. <li data-row="4" data-col="1" data-sizex="5" data-sizey="2">
  2. <header><div data-type="label" class="large">Spritpreise</div></header>
  3. <iframe width="800" height="280" frameborder="0" scrolling="no" src="http://192.168.178.143:3000/dashboard-solo/db/spritpreise?orgId=1&panelId=1">
  4. </iframe>
  5. </li>

Das Ergebnis sieht so bei mir aus (Hinweis: Mein Tablet-UI ist noch sehr rudimentär :-) ):



So schließt sich der Kreis bestehend aus FHEM, InfluxDB und Grafana.


Grafana + MariaDB


Jetzt frägt sich bestimmt jeder: Warum kann ich nicht mit meiner vorhandenen SQL-Datenbank Plots in Grafana erzeugen? Ja das geht natürlich auch. Ich möchte hier aber nur kurz darauf eingehen, denn das Grafana-Plugin für MySQL Datenbanken hat noch den Alpha Status (Stand 31.07.2017).

In Grafana muss zuerst eine neue MySQL Datenquelle in den "Data Sources" angegeben werden:





Hierbei unbedingt die Hinweise aus der Grafana Dokumentation beachten. Also man sollte für die Abfrage der Daten einen eignen user in der SQL-Datenbank anlegen, da man sich sonst die Datenbank leicht zerschießen kann.

Hat man die Datenquelle erzeugt kann auch schon mit der Definition eines Plots begonnen werden. Ich habe dafür meinen Warmwasserspeicher 1 exemplarisch verwendet. Um Daten aus der Datenbank herauszubekommen verwende ich pro Sensor folgende "Metrics"

SQL
  1. SELECT UNIX_TIMESTAMP(TIMESTAMP) as time_sec, VALUE as value, device as metric FROM fhem.history where READING="temperature" AND DEVICE="UG.Heizraum.Speicher.1.Tempsensor.1"

Die restlichen Sensoren 2-4 ergänze bzw. kopiere ich entsprechend und bekomme dann folgenden Plot:



Im Vergleich zum korrekten Plot mit der InfluxDB



sieht man optisch außer der unterschiedlichen Autorange keine großen Unterschiede. Allerdings unterscheiden sich aus unerklärlichen Gründen die min/max-Werte bei einigen Sensoren. Auch die Ladezeit für den MariaDB-Plot ist erheblich länger als wie für den InfluxDB-Plot. Wer also Grafana mit MySQL/MariaDB verwenden möchte muss zur Zeit noch mit einigen Einschränkungen leben.

    Über den Autor

    Autor von worldoftech.de. Smart-Home-Verrückter.


    Nutzt Zuhause FHEM zusammen mit HomeMatic, JeeLink, 1-Wire, Flammtronik / Atmos HV, Buderus KM271, Philips HUE, Xiaomi Yeelight, Alexa, Sonos, FritzBox, Ubiquiti UniFi APs, APC UPS, APC PDU, IPMI. MariaDB, InfluxDB und Grafana zur Auswertung. Als Hardware-Untersatz kommen mehrere RaspberryPis und Supermicro Serverhardware zum Einsatz. Softwareseitig werden hauptsächlich Raspbian, Ubuntu, ESXi und Docker verwendet.

    Reinhard Team

    Kommentare