Grafana und InfluxDb

FHEM #6 – Grafana und InfluxDB

Grafana und InfluxDb

Im ersten Beitrag der FHEM-Serie habe ich Grafana und die InfluxDB bereits kurz erwähnt und hier ist nun endlich der ausführliche Beitrag dazu. Die Installation von Grafana und InfluxDB unter Raspbian und Ubuntu wurde von Patrick schon hervorragend erklärt. In diesem Beitrag geht es nun um die Integration in FHEM.

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:

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

update

wird das System inkl. dem neuen Modul geupdatet.

grafana

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

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.

define InfluxDBLog_UG.Pergola.Temperatur.Luftfeuchtesensor InfluxDBLog 192.168.178.143 8186 fhem_thd user passwort UG.Pergola.Temperatur.Luftfeuchtesensor:.*
attr InfluxDBLog_UG.Pergola.Temperatur.Luftfeuchtesensor group Temperatursensor/Luftfeuchtesensor
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.

grafana

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.

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"
attr DbLog_Spritpreise_alte_DbLog_Eintraege_loeschen_Tanken_Weissenstein_bft group Spritpreise
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”
grafana

Danach noch einen Namen für die Datenbank vergeben.

grafana

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

grafana

und danach auf “+Add data source”

grafana

Jetzt kann sollte man alle notwendigen Verbindungsdaten eingeben.

grafana

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

grafana

 

Plots in Grafana erstellen

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

grafana

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

grafana

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

grafana

Danach erscheint ein neues und leeres “Panel”.grafana

Um das Panel zu editieren muss man auf den “Panel title” klicken und danach auf “Edit”grafana

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:

grafana

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:

grafana grafana grafana grafana

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

grafana

und danach auf die Diskette klickt.

grafana

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

Grafana und InfluxDbgrafanagrafana

 

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

grafana

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:

grafana

 

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.

grafana

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

grafana

 

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

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

Den Link muss man dann noch entsprechend anpassen.

Das Ergebnis sieht dann bei mir so aus:

grafana

 

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

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

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

grafana

 

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:

grafana

grafana

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”

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:

grafana

Im Vergleich zum korrekten Plot mit der InfluxDB

grafana

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.

Reinhard

Autor von frombeyond.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.