Körpermaße mit Grafana auf dem Raspberry Pi

Lesedauer ~5 Minuten

Grafana Dashboards sind eine grafisch ansprechende Alternative zu meinem Körpermaße Dashboard FitPi. In diesem Artikel geht es um die Einrichtung eines exemplarischen Dashboards zur Darstellung von Körpermaßen (Gewicht, …) auf dem Raspberry Pi. Die Daten kommen aus einer MariaDB/MySQL Datenbank und werden über ein einfaches Tool eingetragen.

LAMP/LEMP Stack installieren und konfigurieren

Adminer ist ein PHP Tool zur Administration von Datenbanken. Das Tool wird die Eingabemöglichkeit für die Erfassung des Gewichtes, Größe, usw. sein. Damit das Tool funktioniert ist ein Webserver mit PHP notwendig, sowie die Datenbank.

Der klassische LAMP Stack besteht auf (Linux), Apache, MySQL und PHP. Allerdings nutze ich für dieses System den LEMP Stack. Dieser ersetzt den Apache durch Nginx. Nginx hat in diesem Fall den Vorteil, dass sich damit sehr einfach ein Reverse Proxy für Grafana einrichten lässt der auch performanter als der Apache ist. Grafana besitzt einen integrierten Webserver aber auf diesem Weg kann der Zugriff zentral über Nginx konfiguriert werden. Die Entscheidung für MySQL oder MariaDB ist eher eine Entscheidung zwischen dem Unternehmen Oracle oder der Open Source Community.

Die Installation erfolgt mit einigen einfachen Kommandos (Einfach leider nur auf stretch – Jessie hat leider nur PHP 5 und benötigt deutlich mehr Schritte). Die Datenbank fragt zwischenzeitlich nach dem root Passwort für den Administrator Zugang! Danach wird der Zugang für den Benutzer aber auf localhost beschränkt.

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install nginx php-fpm php-mysql php-cli php-cgi php-common php-curl php-gd php-mcrypt php-json php-tidy php-sqlite3 php-opcache php-intl php-zip php-xml php-mbstring php-iconv php-pear mcrypt
$ sudo apt-get install mysql-server mysql-client
$ sudo mysql_secure_installation

Nginx muss noch konfiguriert werden um PHP Dateien anzuzeigen.

$ sudo nano /etc/nginx/sites-available/default

Ersetzen von index index.html index.htm index.nginx-debian.html; durch index index.php index.html index.htm index.nginx-debian.html;

Entfernen der Kommentare vor dem PHP Bereich.

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}

Nach einem Neustart ist der Webserver fertig.

$ sudo nginx -t
$ sudo systemctl reload nginx

Adminer lässt sich direkt von der Webseite runterladen (vorher nach der aktuellen Version schauen!) und im Webserver Verzeichnis ablegen. Admin Skripte sollten NIEMALS auf einem produktiven System aus dem Internet erreichbar sein! Für den lokalen Raspberry Pi in diesem Artikel reicht dies aber aus.

$ cd /var/www/html
$ sudo wget https://github.com/vrana/adminer/releases/download/v4.6.2/adminer-4.6.2-mysql.php

Das Skript sollte nun erreichbar sein unter dem Namen des Raspberry Pi oder dessen IP-Adresse und dem Skriptnamen: http://RASPBERRY_PI_NAME_ODER_IP/adminer-4.6.2-mysql.php

Grafana installieren

Leider gibt es kein Paket in der aktuellen Raspberry Pi Paketverwaltung. Glücklicherweise existiert ein Git Projekt welches diese Paket zur Verfügung stellt. Das Ergebnis ist auch für die Paketverwaltung nutzbar, es muss lediglich eine neue Quelle hinzugefügt werden (für stretch auf Raspberry Pi 2 und 3).

$ echo "deb https://dl.bintray.com/fg2it/deb stretch main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
$ sudo apt-get update
$ sudo apt-get install grafana
$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable grafana-server
$ sudo /bin/systemctl start grafana-server

Grafana ist nun erreichbar unter der Adresse (Port 3000): http://RASPBERRY_PI_NAME_ODER_IP:3000/

Der Default Login ist admin:admin und sollte direkt geändert werden.

Datenbank erstellen und Daten eintragen

Über die Adminer Oberfläche (SQL Kommando) kann die Datenbank (hier: life) erstellt werden inklusive eines Grafana Benutzers zum lesen der Daten. Dort erfolgt das Anlegen einer Tabelle für Körpermaße (measurement). Die Daten lassen sich per SQL Kommando INSERT erfassen oder über die Dateneingabe in Adminer. Das Anlegen der View (v_measurement) ermöglicht, dass Hinzufügen von berechneten Feldern. In diesem Beispiel sind es der berechnete Body-Mass-Index und die Grenzen zum Übergewicht bzw. Untergewicht. Der Bereich dazwischen ist das Normalgewicht.

CREATE DATABASE `life`;
CREATE USER 'grafana'@'localhost' IDENTIFIED BY 'grafana';
GRANT SELECT ON life.* TO 'grafana'@'localhost';
FLUSH PRIVILEGES;
USE `life`;
CREATE TABLE `measurement` (
    `date` date NOT NULL,
    `height` int NOT NULL,
    `weight` double NOT NULL
);
CREATE VIEW `v_measurement` AS select `measurement`.`date` AS `date`,`measurement`.`height` AS `height`,`measurement`.`weight` AS `weight`,((`measurement`.`weight` * 1.0) / (((`measurement`.`height` * 0.01) * `measurement`.`height`) * 0.01)) AS `bmi`,25 AS `bmioverweight`,18.5 AS `bmiunderweight` from `measurement`;
INSERT INTO `measurement` (`date`, `height`, `weight`) VALUES ('20170101', '180', '85');
INSERT INTO `measurement` (`date`, `height`, `weight`) VALUES ('20180505', '180', '91');
INSERT INTO `measurement` (`date`, `height`, `weight`) VALUES ('20180520', '180', '86');

ACHTUNG: Sollte der root Zugriff auf localhost beschränkt sein (bei MariaDB), so muss die Datenbank und ein schreibende User zuerst über den MySQL Client angelegt werden!

$ sudo mysql -u root -p
CREATE USER 'pi'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'pi'@'%' WITH GRANT OPTION; -- Besser wäre hier die Tabelle anstelle von *.* Außerdem ermöglicht GRANT OPTION denn Vollzugriff auf alle Berechtigungen!
FLUSH PRIVILEGES;

Grafana einrichten

Der letzte Schritte ist das Einbinden der Datenbank in Grafana, das Erstellen eines Dashboards und das Hinzufügen eines Panels für die Daten.

Die Datenquelle wird über den geführten Assistenten „Add data source“ durchgeführt.

Name: life
Type: MySQL
Host: localhost:3306
Database Name: life
User: grafana
Password: grafana

Jetzt kann über „New Dashboard“ ein neues Dashboard erstellt werden. Zum Anzeigen von Werten nutzt Grafana Panels. Hier bietet sich das „Graph“ Panel an. Mit einem Klick auf den kleinen Pfeil neben dem Titel erscheint ein Menü zum bearbeiten. Als Datenquelle wird life gewählt. Das Query ist wie folgt. (ACHTUNG: Wenn _$_timeFilter aktiv ist muss oben rechts der Zeitraum entsprechend groß gewählt werden um alle Werte zu erfassen. Zum testen kann der WHERE Teil vorerst entfallen). Bei Problemen hilft „Generated SQL“, der Wert kann in Adminer zum prüfen kopiert werden.

SELECT
    `date` as time_sec,
    `weight` as Gewicht
FROM `v_measurement`
WHERE $__timeFilter(`date`)
ORDER BY `date` ASC;

Zum Schluss noch einen Namen beim Speichern angeben und das Dashboard ist fertig!

Weitere Daten und Möglichkeiten

Weitere Ideen für Datenquellen (Kopfschmerzen, Krafttraining, Sport, …) finden sich auch in meiner Serie Hacking Sebastian – Teil 1 – Daten (Quantified Self).

Für produktive Nginx Server gibt es eine Sammlung von empfohlenen Konfigurationen.

Polar Flow Laufuhr Daten ermitteln: polar-flow-export.