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

Begonnen von Thyraz, 08 Oktober 2017, 15:02:38

Vorheriges Thema - Nächstes Thema

triagony

Guten Morgen. Noch einmal danke für deine Antwort.

Vorweg zur Info: Grafana und Fhem laufen bei mir auf dem gleichen Host, nur auf unterschiedlichen Ports (fhem: 8083 / grafana: 3001). Für Fhem selbst habe ich einen reverse Proxy eingerichtet, mit dem ich von außen, d.h. aus dem Internet über https://domain auf Fhem zugreifen kann. Der reverse Proxy liegt auf einem anderen Host (jeweils virtuelle Maschinen). Meine Apache-Config hierfür sieht so aus:


<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName DOMAIN

    ServerAdmin EMAIL
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/DOMAIN.error.log
    CustomLog ${APACHE_LOG_DIR}/DOMAIN.access.log combined

    SSLCertificateFile /etc/letsencrypt/live/DOMAIN/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/DOMAIN/privkey.pem

    Include /etc/letsencrypt/options-ssl-apache.conf

    ProxyRequests Off
    ProxyVia Off
    ProxyPreserveHost On

    <Location /fhem>
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule /fhem(.*)           ws://FHEM-IP:8083/fhem$1 [P,L]
    RewriteCond %{HTTP:Upgrade} !=websocket [NC]
    RewriteRule /fhem(.*)           http://FHEM-IP:8083/fhem$1 [P,L]


        ProxyPass  http://FHEM-IP:8083/fhem
        ProxyPassReverse  http://FHEM-IP:8083/fhem
# ProxyHTMLURLMap passt Links im HTML/JavaScript Source an
  ProxyHTMLURLMap /        /fhem/
  ProxyHTMLURLMap /fhem/     /fhem/

        AuthType Basic
        AuthName "Password Required"
        AuthUserFile /etc/fhem-htpasswd
        Require valid-user
        Order deny,allow
        Allow from all
</Location>
<Directory />
   RedirectPermanent / /fhem
</Directory>
</VirtualHost>
</IfModule>


Für Grafana (läuft auf dem gleichen Host wie FHEM nur auf einem anderen Port, s.o.) habe ich - wie gesagt - bisher keine eigene von außen über den reverse Proxy erreichbare Adresse eingerichtet.

Mit "in Fhem einbinden" meine ich das Einbinden eines Graphen mittels Weblink in folgender Form (Beispiel):

define NAME weblink image http://[GRAFANA-IP]:3001/render/dashboard-solo/db/dashboard?orgId=1&from=now-2d&to=now&panelId=2&width=780&height=480&tz=UTC%2B02%3A00&theme=light

Das funktioniert auch, solange ich mich im gleichen LAN befinde. Es funktioniert nicht, wenn ich mich über den rProxy auf die Fhem-Oberfläche verbinde und dort den Grafana-Graphen anzeigen lassen möchte. Dort erscheint dann nur ein Platzhalter für den Graphen.

Wenn ich nun - weil es anders nicht geht(?) - auch grafana von außen erreichbar mache (mittels reverse proxy), müsste ich dann in meinem weblink-Beispiel die von außen erreichbare Domain im Link eintragen, richtig? Oder gibt es doch einen Weg, die LAN-IP zu nutzen? Ich fänd es ziemlich umständlich, die Grafana-Graphiken, über das Internet einzubinden / abzurufen, wenn doch die Graphiken an sich auf dem gleichen Host wie Fhem liegen.

Vielleicht habe ich aber auch nur einen (oder mehrere) Denkfehler?

Danke und beste Grüße

RoBra81

Hallo,

ich kenne mich zwar mit dem ReverseProxy nicht aus, aber eine möglich Alternative wäre es vielleicht, die Bilder von Grafana mittels cronjob und wget zyklisch auf dem Server ablegen zu lassen (z.B. im FHEM-WWW-Verzeichnis) und von dort aus anzuzeigen - könnte unter Umständen sogar schneller laden  ;)

Ronny

sku

Zitat von: RoBra81 am 04 April 2018, 11:18:47
Hallo,

ich kenne mich zwar mit dem ReverseProxy nicht aus, aber eine möglich Alternative wäre es vielleicht, die Bilder von Grafana mittels cronjob und wget zyklisch auf dem Server ablegen zu lassen (z.B. im FHEM-WWW-Verzeichnis) und von dort aus anzuzeigen - könnte unter Umständen sogar schneller laden  ;)

Ronny
Dann wäre doch der Vorteil von Grafana dahin, dass man in der Grafik zB. rumzoomen kann.

Zitat von: triagony am 04 April 2018, 10:40:36
Mit "in Fhem einbinden" meine ich das Einbinden eines Graphen mittels Weblink in folgender Form (Beispiel):

define NAME weblink image http://[GRAFANA-IP]:3001/render/dashboard-solo/db/dashboard?orgId=1&from=now-2d&to=now&panelId=2&width=780&height=480&tz=UTC%2B02%3A00&theme=light

Das funktioniert auch, solange ich mich im gleichen LAN befinde. Es funktioniert nicht, wenn ich mich über den rProxy auf die Fhem-Oberfläche verbinde und dort den Grafana-Graphen anzeigen lassen möchte. Dort erscheint dann nur ein Platzhalter für den Graphen.

Wenn ich nun - weil es anders nicht geht(?) - auch grafana von außen erreichbar mache (mittels reverse proxy), müsste ich dann in meinem weblink-Beispiel die von außen erreichbare Domain im Link eintragen, richtig? Oder gibt es doch einen Weg, die LAN-IP zu nutzen? Ich fänd es ziemlich umständlich, die Grafana-Graphiken, über das Internet einzubinden / abzurufen, wenn doch die Graphiken an sich auf dem gleichen Host wie Fhem liegen.

Ich meine, es muss Grafana auch von außen erreichbar sein. Den Weblink ruft ja der Browser auf, daher muss das ebenfalls über den Apache Proxy laufen.
Wenn du im internen LAN bist und die von außen erreichbare Domain aufrufst, sollte der Router das direkt umleiten und nicht über das Internet schicken.


Gruß

triagony

Zitat von: sku am 05 April 2018, 15:11:21
Dann wäre doch der Vorteil von Grafana dahin, dass man in der Grafik zB. rumzoomen kann.

Ich meine, es muss Grafana auch von außen erreichbar sein. Den Weblink ruft ja der Browser auf, daher muss das ebenfalls über den Apache Proxy laufen.
Wenn du im internen LAN bist und die von außen erreichbare Domain aufrufst, sollte der Router das direkt umleiten und nicht über das Internet schicken.


Gruß
Na dann werde ich wohl diesen Weg gehen (müssen). Vielen Dank nochmal.

Beste Grüße

Gesendet von meinem SM-G950F mit Tapatalk


RoBra81

Zitat von: sku am 05 April 2018, 15:11:21
Dann wäre doch der Vorteil von Grafana dahin, dass man in der Grafik zB. rumzoomen kann.

Ja, ich selbst habe es auch als iFrame direkt eingebunden, aber dem Code von @triagony hatte ich entnommen, dass er es sowieso schon als image einbindet...

sku

Zitat von: RoBra81 am 05 April 2018, 15:16:38
Ja, ich selbst habe es auch als iFrame direkt eingebunden, aber dem Code von @triagony hatte ich entnommen, dass er es sowieso schon als image einbindet...
Tatsache, so genau hatte ich vorhin gar nicht geschaut...

Kai-Alfonso

Guten Morgen,

ich habe Grafana im Docker Containter laufen, welches sich dann hin und wieder mit Watchtower automatisch updated.

Naja, es scheint das Grafana irgendwas geändert hat - in meinen Graphen (die vorher gingen), bekomme ich folgende Fehlermeldung:

Zitat"Value column must have numeric datatype, column: value type: string value

Der Select dazu sieht folgendermaßen aus:

SELECT
UNIX_TIMESTAMP(DATE_FORMAT(TIMESTAMP, '%Y-%m-%d %H')) as time_sec,
    VALUE as value,
    "Wasserverbrauch Stunde" as metric
  FROM history
  WHERE READING="LitreHourLast" AND DEVICE="Wasserzaehler" AND $__timeFilter(TIMESTAMP)


Jemand eine Idee?
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

Thyraz

Hab bei mir Grafana länger nicht aktualisiert.
Evtl. sind die etwas strikter bei den Datentypen geworden statt automatisch zu konvertieren.

Hier war mal ein manuellen konvertieren drin, da man mit Strings nicht as "+2" hätte rechnen können:
https://forum.fhem.de/index.php/topic,77724.msg697780.html#msg697780

Falls du was mit Komma statt nur Ganzzahlen brauchst, müsstest du mal suchen wie SQL das statt Integer nennt.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Kai-Alfonso

Zitat von: Thyraz am 08 Mai 2018, 08:51:45
Hab bei mir Grafana länger nicht aktualisiert.
Evtl. sind die etwas strikter bei den Datentypen geworden statt automatisch zu konvertieren.

Hier war mal ein manuellen konvertieren drin, da man mit Strings nicht as "+2" hätte rechnen können:
https://forum.fhem.de/index.php/topic,77724.msg697780.html#msg697780

Falls du was mit Komma statt nur Ganzzahlen brauchst, müsstest du mal suchen wie SQL das statt Integer nennt.

Hey danke - ich hab es jetzt dank deines Hinweises so hinbekommen (keine Ahnung, ob es auch anders geht)

Aus

VALUE as value

wurde

CONVERT(VALUE, INTEGER) as value,

Damit werden die Graphen wieder dargestellt ;D ;D
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

sku

Zitat von: Kai-Alfonso am 08 Mai 2018, 09:05:12
CONVERT(VALUE, INTEGER) as value,

Damit werden die Graphen wieder dargestellt ;D ;D

Mir half
CONVERT(VALUE, double) as value,
da mit deiner Lösung die Nachkommastellen von Temperaturen gerundet werden.


Habe meinen Code in Antwort #19 ebenfalls angepasst.

fhemfreund

Habe auch mal Grafana installiert und in Fhem eingebunden. Bin soweit sehr zufrieden :-)

Bei der Darstellung eines Stromverbrauch-Plots komme ich aber nicht weiter.
Mein SQL Statement selektiert nach den in letzter Stunde verbrauchen KWh, die immer um **.59:55 der jeweiligen Stunde geschrieben werden:


SELECT
  UNIX_TIMESTAMP(TIMESTAMP) as time_sec,
  CONVERT (VALUE,DECIMAL(7,3)) as value,
  "Stromverbrauch" as metric
FROM history
WHERE READING="statKWhHourLast" AND DEVICE="ESPEasy_HmWifiEng2_Energy_Total" AND $__timeFilter(TIMESTAMP)


Allerdings stellt Grafana diese für die darauf folgende Stunde dar (siehe angehängte Grafik), obwohl es ja eine Aufsummierung der vergangenen Stunde ist (und auch der Datensatz noch innerhalb dieser in die DB geschrieben wird).

Gibt es eine Möglichkeit, die Bar-Charts daher an den Anfang der entsprechenden Stunde zu plotten?
Habe es schon mit 'Timeshift' im Tab 'Time-Range' versucht - allerdings verschiebt dieser nur die X-Achse um eine Stunde, aber nicht die Darstellung der Bar-Charts ...

Andreas

SabineT

Du könntest mit:

SELECT
  (UNIX_TIMESTAMP(TIMESTAMP) DIV 3600)* 3600  as time_sec,
  CONVERT (VALUE,DECIMAL(7,3)) as value,
  "Stromverbrauch" as metric
FROM history
WHERE READING="statKWhHourLast" AND DEVICE="ESPEasy_HmWifiEng2_Energy_Total" AND $__timeFilter(TIMESTAMP)


die Minuten und Sekunden auf 0 setzen.

Sabine

Thyraz

Genau. Grafana weiß ja nicht, dass es sich um einen Tageswert handelt.
Das Ereignis in der Datenbank beginnt bei 59 Minuten und 55 Sekunden.

Da zeichnet es Grafana dann eben in den Grafen, was für dich aussieht als ob es bei der Folgestunde losgeht.

Den Zeitstempel beim Laden so zu manipulieren, dass er auf den Anfang der Stunde statt das Ende zeigt, sollte das Problem also lösen.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

fhemfreund

Zitat von: SabineT am 06 August 2018, 07:55:32
Du könntest mit:

SELECT
  (UNIX_TIMESTAMP(TIMESTAMP) DIV 3600)* 3600  as time_sec,
  CONVERT (VALUE,DECIMAL(7,3)) as value,
  "Stromverbrauch" as metric
FROM history
WHERE READING="statKWhHourLast" AND DEVICE="ESPEasy_HmWifiEng2_Energy_Total" AND $__timeFilter(TIMESTAMP)


die Minuten und Sekunden auf 0 setzen.

Sabine

Klasse Tip - hat einwandfrei funktioniert. Danke dafür. Da ich allerdings kein SQL-Jünger bin: was ist denn der Trick hinter dem Teilen und Multiplizieren der Sekunden einer Std.?

Andreas

SabineT

Zitat von: fhemfreund am 08 August 2018, 00:47:00
Klasse Tip - hat einwandfrei funktioniert. Danke dafür. Da ich allerdings kein SQL-Jünger bin: was ist denn der Trick hinter dem Teilen und Multiplizieren der Sekunden einer Std.?

Andreas
Das ist eigentlich nichts SQL Spezifisches.

DIV ist eine Division, bei der beim Ergebnis der Teil hinter dem Komma weg gelassen wird. Wenn du also z.B. einen Timestamp "01:59:59" hast (also 1 Stunde, 59 Minuten, 59 Sekunden), dann wird das erst mal auf 7199 Sekunden umgerechnet (den Datumsanteil hab ich der Einfach heit halber hier mal weg gelassen), nach dem DIV 3600 bleibt dann 1 als Ergebnis über.

Grafana will aber den Wert in Sekunden haben, daher wird das dann einfach wieder mit 3600 Multipliziert.
Dadurch wird aus "01:59:59" eben dann "01:00:00".

Sabine