NEWS
Grafana Diagramm per Telegram versenden
-
Hi
Hier eine kleine Doku wie man Grafana Diagramme per Telegram versenden kann.
Ich habe von der kompletten Doku nichts selbst erfunden, sondern aus diversen Quellen zusammen kopiert.Läuft auf Raspi4/4GB
Grundidee:
Grafana Diagramm als PNG rendern, lokal speichern und per Telegram versenden.
Fazit:
Läuft
*Telegram mit "eigener Tastatur" als Menüsteuerung1. Grafana und ggf. influxdb installieren
Das ist hier schon perfekt beschrieben:
https://www.verdrahtet.info/2020/02/14/installation-von-influxdb-grafana-inkl-verbindung-zu-iobroker/login: admin/admin
2. Diagramm als PNG rendern
Wenn man jetzt in Grafana versucht das Diagramm zu exportieren, stolpert man über das erste Problem:
Da PhantomJS nicht so einfach für ARM vorhanden ist, muss man also die render-Engine tauschen.
2.1 per SSH auf den raspi einloggen
https://www.heise.de/tipps-tricks/Raspberry-Pi-SSH-einrichten-so-geht-s-4190645.htmldanach muss eine ganze Reihe an Befehlen ausgeführt werden.
sudo su apt-get update apt-get install git cd /var/lib/grafana/plugins git clone https://github.com/grafana/grafana-image-renderer cd grafana-image-renderer npm -g install yarn npm -g install npm npm -g install yarn npm -g install typescript npm config set unsafe-perm=true npm i grpc npm i husky npm i puppeteer npm i postinstall npm i install npm install yarn install --pure-lockfile yarn run build cp plugin_start_linux_amd64 plugin_start_linux_arm
jetzt kann man endlich den chromium Browser installieren
sudo apt-get install chromium-browser
Danach kann man in der frisch kopierten Datei den Chromium hinterlegen.
/var/lib/grafana/plugins/grafana-image-renderer/plugin_start_linux_armnano plugin_start_linux_arm
und die rote Zeile einfügen
export GF_RENDERER_PLUGIN_CHROME_BIN="/usr/bin/chromium-browser"
EDIT: mittlerweile heißt der chromium browser wohl nur noch chromium.
daher muss man die Zeile in#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
export GF_RENDERER_PLUGIN_CHROME_BIN="/usr/bin/chromium"
node ${DIR}/build/app.jsändern
Danach mit
[Strg] + [O] und [Strg] + [X]
speichern und beenden#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
export GF_RENDERER_PLUGIN_CHROME_BIN="/usr/bin/chromium-browser"
node ${DIR}/build/app.jsFertig.
Jetzt noch neu starten
sudo systemctl restart grafana-server.service
und nach 30 Sekunden testen ob der service sauber gestartet wurde:
sudo systemctl status grafana-server.service
logs finden sich hier
/var/log/grafana
Am besten startet man den Raspi einmal neu.... keine Ahnung ob das nötig ist, unter "Windows95 gelernt" - funktioniert bis heute...
3. Diagram als PNG Bild exportieren (TEST)
Wenn es funktioniert --> gleich den Link kopieren
4. Bild per CURL und API Key speichern
https://mattionline.de/grafana-api-export-graph-as-png/#get-the-graph-urlEinfach in Grafana den API key generieren.
Danach wie von Matti beschrieben den CURL Befehl zusammenbasteln
curl -H "Authorization: Bearer eyJrIjoieDRzbjh6R1__APIKEY__joiZXhwb3J0IiwiaWQiOjF9" "http://192.168.2.132:3000/render/dashboard-solo/db/mathias?panelId=22&from=now-24h&to=now&width=1000&height=500" > ./home/pi/filename.png
rot = dein API key
grün = dein Verzeichnis der Wahl5. Blockly Beispiel
In diesem Beispiel wird der EXEC Befehl mit dem CURL command abgesetzt und das Bild im Ordner
./home/pi/GrafanaExportTelegram gespeichert.
Danach wartet das Skript 7 Sekunden (die Generierung dauert ca 5 Sekunden auf dem Raspi4)
Danach wird im Telegram Blockly einfach der Pfad zur Datei als text eingetragen.Hinweis:
- Auf die Rechte des Ordners achten, falls ihr einen neuen anlegt. (777)
- JavaScript Adapter muss ebenfalls den exec Befehl erlauben
Offene Punkte:
- Es kann sein, dass die Grafik gepuffert wird - dann muss man die Datei jeweils dynamisch benennen.
- Man sollte die PNGs wohl irgendwann auch wieder löschen
Vermutlich bekommt der eine oder andere Linux Halbgott einen Anfall, dass hier fast alles mit "sudo su" installiert wurde.
Falls dem so ist --> gerne die Doku verbessern, aber bitte keine Security-Triaden hier posten.Viel Spaß damit.
Diese Funktion hat mir seit meinem Wechsel von FHEM immer gefehlt.Wichtigste Quellen:
https://mattionline.de/grafana-api-export-graph-as-png/#get-the-graph-url
https://community.openhab.org/t/tutorial-grafana-rendering-on-raspberry-pi/71777/58
https://www.verdrahtet.info/2020/02/14/installation-von-influxdb-grafana-inkl-verbindung-zu-iobroker/ -
Eine Frage zu deinem (sehr interessanten) Showcase:
läuft der PI bei Dir mit grafischer Oberfläche, oder geht das ganze auch wenn keine Oberfläche installiert ist ?
A.
-
@Asgothian
Keine GUI installiert. Chrome wird nur im headless Modus aufgerufen. -
zur Info: Ab Grafana V7.x wird PhantomJS nicht mehr offiziell unterstützt:
https://grafana.com/docs/grafana/latest/administration/image_rendering/Ich habe das daher wie empfohlen mit einem separaten Docker Container umgesetzt:
-
Diesen Docker Container zusätzlich implementieren:
https://hub.docker.com/r/grafana/grafana-image-renderer -
Im Grafana-Container dieses Environment setzen:
https://github.com/grafana/grafana-image-renderer/blob/master/docs/remote_rendering_using_docker.mdGF_RENDERING_SERVER_URL: http://<IP Renderer>:<PORT Renderer>/render
GF_RENDERING_CALLBACK_URL: http://<IP Grafana>:<PORT Grafana>/
GF_LOG_FILTERS: rendering:debug -
Link für Grafik ermitteln unter Panel/Share/Direct link rendered image
-
Das Bild erzeuge ich dann via JavaScript und lege es in 0_userdata.0 ab damit es vom iobroker genutzt werden kann:
const LogLevel = 'warn'; const fs = require('fs'); function GetGrafanaBild(pPic, pURL) { const GrafanaBild = 'iobroker-data/files/0_userdata.0/tmp/' + pPic; const GrafanaURL = 'http://<IP+PORT Garafana>/render/d-solo/' + pURL; request.get({url: GrafanaURL, encoding: "binary"},function(error,response,body){ fs.writeFile(GrafanaBild, body, "binary", function(err){ if (err) log('Fehler beim Bild speichern: ' + err, 'warn'); var vFileContent = fs.readFileSync(GrafanaBild); writeFile('0_userdata.0', pPic, vFileContent, function (error) { if (err) log('Fehler beim Bild kopieren: ' + err, 'warn'); else log('Grafana Rendering Bild ' + pPic + ' abgeschlossen', LogLevel); }); }); }); } GetGrafanaBild('GrafanaRender_TEST1.png', 'hRtUTVaGk/heizung-temp?orgId=1&from=now-6h&to=now&var-Raum=All&panelId=2&width=300&height=200');
Habe allerdings irgendwo gelesen, dass die Lösung mit dem Container für Rasberry's zu CPU-intensiv ist. Auf der Synology funktioniert es einwandfrei.
-
-
Sehr interessant!!
Eine Frage hätte ich noch, die nicht komplett das Thema trifft, aber evtl. sind hier die "Richtigen" ... es können unter Telegram Nachrichten auch Buttons angezeigt werden. Diese Buttons können über die Schriftart "Segoe UI Emoji" auch Symbole bekommen. Geht das auch mit png-Dateien? Was ich erreichen will... in meiner VIS habe ich bestimmte Symbole verwendet (png-Dateien) und es wäre schick, wenn ich mir eine Nachricht aufs Handy schicke, dass dann auf dem Button auch das passende Symbol erscheint und nicht ein nicht dazu passendes.
Viiiiielen Dank im Voraus! Falls ich hier falsch bin bitte Teeren und Federn...