Körpermaße mit Grafana auf dem Raspberry Pi

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.

DevOps Phasen

Als Vorbereitung für eine Reihe über DevOps Prozesse und Tools habe ich mich mit den unterschiedlichen DevOps Modellen auseinandergesetzt. Daraus ist eine Zusammenfassung der Hauptkategorien und Unterkategorien entstanden. Als Quelle dienten diverse Hersteller und Webseiten. Die Tabelle enthält die gängigsten Modelle.

MilindTechWikipediaBlazeMeterBlazeMeter
PlanPlanCollaborateApplication lifecycle Management
Communication & ChatOps
Knowledge Sharing
CodeCreateBuildSCM / VCS
CI
BuildBuild
Database Management
TestVerifyTestTesting
Package
ReleaseRelease
DeployDeployDeployment
Configuration Management / Provisioning
Artefact Management
OperateConfigureRunCloud / IaaS / PaaS
Orchestration & Scheduling
Bi / Monitoring / Logging
MonitorMonitor

Quellen:

Bildnachweis: Wikipedia – DevOps – toolchain

Sensornetzwerke mit MySensors und pimatic

Wird pimatic (oder FHEM) für die Haussteuerung mit dem Raspberry Pi eingesetzt ergibt sich oft das Problem, dass die Sensoren nicht in direkter Nähe zum Raspberry Pi stehen. Möchte man beispielsweise in der Küche, im Badezimmer und im Schlafzimmer die Temperatur erfassen um damit Heizungen zu steuern sind verteilte Sensoren notwendig. Diese lassen sich mit Hilfe des MySensors Projektes einfach bauen.

MySensors

Bei MySensors handelt es sich um ein Opensource Framework für die Erstellung von IoT (Internet of Things) Anwendungen über Funkstrecken. Das MySensors Projekt stellt Software und Quellcode für viele Anwendungsszenarien zur Verfügung. Die Systeme sind dabei so erstellt, dass die Funkmodule alle Nachrichten in einem Mesh-Netzwerk weiter verteilen. Dadurch ist eine hohe Reichweite möglich.

Grundlegend gibt es in dem Netzwerk Nodes. Dabei ist zwischen Sensor- und Gateway-Nodes zu unterscheiden. Die Gateway-Nodes empfangen Daten und geben diese mittels Seriellem Protokoll oder über W-LAN an ein Steuersystem (Controller) weiter. In unserem Fall wird dies pimatic übernehmen. Die Sensor-Nodes sammeln die Daten der angeschlossenen Sensoren und schicken diese mittels Funkchip an ein Gateway. Die Sensor-Nodes sind dabei Arduinos (Nano, Micro oder selten Uno). Das Gateway ist entweder ein ESP8266 oder in diesem Artikel der Raspberry Pi (entweder mit pimatic Installation oder als eigenes System). Funkchips sind hierbei nRF24L01+ oder RFM69 Module. Beide sind jedoch nicht untereinander kompatibel! Die nRF24L01+ sind einfacher zu konfigurieren und preiswerter. Die RFM69 dementsprechend teurer und aufwändiger zu konfigurieren jedoch auch robuster und mit besserer Reichweite.

In diesem Artikel brauchen wir folgendes.

ACHTUNG: Im Standard ist die Kommunikation unverschlüsselt. Kritische Sensoren und Aktoren sollten daher nicht über die unverschlüsselte Standardkonfiguration laufen.

Raspberry Pi Gateway einrichten

Der Raspberry Pi muss mit dem Funkmodul verbunden werden. Hier gibt es eine ganze Menge an Kombinationsmöglichkeiten, einen Raspberry Pi 1, B, B+, 2, 3, … mit den diversen Modulen. Abhilfe schafft die Wiring Liste von MySensors.

Sind alle Kabel an der richtigen Stelle geht es an die Einrichtung der Software. In der aktuellen Lösung kann der hier beschriebene Code genutzt werden um einen virtuellen seriellen Gateway zu erstellen.

ALTERNATIVE: Sind bereits viele der GPIO Ports belegt oder soll eine eigene Lösung für MySensors gebaut werden dann kann ein Serial Gateway mit einem weiteren Arduino aufgebaut werden. Die Verkabelung erfolgt wie unten bei dem Arduino beschrieben. Danach ist dieser mit dem Code von der MySensors Serial Gateway Seite zu bestücken und mit dem Raspberry Pi über USB zu verbinden.

Arduino und Sensor vorbereiten

Als erstes muss der Arduino mit dem Funkmodul verbunden werden. Hierzu gibt es die Skizze auf der MySensors Seite unter NRF24L01+ & Arduino. Bei dem gewählten Arduino ist zu beachten, dass die reinen 5V Arduinos unbedingt einen Regulator auf 3.3V benötigen damit das Funkmodul nicht gebraten wird! Bei dem Arduino Nano sind 3.3V Ausgänge vorhanden, der Uno hat diese ebenfalls.

Sobald der Arduino angeschlossen ist erfolgt der Anschluss eines Sensors. Der einfach DS18B20 Temperatursensor ist unter den Beispielen auf der Webseite gelistet. Der Anschluss des kombinierten DHT22 ist jedoch auch sehr einfach. Die Skizze dazu findet sich unter dem Eintrag Air Humidity Sensor. Dort ist ebenfalls ein Arduino Sketch abgelegt mit dem das Netzwerk und der Sensor aktiviert werden.

Prüfen

Sind beide Arduinos bzw. die Kombination Arduino und Raspberry Pi eingerichtet sollte der Sensor Arduino an den PC angeschlossen werden. Über den „Serial Monitor“ der Arduino Entwicklungsumgebung können die Ausgaben überprüft werden. Da ggf. noch kein Controller angeschlossen ist (pimatic) erhält der Arduino noch keine eindeutige ID. Abhilfe schafft die folgende Definition am Anfang des DHT22 Programms.

#define MY_NODE_ID 14

Hiermit erhält der Arduino testweise die ID 14. Diese ist dann auch im Output zu erkennen. Der Output sollte ungefähr wie folgt sein.

[...]
4186 MCO:BGN:INIT OK,TSP=1
4202 TSF:MSG:SEND,14-14-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:23.9
T: 23.90
4210 TSF:MSG:SEND,14-14-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:47.4
H: 47.40
4217 MCO:SLP:MS=60000,SMS=0,I1=255,M1=255,I2=255,M2=255

Wenn das Gateway ebenfalls ein Arduino ist ergibt sich im „Serial Monitor“ der folgende Output.

0;255;3;0;9;TSF:MSG:READ,14-14-0,s=255,c=3,t=26,pt=1,l=1,sg=0:2
0;255;3;0;9;TSF:MSG:SEND,0-0-14-14,s=255,c=3,t=27,pt=1,l=1,sg=0,ft=0,st=OK:1
0;255;3;0;9;TSF:MSG:READ,14-14-0,s=1,c=1,t=0,pt=7,l=5,sg=0:23.9
14;1;1;0;0;23.9
0;255;3;0;9;TSF:MSG:READ,14-14-0,s=0,c=1,t=1,pt=7,l=5,sg=0:47.5
14;0;1;0;1;47.5

Sensor in pimatic einbinden

Die Einbindung in pimatic erfolgt mit dem Plugin „pimatic-plugin-mySensors“.

Probleme

Ich konnte die Verbindung nur zwischen zwei Arduino Uno Varianten herstellen. Mit einem geklonten Mini war leider keine saubere Kommunikation möglich. Bei einem Original sollten hier aber keine Probleme auftreten.

Raspberry Pi 3 Model B+

Nach dem Blogbeitrag auf der offiziellen Raspberry Pi Webseite gibt es mit dem Raspberry Pi 3 Model B+ nun ein neues System in der Raspberry Pi Familie. Sobald die ersten Modelle auch auf deutschen Webseiten erhältlich sind wird auch die Einkaufsliste angepasst.

Schnellere Hardware

Zu den wesentlichen Neuerungen gehören die folgenden Punkte.

Eine schnellere CPU mit 1,4 GHz gegenüber den 1,2 GHz vorm Vorgänger. Genauer die 1,4GHz 64-bit quad-core ARM Cortex-A53 CPU.

Dual-band 802.11ac W-LAN somit also auch die Möglichkeit der Nutzung von 5GHz Frequenzen für eine schnellere Übertragung.

Bluetooth 4.2

Power-over-Ethernet (PoE) Unterstützung

Preislich wird der Raspberry Pi 3 Model B+ auf dem gleichen Niveau wie der Vorgänger liegen!

Raspberry Pi Terrarium Steuerung bauen

Für das Wohlergehen der eigenen Reptilien in der Terraristik ist eine Raspberry Pi Terrarium Steuerung sehr nützlich. Auf einen Blick lassen sich alle wichtigen Informationen ablesen und notwendige Anpassungen vornehmen. Dinge wie Winterruhe und Nachtabsenkungen funktionieren automatisch. Eine Kontrolle ist jederzeit möglich.

Anforderungen

Die Raspberry Pi Terrarium Steuerung muss einige Funktionen erfüllen. Wichtig ist die Steuerung von Licht, Temperatur und der Luftfeuchtigkeit. Dies unterscheidet das Raspberry Pi Terrarium nicht von einem Smart Home. Auch dort erfasst die Steuerung alle notwendigen Werte und schaltet dann alle Geräte zur richtigen Zeit.

Nützliche Erweiterungen sind das Anzeigen des Wetters im Heimatland zu Vergleichszwecken oder eine automatisierte Winterruhe. Durch die Automatismen können auch Benachrichtigungen an Smartphones verschickt werden. Nützlich ist auch ein Raspberry Pi Dashboard.

Vorbereitung

Am Anfang steht die Beschaffung des Raspberry Pi. Alle notwendigen Komponenten sind in der Einkaufsliste zusammengefasst. Im Anschluss kann dieser eingerichtet werden. Für die Steuerung von Licht und Heizung bieten sich Funksteckdosen an. Die eigentliche Steuerung übernimmt dann die Software der Haussteuerung auf dem Raspberry Pi.

Raspberry Pi Terrarium Umsetzung

Für die Umsetzung der einzelnen Teile gibt es bereits einige Artikel in diesem Blog. Das Vorgehen ist in den verlinkten Artikeln beschrieben.

  1. Kaufen und einrichten des Raspberry Pi (siehe oben).
  2. Anschließen aller Leuchtstoffröhren, Heizkabel, Strahler und Wärmeplatten an Funktsteckdosen.
  3. Sensoren verbinden.
  4. Haussterungssoftware einrichten (z.b. pimatic oder fhem).
  5. In der Einrichtungsphase alle Werte manuell überprüfen.

Kontrolle und Anpassung

Nach der erfolgreichen Installation und Einrichtung lassen sich alle Werte ablesen. Sind für Uhrzeiten oder Temperaturwerte Eingabefelder vorgesehen worden, dann können diese jederzeit manuell angepasst werden.