Node-RED: Visueller Editor ermöglicht einfachen Einstieg ins IoT
Node-RED: Visueller Editor ermöglicht einfachen Einstieg ins IoT
Dass jede Einkaufstüte automatisch weiß, welche Produkte sie enthält und damit das lange Warten an der Supermarktkasse entfällt, ist bisher noch nicht zur Realität geworden. Andere Dinge wie intelligente Häuser, die automatisch den Energieverbrauch regeln, Fenster öffnen und schließen, sind hingegen bereits in Betrieb. Das Internet der Dinge ist teilweise einfach zu verstehen, wie bei den oben genannten Beispielen, aber oft komplex in der Umsetzung. Node-RED, ein vor Kurzem veröffentlichtes Tool von IBM, soll den Einstieg in die Thematik erleichtern. Sein Herzstück ist ein grafischer Editor, dies eine Einführung in die Benutzung.
Das Internet der Dinge ist im Moment in aller Munde und auch ein Thema auf vielen Entwicklerkonferenzen. Doch was genau kann man sich unter dem „Internet of Things“ (engl. kurz IoT) vorstellen? Der Begriff wurde zuerst von Kevin Ashton 1999 verwendet [1] und bezeichnet die Vision, dass physische Objekte als eigenständige und intelligente Geräte in einer internetähnlichen Struktur kommunizieren. Die Art der Kommunikation ist breit gefächert: von der Identifizierung von Objekten durch RFID-Chips oder Barcodes bis hin zur direkten Kommunikation über das Internet. In Anbetracht des rasanten Zuwachses an Geräten, die über das Internet Daten austauschen – laut Ericsson [2] und Cisco [3] werden es 2020 über 50 Milliarden sein – und der ebenso steigenden Zahl an mobilen Geräten hat das Thema Internet of Things auf jeden Fall seine Daseinsberechtigung.
Die große Anzahl an „Dingen“ und die verstärkte Nutzung von mobilen Geräten rütteln an den Grundsäulen des auf HTTP basierenden Internets. Das unangefochtene Standardprotokoll im Web kann den Anforderungen der Kommunikation im Internet der Dinge nur bedingt gerecht werden. Die Request-/Response-Architektur ist nicht ausgelegt für das gleichzeitige Übermitteln von Nachrichten an mehrere Geräte und kann eine fehlerfreie Übertragung nicht garantieren. Als Protokoll für das Internet der Dinge ist momentan MQTT heiß im Gespräch, vor allem, da im Frühjahr die Verabschiedung als OASIS-Standard ansteht. MQTT ist ein Publish-/Subscribe-Protokoll, das es einem Gerät ermöglicht, mit mehreren unbekannten Geräten zu kommunizieren. Dies erfolgt über so genannte Topics, einem einfachen String ähnlich dem URL mit Schrägstrichen getrennt, der als Grundlage für das Austauschen von Nachrichten benutzt wird.
Ein MQTT-Broker als zentrale Vermittlungsstelle speichert die Subscriptions und versendet die Nachrichten an die jeweiligen Geräte. Wenn ein Gerät einen Publish einer Nachricht auf dem Topic my/status/topic vornimmt, wird dies von allen empfangen, die zuvor dasselbe Topic per Subscription abonniert haben. Dieser Paradigmenwandel von der gewohnten Request-/Response-Architektur und die gezielte Entwicklung für mobile Geräte (einfach, effizient und ressourcenschonend) macht MQTT zu einem oft verwendeten Protokoll, wenn es um das Internet der Dinge geht.
Eine andere Problematik ist die Komplexität, die durch die vielen unterschiedlichen Geräte eingeführt wird. Sie zieht sich durch mehrere Ebenen, angefangen bei den verschiedensten Hardwarekomponenten und Bussystemen über die Kommunikationskanäle bis hin zu der Steuerung und Weiterverarbeitung der Daten durch Softwaresysteme. Doch auch hier gibt es bereits gute Ansätze, der Komplexität entgegenzuwirken. Ein Beispiel von vielen sind offene Hardwareplattformen wie Arduino und Raspberry Pi. Dank einer großen Community und Dokumentation ermöglichen sie auch Leuten ohne ein Studium der Elektrotechnik einen Einstieg in die Thematik.
Einen Schritt, der noch weiter geht, hat IBM mit dem Tool Node-RED gewagt. Es erlaubt den visuellen Aufbau von Anwendungen für das Internet der Dinge. Obwohl das offene Projekt noch in den Kinderschuhen steckt – die aktuelle Version 0.2.0 ist seit dem 16.10.2013 verfügbar – ist die Idee es wert, sich das Tool einmal genauer anzusehen.
Node-RED ermöglicht es, Anwendungsfälle im Bereich des Internets der Dinge in kurzer Zeit umzusetzen. Dafür verantwortlich ist vor allem der grafische Designer, der eine Abstraktion der unterschiedlichsten Technologien mit einem einfachen Baukastenprinzip möglich macht. Die einzelnen Funktionsbausteine, wie zum Beispiel ein HTTP-Request oder ein neuer Tweet, werden durch das Ziehen von Verbindungen verknüpft. Die relativ große Auswahl an mitgelieferten Bausteinen deckt viele der gängigsten Dienste und Technologien ab. Zudem gibt es auch Funktionsbausteine, in denen man JavaScript benutzen kann und somit jegliche Möglichkeiten offen hat. Falls dies nicht ausreichen sollte, bietet sich die Möglichkeit, eigene Bausteine ebenfalls in JavaScript zu schreiben, um eine gewünschte Funktionalität abzubilden.
Hat man den gewünschten Aufbau durch die Anordnung der Bausteine und Verbindungen geschaffen, reicht ein Klick aus, um mit der eigenen Anwendung in den Livebetrieb überzugehen. Durch die nicht vorhandene Auslieferungszeit ist es möglich, schnell die Anwendung anzupassen, spontane Ideen auszuprobieren und Fehler zu beheben. Am besten legen wir direkt los mit der Installation und dem ersten Beispiel.
Node-RED basiert auf Node.js, wie man am Namen schon erkennen kann. Daher ist der erste Schritt, Node.js herunterzuladen und zu installieren. Auf der Downloadseite [4] werden für alle gängigen Betriebssysteme fertig kompilierte Pakete angeboten, die sich per Wizard selbst installieren (Mac OS X, Windows) oder direkt ausführbar sind (Linux). Dies macht die Installation unkompliziert: Innerhalb weniger Minuten ist sie abgeschlossen. Danach zeigt folgender Befehl in einer Kommandozeile, ob Node.js korrekt installiert ist:
node --version
Sofern die Versionsnummer angezeigt wird, kann mit der Einrichtung von Node-RED begonnen werden. Die aktuelle Version kann über die Webseite [5] heruntergeladen werden und bedarf keiner weiteren Installation. Es müssen lediglich alle verwendeten Abhängigkeiten über den Node Package Manager (npm) nachgeladen werden. Dies erreicht man mit folgendem Kommando im Node-RED-Verzeichnis:
npm install
Nach der Fertigstellung sollte sich Node-RED ohne Fehler starten lassen:
node red.js
Dies kann man überprüfen, indem man im Webbrowser die Adresse http://127.0.0.1:1880/ eingibt. Falls sich eine Weboberfläche, wie in Abbildung 1, öffnet, ist Node-RED startklar.
Abb. 1: Node-RED nach dem ersten Start
Nach dem ersten Start ist der Arbeitsbereich der Anwendung ziemlich leer, da noch keine Funktionsbausteine oder Verbindungen angelegt wurden. Dies lässt sich aber schnell ändern. Alle verfügbaren Bausteine sind in der Toolbar auf der linken Seite zu sehen und können per Drag and Drop auf die Arbeitsfläche gezogen werden. Jeder einzelne Baustein hat entweder einen Eingang, einen oder mehrere Ausgänge oder beides. Die Verbindungen dazwischen symbolisieren die Kommunikation der Bausteine untereinander und können durch das Ziehen mit der Maus hergestellt werden. Es kann logischerweise immer nur Ausgang mit Eingang verbunden werden, alles andere wird durch die Applikation nicht erlaubt. Für ein erstes „Hello World“-Beispiel benötigen wir zwei Funktionsbausteine und eine Verbindung: einen Inject-Knoten aus der inputs-Box in der linken Seitenleiste und einen Debug-Knoten aus der outputs-Box. Nachdem die beiden verbunden sind, kann man mit einem einfachen Klick auf „Deploy“ das soeben modellierte Verhalten live schalten. Aber was haben wir denn eigentlich damit erreicht? Der „Inject“-Knoten schickt auf Knopfdruck eine MQTT-Nachricht, bestehend aus Topic und Payload (Inhalt der Nachricht) zu allen verbundenen Bausteinen. Durch die Verbindung zum Debug-Baustein werden die Informationen übermittelt und von diesem in der rechten Seitenleiste ausgegeben. Die Ausgabe ist sichtbar, wenn man rechts oben auf das Menü klickt und die Sidebar aktiviert. Es sollte nun nach einem Klick auf den „Inject“-Knopf eine Meldung in der Sidebar mit einer Zahl (aktuelles Datum in Unix-Zeit) ausgegeben werden. Um die Nachricht zu verändern, kann man durch einen Doppelklick auf den „Inject“-Baustein die zu sendende Nachricht (Payload) anpassen. Die Änderungen werden erst durch einen erneuten Klick auf „Deploy“ übernommen. Es sollte nun die neue Nachricht angezeigt werden.
Dieses Beispiel sowie die nachfolgenden sind unter [6] zu finden und können über den Menüeintrag „Import from Clipboard“ in Node-RED importiert werden.
Nach dem ersten Beispiel zum Kennenlernen der Basisfunktionalität und dem Konzept wollen wir uns nun einem echten Anwendungsszenario widmen. Die Anwendung soll das _OpenWeatherMap-_API benutzen, um die aktuelle Temperatur abzurufen und diese dann in Prosa als Tweet zu veröffentlichen. Dafür sind vier Bausteine notwendig:
Inject-Baustein zum Auslösen der Wetter-API-Anfrage
HTTP-Response zum Abfragen des Wetter-API
JavaScript-Baustein zum Parsen des Response und Formatieren der Ausgabe
Twitter-Baustein zum Veröffentlichen eines Tweets
Bevor man den Twitter-Baustein und einige andere nutzen kann, müssen erst manuell Bibliotheken nachgeladen werden. Wenn man beim Starten von Node-RED die Konsolenausgabe verfolgt, sieht man sehr schön, welche Bausteine man durch die Nachinstallation von den ebenfalls angezeigten Bibliotheken noch verwenden kann. Der Twitter-Baustein ist durch den folgenden Befehl und einen nachfolgenden Neustart der Applikation sichtbar:
npm install oauth ntwitter
Um die beschriebene Funktionalität herzustellen, müssen nun noch folgende Schritte ausgeführt werden:
Verbinden aller Bausteine nach dem Vorbild von Abbildung 2
Eintragen des URL für das Wetter-API in den HTTP-Response-Baustein
Übertragen von Listing 1 in den Funktionsbaustein
Autorisieren des gewünschten Twitter-Accounts per Doppelklick auf den Baustein
Hinzufügen der Debug-Ausgabe (optional)
Abb. 2: Node-RED-Aufbau für Wetteranfrage
Listing 1
// OpenWeatherMap JSON Antwort parsen
var weather=JSON.parse(msg.payload);
// Neue Nachricht mit Payload erstellen
var newMsg = { payload: "Die aktuelle Temperatur in München ist "+weather.main.temp +" Grad." };
// Zurückgeben der Nachricht
return newMsg;
Es sollte nun bei einem Klick auf den „Inject“-Baustein ein Tweet mit dem gewünschten Text auf dem Twitter-Account und auch im „Debug“-Fenster zu sehen sein. Achtung: Mehrmaliges Senden einer Nachricht mit dem gleichen Inhalt kann dazu führen, dass Twitter den Tweet nicht zulässt, da er duplizierten Inhalt enthält. Damit ist das erste Beispiel erfolgreich abgeschlossen.
Das vorhergehende Beispiel zeigte bereits, wie man mit wenig Aufwand das Resultat einer HTTP-Response in einen Tweet umwandeln kann. In diesem abschließenden Beispiel werden wir sehen, wie Node-RED die Kommunikation mit anderen Geräten (beispielsweise einer anderen Node-RED-Instanz) per MQTT ermöglicht. Als Datenquelle dient ein Raspberry Pi, der stündlich einen Temperatursensor abfragt. Zur Vereinfachung wird hier der Wetter-API-Aufruf aus dem vergangenen Beispiel benutzt. Diesmal wird nur die Temperatur an sich in den Payload der Nachricht geschrieben und diese einem ausgehenden MQTT-Baustein übergeben.
Auf der anderen Seite ist eine weitere Node-RED-Instanz, die einen eingehenden MQTT-Baustein besitzt, um die Nachricht zu erhalten, weiterzuverarbeiten und, falls die Temperatur unter 0 Grad ist, einen Tweet abzusetzen, um vor Frost zu warnen.
Die Kommunikation über MQTT wird ermöglicht, indem die beiden Anwendungen auf zum gleichen Topic publishen oder subscriben. Um dies zu realisieren, wird ein MQTT-Broker benötigt. Für Testprojekte benutzt man am einfachsten einen von vielen Public Brokern, wie zum Beispiel broker.mqttdashboard.com auf dem Standardport 1883. Als Alternative kann man auch lokal einen Broker wie etwa HiveMQ [7] installieren. Damit sind Ihre versendeten Nachrichten nicht öffentlich sichtbar. Abbildung 3 zeigt eine komplette Übersicht über das beschriebene Szenario.
Abb. 3: Beispielszenario im Detail
Bevor die Bausteine angelegt und verbunden werden können, muss noch auf dem Raspberry Pi Node.js installiert werden. Das funktioniert am besten nach der Anleitung unter [8]. Als Alternative kann man auch einen beliebigen anderen PC benutzen oder beide Abläufe in einer Node-RED-Instanz bauen.
Sobald Sie beide Instanzen am Laufen haben, können Sie die Bausteine anhand von Abbildung 4 (Raspberry Pi) und Abbildung 5 (Server) anordnen. Der „Inject“-Baustein „jede Stunde“ löst automatisch jede Stunde aus. Dies kann über das Interface mit einem Doppelklick auf den Baustein konfiguriert werden. Es empfiehlt sich außerdem, einen zweiten manuellen „Inject“-Baustein hinzuzufügen, der einen Frost simulieren kann. Die Generierung der Zufallszahl für den Frost ist ein einfacher Algorithmus, der eine Zufallszahl zwischen -1 und -30 erzeugt:
// Zufallszahl zwischen -1 und -30
msg.payload = -1 * Math.floor((Math.random()*30)+1);
return msg;
Abb. 4: Node-RED-Frostwarnung: Raspberry Pi
Abb. 5: Node-RED-Frostwarnung: Server
Die Wetter-API-Anfrage enthält den gleichen URL wie im ersten Beispiel, nur die Temperatur wird etwas anders weitergegeben, siehe Listing 2.
Listing 2
// OpenWeatherMap JSON Antwort parsen
var weather=JSON.parse(msg.payload);
// Neue Nachricht mit Payload erstellen
var newMsg = { payload: weather.main.temp };
// Zurückgeben der Nachricht
return newMsg;
Als letzten Schritt muss im Node-RED des Raspberry Pis noch die Einrichtung des ausgehenden MQTT-Bausteins erfolgen. Ich habe in den Beispielen auf GitHub das Topic nodered/temp und einen Public Broker benutzt, damit die Beispiele automatisch nach einem Import funktionieren. Man kann hier ein eigenes Topic verwenden, damit dieses sich bei der Nutzung auf demselben Public Broker nicht mit anderen überschneidet. Nach einem Klick auf „Deploy“ kann die Funktionalität direkt auf dem MQTT-Dashboard durch eine Subscribe-Funktion überprüft werden: http://mqttdashboard.com/subscribe. Es wird nun je nach Intervall des „Inject“-Bausteins oder der manuellen Auslösung die Temperatur als Zahl auf dem Topic veröffentlicht.
Auf der Serverseite muss der eingehende MQTT-Baustein (Subscribe) auf das gleiche Topic eingestellt werden, die Frostprüfungsfunktion aus Listing 3 und die Authentifizierung mit Twitter. Letzteres ist noch vorhanden, falls die gleiche Node-RED-Instanz wie im ersten Beispiel verwendet wird.
Listing 3
var temp = msg.payload;
// Frost?
if(temp < 0)
{
// Nachricht zusammenbauen und zurückgeben
msg.payload = temp + " Grad. Achtung, Frostgefahr! Bitte Auto in die Garage fahren!";
return msg;
}
else
{
// nichts tun
}
Nach einem Klick auf „Deploy“ sollte der Anwendungsfall komplett funktionstüchtig sein. Dies überprüfen Sie durch einen Klick auf „Frost simulieren“. Nun wird ein Tweet mit einer Warnung vor Frost abgesetzt.
Gratulation – Sie haben erfolgreich die Kommunikation im Internet der Dinge gemeistert und einen Anwendungsfall implementiert.
Das Internet der Dinge ist eine Vision, die teilweise jetzt schon unser Leben beeinflusst, in Zukunft aber noch stärker. Wie wir gesehen haben, ist es mit Node-RED möglich, innerhalb von kürzester Zeit Applikationen zu bauen. Die Auswahl an Bausteinen bietet eine gute Voraussetzung für das Entwerfen übergreifender Anwendungen, von der Ansteuerung von Hardware-PINs bis hin zu High-Level-APIs wie Twitter. Die einfach gehaltene Oberfläche und gute Erweiterbarkeit spricht eine breite Zielgruppe von Interessierten an, vom Einsteiger bis zum Spezialisten. Es lohnt sich auf jeden Fall, die Entwicklung des Projekts im Auge zu behalten.
[1] http://www.rfidjournal.com/articles/view?4986
[2] http://www.ericsson.com/res/docs/whitepapers/wp-50-billions.pdf
[3] http://www.cisco.com/en/US/solutions/collateral/ns1015/brochure_c02-684075.pdf
[4] http://nodejs.org/download/
[6] https://github.com/goetzchr/node-red-examples
[7] http://www.hivemq.com/documentations/getting-started/
[8] http://acaseyblog.wordpress.com/2013/07/25/how-to-run-node-js-on-a-raspberry-pi/