FHEM Tutorial-Reihe - Part 27: Analytics-Daten auf LCD per MQTT
Kurz vorweg: Dieses Tutorial ist etwas anders und sehr speziell. Dennoch wollte ich Euch auf die Reise mitnehmen und meine Gedankengänge und Schritte schildern. Ziel war es, die Google-Analytics Daten auf einem kleinen LCD-Display (16x2 Zeichen) darzustellen. Da ich noch einen OnionOmega liegen hatte, wollte ich diesen nun endlich mal sinnvoll verwenden. Ansonsten wünsche ich gute Unterhaltung, eventuell lernst Du ja noch etwas.
Was wird benötigt?
- Ein OnionOmega - alternativ auch ein RaspberryPi oder Arduino (dann geht der gezeigte Code aber nicht bzw. dann würde ich auf WiringPi setzen)
- Eine FHEM-Installation
- Ein MQTT-Broker (siehe Teil 26)
- Ein Google-Analytics-Konto + Property
Video
Komponenten
Befehle
Als erstes muss ein neues API-Projekt unter in der Google Developer Console angelegt werden. Wie genau das klappt ist im Video erklärt.
Folgende Befehle brauchst Du, wenn Du Docker nicht verwenden möchtest:
sudo apt-get update
sudo apt-get install php5 git-core
mkdir -p /opt/analytics-mqtt
cd /opt/analytics-mqtt
git clone https://github.com/klein0r/php-analytics-mqtt.git .
php composer.phar install
Dann müssen noch in der run.php die entsprechenden Werte gesetzt werden, welche wie im Video gezeigt eingesammelt wurden. Hier ein Beispiel, wie das ausehen könnte:
$serviceAccountEmail = 'account-123@*.iam.gserviceaccount.com';
$profile = '12345678';
$mqttBroker = '192.168.1.100';
Damit die Daten dann regelmäßig von dem API abgeholt werden, muss die run.php noch als cronjob angelegt werden.
crontab -e
Ein Eintrag könnte dann wie folgt lauten, um alle 5 Minuten die Daten von der Analytics-API abzuholen und an FHEM zu schicken.
*/5 * * * * php -f /opt/analytics-mqtt/run.php > /dev/null
Danach den Editor wieder schließen. Der erste Teil wäre damit abgeschlossen. Wobei ich eine Lösung mit Docker natürlich wie immer bevorzugen würden (auch wenn dieser Container in diesem Fall echt wenig tut).
Jetzt muss noch das Gerät in FHEM angelegt werden, welches aus den MQTT-Nachrichten dann Readings macht. Das geht aber relativ einfach.
define AnalyticsData MQTT_DEVICE
attr AnalyticsData subscribeReading_last-7-days /Web/Analytics/Last7Days
attr AnalyticsData subscribeReading_last-28-days /Web/Analytics/Last28Days
attr AnalyticsData subscribeReading_active-users /Web/Analytics/Realtime/ActiveUsers
Der komplexeste Teil ist sicherlich das Verkabeln und einrichten des OnionOmega. Mit Version 2 sollte es so ziemlich genauso funktionieren.
»Onion Omega«
Als erstes verbinden wir uns per SSH oder serieller Schnittstelle wie im Video gezeigt. Das Standard-Passwort lautet “onioneer”.
ls /dev/tty.*
screen /dev/tty.SLAB_USBtoUART 115200
ssh root@<ip.des.onion.omega>
Danach installieren wir ein paar Pakete nach. Hier muss man aufpassen, dass man nicht zuviel kram installiert. Der Speicher ist begrenzt und sehr schnell voll!
opkg update
opkg install php5 php5-cgi php5-cli
opkg install git git-http
Dann packen wir meine Display-Programmierung in ein neues Verzeichnis.
cd /root/
mkdir onion-php
cd onion-php
git clone https://github.com/klein0r/php-onion-omega.git .
wget https://raw.githubusercontent.com/bluerhinos/phpMQTT/master/phpMQTT.php
Hier muss in der Datei mqtt.php noch die IP des MQTT-Brokers hinterlegt werden. Den Autostart richten wir wie im Video gezeigt mit den folgenden Befehlen ein:
vi /etc/rc.local
php-cli /root/onion-php/mqtt.php 2>&1 &
Nach einem Reboot sollte dann alles betriebsbereit sein. Das können wir testen, indem wir die ersten Daten per MQTT auf die entsprechenden Pfade schicken. Am besten erstmal mit einem Tool wie MQTT.fx. Wenn das alles klappt, können wir in FHEM die MQTT_Bridge für die Analytics-Daten konfigurieren.
define MQTT_OnionDisplay MQTT_BRIDGE AnalyticsData
attr MQTT_OnionDisplay publishReading_active-users /Onion/Line1
attr MQTT_OnionDisplay publishReading_last-7-days /Onion/Line2
Wie man sieht ist der Aufbau sehr dynamisch. Heißt, dass ich nun jedes beliebige Gerät / dessen Readings auf das Display schicken kann. Sei es die aktuelle Temperatur im Wohnzimmer oder eben auch nur ein paar News. Wäre PHP auf dem Onion etwas schneller, könnte man nun auch noch Dinge tun wie:
- Lauftext, wenn der Text zu lang ist.
- Die letzten Nachrichten speichern und ein paar Minuten lang rotieren lassen, bis die Nachricht abläuft
- und vieles mehr
Wenn ich mal ganz viel Langeweile habe, probiere ich den Compiler für OpenWRT noch zum Laufen zu bringen. Nativ sollten die GPIOs wesentlich schneller angesteuert werden können als aktuell.
Fazit
MQTT entwickelt sich langsam zu einem echten Lieblingsprotokoll. Man kann einfach Daten aus PHP senden, Perl wertet diese in FHEM aus und auf dem OnionOmega geht es in PHP weiter. Generell kann man PHP in diesem kompletten Tutorial durch irgendeine andere Sprache austauschen. Die Google-Libraries gibt es auch fast für jede gängige Sprache und MQTT versteht sowieso jede Sprache. Also wirklich extrem flexibel!
Das schöne ist auch, dass es egal ist ob jemand zuhört. Ich mache das Display einfach aus und die Nachrichten werden weiterhin vom Broker empfangen. Es gibt also keine Fehler oder ähnliches wenn die Gegenstelle nicht erreichbar ist.
Genauso könnte ich meine komplette Wohnung mit irgendwelchen Displays pflastern und überall die gleiche Software laufen lassen. MQTT verteilt dann eben an alle die gleichen Infos. Das finde ich wirklich sau stark!