Der Minirechner Raspberry Pi kann über seine Schnittstellen einfach zu einem "Messfühler" erweitert werden. Fertige "Shields" oder "HAT"s erlauben es ohne große Hardware-Arbeiten Messwerte zu erheben. Ein besonderes Beispiel ist hier der Sense-HAT, der neben einer auffälligen 8x8 LED-Matrix auch über einen Magentfeld-, einen Luftdruck-, einen Beschleunigungs-, einem Gyroskop- und einem Temperatur-Sensor verfügt. Diese Messwerte lassen sich zentral "in der Cloud" sammeln. Da ich meine Daten selber unter Kontrolle behalten will, habe ich mir meinen eigenen "Cloud-Server" installiert.
Erfassung der Daten
Mein Ziel war, möglichst wenig zu programmieren, sondern zu testen, wie weit man mit den vorhandenen Werkzeugen zur Automatisierung der Messungen kommt. Daher habe ich auf dem Raspberry Pi das Werkzeug "Node RED" aktiviert. Hiermit kann man per Web-Interface die Messungen konfigurieren und automatisieren.
Datensammlung
Die Daten des Raspberry werden per MQTT (http://mqtt.org/) an einen zentralen Broker übertragen. Von diesem Broker können die Nutzer/Programme die Daten abonnieren. Durch diese Architektur können die knappen Ressourcen des IoT-Geräts geschont werden und der Broker parallel zu Anfragelast skalieren (vergleiche auch https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern)
Als MQTT-Broker habe ich auf einem dedizierten Server (unter Linux Gentoo) das Paket Mosquitto installiert. Dieser funktionierte schon mit den Default-Einstellungen. Zur Absicherung der Kommunikation habe ich sowohl für den Raspberry als für den Server entsprechende (self signed / selbst signierte) Zertifikate erstellt und die Transportverschlüsselung auf SSL/TLS umgestellt.
Mit dem MQTT-Broker werden die Daten angenommen - es passiert aber noch nichts mit ihnen. Die Verarbeitung und Speicherung erfolgt erst durch einen "Subscriber". Wenn man die Funktion des Brokers testen will, kann man den mitgelieferten Mosquitto Subscriber nutzen:
$ mosquitto_sub -h 213.183.x.x -p 8883 -v -t 'dwalin/#' -u geheim -P geheim --cafile /etc/ssl/cacert.pem --insecure
Datenspeicherung
Als regulären Subscriber habe ich mich für InfluxDB entschieden (https://www.influxdata.com/time-series-platform/influxdb/). Diese Datenbank kann auch als "Drop In" meine bestehende opentsdb-Installation ablösen.
Sitenote: Ich war mit OpenTSDB immer sehr zufrieden.
Durch den Einsatz von Hadoop und HBase
skalierte sie sehr gut. Da die Leistungsfähigkeit der
Hardware in den letzten Jahren aber stark gestiegen und die
Komplexität einer seriösen Hadoop/HBase-Installation
nicht zu unterschätzen ist, habe ich mich entschieden,
alternative Wege zu testen. Auch andere Datenbanken bieten
zwischenzeitlich mit Hadoop vergleichbare
Redundanzen und eine horizontale Skalierbarkeit.
Leider gab es zum Zeitpunkt dieses Artikels noch keine fertigen Gentoo-Pakete. Daher habe ich die Datenbank direkt aus den Sourcen installiert (https://github.com/influxdata/influxdb). Eine Schritt für Schritt Anleitung zum selber Übersetzen der Datenbank findet sich unter https://github.com/influxdata/influxdb/blob/master/CONTRIBUTING.md#installing-go.
Da ich den Opentsdb-Collector als "Drop-In" für die bestehende Installation aktivieren wollte, musste ich die entsprechende Konfiguration aktivieren und vor dem Start der DB den alten Collector abschalten. Ein Auszug aus der aktuellen Konfiguration von InfluxDB:
bind-address = ":8088" [meta] dir = "{PATH_TO_DBDIR}/data/meta" retention-autocreate = true logging-enabled = true [data] dir = "{PATH_TO_DBDIR}/data/data" engine = "tsm1" wal-dir = "{PATH_TO_DBDIR}/data/wal" wal-logging-enabled = true query-log-enabled = true … [http] enabled = true bind-address = ":8086" auth-enabled = false log-enabled = true write-tracing = false https-enabled = true https-certificate = "/etc/ssl/eas4.nebel.de.pem" https-private-key = "/etc/ssl/eas4.nebel.de.key" … [[opentsdb]] enabled = true bind-address = ":4242" database = "opentsdb" batch-size = 1000 batch-pending = 5 batch-timeout = "1s" log-point-errors = true ...
Gestartet wird die DB mit: {PATH_TO_DBDIR}/bin/influxd --config {PATH_TO_DBDIR}/etc/influxd.conf &
Neben der Logdatei kann man auch über das Admin-Interface prüfen, ob Daten geschrieben werden.
Datenpräsentation
Zur Präsentation der Daten habe ich mich für Grafana entschieden. Hierbei konnte ich auch wieder auf ein fertiges Gentoo-Paket zurückgreifen. Da ich die Anzahl meiner SSL-Zertifikate begrenzen will, ist der auf Node.js basierende Webserver über einen vorgeschalteten Apache (mod_proxy) erreichbar (siehe https://www.nebel.de/grafana/)
Die Konguration erfolgt in zwei wesentlichen Schritten:
- der Definition einer Datenquelle
- der Konfiguration des Dashboards
Die Zugriffsrechte werden sowohl über die Datenquelle als auch über die Dashboards gesteuert.
Fazit
Die Installation einer eigenen IoT-Cloud ist (sofern man einen Server zur Hand hat) kein wirkliches Problem mehr. Man benötigt vergleichsweise wenig wirkliches IT Hintergrundwissen oder Programmierkenntnisse. Gerade die einfache Konfiguration der Messungen und die Präsentation der Ergebnisse gehen leicht zur Hand.
Ich habe in diesem Artikel nicht alle Arbeitsschritte dokumentiert, da er ansonsten zehnmal so lang geworden wäre. Der Aufbau der Cloud kann schrittweise erfolgen und jeder Schritt für sich getestet werden. Falls Fragen oder Probleme auftreten, versuche ich gerne zu helfen. Eine Mail reicht.