FHEM > Frontends

Hinweis: Schöne Alternative für Charts/Plots mit Grafana und DBLog (MySQL)

(1/104) > >>

Thyraz:
Hallo zusammen. :)

Worum gehts:
Grafana beschreibt sich als "The open platform for beautiful analytics and monitoring".
Eine Live Demo zum Erkunden findet man hier: http://play.grafana.org

Grafana konnte bis vor kurzem noch nicht mit MySQL als Datasource umgehen, was das Zusammenspiel mit der eigenen DBLog Datenbank erschwerte.
(Dadurch entstand z.B. das hier im Forum erhältliche Modul zum Loggen in eine InfluxDB, womit man eine doppelte Datenhaltung in Kauf nahm.)
Dies hat sich zum Glück seit einiger Zeit geändert und seit Grafana 4.5.1 ist das Ganze sehr brauchbar.

Was ist der Vorteil der Lösung?
- Man kann den angezeigten Zeitraum einfach über ein Dropdown ändern. Dort gibt es viele Presets wie Letzte 24h, 6 Monate, 1 Jahr, ... und eine Auswahl über eine Kalenderansicht.
Auswertungen machen so weit mehr Freude und gehen leicht von der Hand.

- Die Legende kann außerdem automatisch Dinge wie Min/Max/Durchschnitt aller Werte im gerade gewählten Zeitraum mit anzeigen was auch sehr nett ist.

- Man kann direkt in Grafana Dashboards mit verschiedenen Auswertungen arrangieren. Ein weiteres Frontend zur Platzierung mehrerer Charts wird also nicht benötigt.
Das Embedden einzelner Charts in andere Seiten ist aber natürlich auch möglich.

- Es gibt verschiedene Paneltypen, welche neben dem klassischen Chart (Line / Bar / Point) auch Pie Charts oder Tabellen beinhalten.

- Durch die Nutzung von MySQL Select Requests hat man vielseitige Möglichkeiten Daten auszuwerten oder auch schon beim Laden zu manipulieren oder auszudünnen.
Das geschieht dann direkt serverseitig in MySQL und das Ausdünnen entlastet Clients wie etwa Mobilgeräte und erzeugt dann auch weniger Traffic.

- Die UI lädt schnell und ist auf all meinen Geräten flüssig und einfach zu bedienen.
Sie passt sich auch bei Größenänderungen des Fensters (oder drehen des Mobilgeräts) an und zeichnet die Charts hier sehr schnell neu.
Auch das ist ein deutlicher Vorteil gegenüber den Charts die ich bisher mit FHEM/TabletUI/... genutzt hatte.


Installation und Konfiguration kommt im nächsten Post..

Thyraz:
Voraussetzungen:
Ihr braucht eine DBLog Instanz die in eine MySQL Datenbank loggt.
Ich hatte bisher SQLite3 verwendet und habe meine Altdaten daher in eine neue MySQL Datenbank umgezogen.

Installation und Einrichtung einer DBLog Instanz mit MySQL:
https://wiki.fhem.de/wiki/DbLog#Beispiel:_Anlegen_und_Nutzung_einer_Mysql-Datenbank

Sicherung der Altdaten aus SQLite und wieder einspielen in MySQL:
https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#Datens.C3.A4tze_.28Devices.29_von_einer_Datenbank_in_eine_andere_umziehen_.28Export.2FImport.29
Das Beispiel sichert nur Logdaten für ein einzelnes Gerät und nicht für alles aus der DB.
Das lässt sich aber problemlos anpassen, indem man das Attribut device in der DBRep Instanz nicht belegt.

Ein Umstieg von Filelog auf DBLog würde ebenfalls mit dem ober verlinkten Erstellen einer DBLog Instanz mit MySQL starten.
Import der Altdaten aus den Filelogs wäre darüber möglich:
https://forum.fhem.de/index.php/topic,66383.0.html

Installation
Offizieller Download: https://grafana.com/grafana/download
Fertiges Package für den Raspberry Pi, welches einfach mit dpkg -i grafana_X.X.X_armhf.deb installiert werden kann: https://github.com/fg2it/grafana-on-raspberry/releases

Damit Grafana automatisch mit dem System startet muss der Grafana Server noch aktiviert werden.
Bei Verwendung von Systemd wäre das mit folgendem Befehl zu erledigen: sudo /bin/systemctl enable grafana-server

Grafana lauscht per default auf Port 3000.
Dies kann ein Problem sein, falls man Alexa mit Custom Skill nutzt. Dieser Dienst belegt ebenfalls schon Port 3000.
In dem Fall mit sudo nano /etc/grafana/grafana.ini die Konfiguration anpassen folgende Zeile anpassen:
;http_port = 3000
Hier den führenden Semicolon entfernen den Port entsprechend abändern.

Im Grafana Webinterface dann eine neue Datasource vom Typ MySQL anlegen und die Daten eurer FHEM MYSQL Datenbank eintragen (Port/User/Passwort).
Danach solltest ihr startklar sein.  8)

Hinweise zu MySQL Selects in Grafana
Datenstruktur:
An sich ist es egal wie der MySQL Select aussieht. Grafana interessiert nur, dass es 3 Spalten mit der richtigen Benennung geliefert bekommmt.
  - time_sec muss Zeitwerte im UNIX-Timestamp Format (Sekunden seit 01.01.1970) enthalten. Meist der TIMESTAMP Eintrag aus der Datenbank.
  - value muss Werte für die Y-Achse liefern, welche den Zeitstempeln aus time_sec zuzuordnen sind. Meist der VALUE Eintrag aus der Datenbank.
  - metric ist der Text der für die Kurve in der Legende angezeigt wird. Am Besten z.B. den zugehörigen DEVICE Eintrag aus der DB zurückliefern, oder einen festen String.

Beim den VALUE Einträgen von FHEM muss man beachten, dass diese (da sie auch Text beinhalten können) nicht numerisch sind.
Soll schon intern im SELECT eine Berechnung durchgeführt werden wie AVG oder MIN/MAX dann muss man hier CONVERT(VALUE, DOUBLE) oder CONVERT(VALUE, INTEGER) verwenden. Ansonsten wundert man sich evtl, dass 9 größer 12 ist. ;)

Beispiel:

--- Code: ---SELECT
    UNIX_TIMESTAMP(TIMESTAMP) as time_sec,
    VALUE as value,
    "Kurvenbezeichnung" as metric
  FROM history
  WHERE READING="state" AND DEVICE="MyDummy" AND $__timeFilter(TIMESTAMP)

--- Ende Code ---

Nützliche Macros:
Grafana bietet ein paar Macros die man in den MySQL Selects verwenden kann, um die zu ladenden Daten auf den angezeigten Zeitraum zu begrenzen.
  - $__timeFilter(TIMESTAMP) liefert eine Überprüfung auf einen Zeitraum zurück, die man in der WHERE Bedingung verwenden kann (siehe obiges Beispiel)
  - $__timeFrom() liefert den Startzeitpunkt des angezeigten Zeitraums als "YYYY-MM-DD HH:MM:SS" zurück.
  - $__timeTo() liefert den Endzeitpunkt des angezeigten Zeitraums als "YYYY-MM-DD HH:MM:SS" zurück (so loggt auch DBLog in die Datenbank).
  - $__unixEpochFrom() liefert den Startzeitpunkt des angezeigten Zeitraums als UNIX-Timestamp Format (Sekunden seit 01.01.1970) zurück.
  - $__unixEpochTo liefert den Endzeitpunkt des angezeigten Zeitraums als UNIX-Timestamp Format (Sekunden seit 01.01.1970) zurück.

Thyraz:
Beispiel: Line-Chart für Temperatursensor

Erstellt ein neues Dashboard und dort eine neues Panel vom Typ Chart.
Klickt auf den Panel-Title und im Popup Menu auf Edit.

Wählt hier den Tab "Metrics" um die MySQL Definition anzupassen.
Ersetzt den Code mit diesem hier:


--- Code: ---SELECT
  UNIX_TIMESTAMP(TIMESTAMP) as time_sec,
  VALUE as value,
  "Garten" as metric
FROM history
WHERE READING="temperature" AND DEVICE="Thermometer02" AND $__timeFilter(TIMESTAMP)

--- Ende Code ---

Danach könnt ihr auf Add Query klicken falls ihr weitere Kurven zu dem Diagramm hinzufügen wollt (weitere Temperatursensoren).

Zu guter Letzt könnte man noch im Reiter General den Chart Title anpassen, im Reiter Axes die Unit auf "°C" setzen und im Reiter Legend entscheiden ob ihr Min/Max/Durchschnittswerte unter dem Diagramm wollt.

Thyraz:
Beispiel: Bar Chart mit monatlichen Verbräuchen
Ich habe in meiner Datenbank Logeinträge von mehreren Statistic-Modul Instanzen die mir den täglichen / monatlichen / jährlichen Stromverbrauch diverser Geräte aufzeichnen.

Das Problem ist hier, dass zB. bei den monatlichen Verbräuchen der Timestamp 5 Sekunden vor dem Monatswechsel geloggt wird.
Dadurch sitzt der Balken im Diagramm mehr im nächsten Monat als im eigentlich zugehörigen.
Um das zu umgehen wird die DATE_FORMAT Funktion von MySQL genutzt um Uhrzeit und Tag des Monats im Timestamp zu manipulieren:


--- Code: ---SELECT
  UNIX_TIMESTAMP(DATE_FORMAT(TIMESTAMP, '%Y-%m-01')) as time_sec,
  VALUE as value,
  "Trockner" as metric
FROM history
WHERE READING="statEnergyValMonthLast" AND DEVICE="Dummy_PowerSwitch04" AND $__timeFilter(TIMESTAMP)

--- Ende Code ---

- Im Reiter Display ist der Draw Mode statt Line auf Bars gesetzt
- Im Reiter Time Range habe ich Override relative time auf 1 Jahr (1y) gesetzt
- Beim Select Statement für das zweite Gerät im Balkendiagramm habe ich den Tag in der DATE_FORMAT Funktion nicht auf 1, sondern auf 4 gesetzt. Dadurch sind die Balken etwas versetzt zu einander.
Das ist optisch von Vorteil falls der hintere Balken mal kleiner ist als vordere.

Thyraz:
Beispiel: Mehrere Linecharts stapeln
Um mehrere Schaltsignale (in diesem Fall Ventile der Fußbodenheizung) in einem Chart dazustellen, habe ich den Y-Wert (0 oder 1) der einzelnen Kurven im Select Statement mit unterschiedlichen Offsets verrechnet.
Dadurch werden die Linien untereinander gezeichnet und sind besser ablesbar.

Erste Linie ohne Offset:

--- Code: ---SELECT
  UNIX_TIMESTAMP(TIMESTAMP) as time_sec,
  CONVERT(VALUE, INTEGER) + 2 as value,
  "Flur" as metric
FROM history
WHERE READING="Heizkreis_Flur" AND DEVICE="Heizung" AND $__timeFilter(TIMESTAMP)

--- Ende Code ---

Zweite Linie mit Offset:

--- Code: ---SELECT
  UNIX_TIMESTAMP(TIMESTAMP) as time_sec,
  CONVERT(VALUE, INTEGER) + 2 as value,
  "Wohnzimmer" as metric
FROM history
WHERE READING="Heizkreis_Wohnzimmer" AND DEVICE="Heizung" AND $__timeFilter(TIMESTAMP)

--- Ende Code ---

Die weiteren Linien dann eben mit entsprechend größeren Offsets.
Die Achsenbeschriftung der Y-Achse habe ich bei dem Diagramm dann ausgeblendet, da sie keine sinnvolle Information liefert.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln