Im ersten Teil zum Thema IoT mit dem ESP8266 habe ich die Arduino-Plattform und das Espressif ESP8266 SoC vorgestellt. Im diesem Beitrag erstellen wir eine konkrete Anwendung: Wir steuern Funksteckdosen fern via Web-Schnittstelle. Dazu verwenden wir mein quelloffenes ESP Framework für die effiziente Applikationsentwicklung mit dem Arduino Core auf dem ESP.
Unser primäres Ziel ist es, elektrische Geräte via Internet von überall her komfortabel ein- und auszuschalten. Dies wollen wir manuell im Browser oder automatisch anhand von Ereignissen, Zeitsteuerung oder beliebiger Logik tun.
Viele IoT Lösungen verwenden einen Steuerserver, mit welchem sich das IoT-Gerät und der Benutzer verbinden. Wir wollen jedoch eine unabhängige, robuste, auch offline nutzbare Lösung, bei welchem der ESP selber die Rolle des Webservers (und bei Bedarf Wifi Access Point) übernimmt. Nicht zuletzt, weil es faszinierend ist, dass ein $4 Gerät dies alles kann!
Die erste Idee zur Realisierung der Steuerung wäre via Relais, welche mit den s5V eines Arduino rsp. 3.3V eines ESP die 230V schalten können. Die meisten benötigen 5 oder bis 12V Steuerspannung – es gibt aber auch Module mit integriertem Transistor, welche direkt an den ESP gehängt werden können.
Wir wollen aber einen eleganteren Weg gehen, welcher die Steuereinheit (den ESP) und die Schaltgeräte kabellos verbindet (und nebenbei vollständig CE kompatibel ist). Wir verwenden darum handelsübliche Funksteckdosen, welche z.B. im Conrad erhältlich sind.
Diese verwenden meist denselben Chip zur Funksignal-Decodierung. Dank der Arduino-Library RCSwitch, welche die Steuersignale für diese Funksteckdosen-Empfänger generiert, können wir mit einem simplen 433 MHz Funksender unsere Funksteckdosen ansteuern.
Material:
Um gängige Aufgaben effizient zu lösen, habe ich vor einiger Zeit begonnen, ein ESP8266 Framework aufzubauen. Der Code ist open-source auf Bitbucket verfügbar.
Das Framework besteht (zurzeit) aus folgenden Libraries:
1. Konfigurationswerte verwalten
Dazu wird eine Subklasse von Config angelegt, die Config-Werte als public Members angelegt und diese in den onLoad() / onSave() Events verarbeitet. Die Konfiguration wird als Json-Datei in den Flash-Speicher abgelegt (mithilfe des SPIFFS Dateisystems)
Achtung: Benötigt die ArduinoJson Library.
2. Daten in eine cloudbasierte Firebase-DB schreiben und auslesen
Die (volumenabhängig) kostenlose Firebase-DB kann mit dieser Library bequem als Remote-Speicher für Logdaten oder webbasierte Konfiguration etc. verwendet werden.
Achtung: Die Requests auf Firebase erfolgen via HTTPS/TLS, was dem ESP rund 22kB der ca. 36kB (bei Verwendung des Arduino Core) verfügbaren Speichers abverlangt! Im Zweifelsfall mit ESP.getFreeHeap() die Speicherverwendung prüfen.
3. Einen Webserver für statische Files verwenden
Der ESP mit seinen bis zu 4 MB Flash kann für viele Anwendungen gut als Webserver fungieren. Dank dem SPIFFS Filesystem und dem zugehörigen Upload-Tool können Files vergleichsweise bequem im ESP gespeichert werden.
Das Servieren übernimmt die WebComponent GeneralWebserver, welche auf dem Beispielcode im ESP Core basiert und diesem Features wie Directory Browsing, Caching mittels ETag und GZip-Komprimierung hinzufügt.
Achtung: Wir sind immer noch auf einem SoC, keinem ausgewachsenen Server! Der Webserver kann nicht mit Apache & Co vergleichen werden. Für das Servieren von schicken Bedienoberflächen (z.B. Bootstrap-basierend) reicht es aber allemal.
Als Ausgangspunkt kann der im Framework mitgelieferte SPiffs-Filesystem-Data Ordner verwendet werden. Er enthält ein für den ESP angepasstes HTML-Template sowie Bootstrap, jquery, knockout.js und mehr.
Wie man seine statischen Files auf den ESP lädt, ist hier beschrieben.
Wie sieht nun der Code für unsere webbasierte Funksteckdosen-Steuerung aus?
Die Adressierung der Geräte ist hier beschrieben. Wenn alles klappt, sollten auf dem ESP nun folgende Web-Routen zur Verfügung stehen und die entsprechenden Funksteckdosen ein- und ausschalten:
http://<esp-ip>/api/switch/light1/on http://<esp-ip>/api/switch/light1/off http://<esp-ip>/api/switch/light2/on http://<esp-ip>/api/switch/light2/off http://<esp-ip>/api/switch/heater/on http://<esp-ip>/api/switch/heater/off http://<esp-ip>/api/directory
Damit steht nun eine Webservice-API zur Verfügung, zu welcher man nach Bedarf eine schöne Benutzeroberfläche entwickeln kann. Oder deren Endpunkte man von seiner eigenen Applikation aus aufrufen kann. Oder via einem Service wie IFTTT.com Maker Channel verknüpfen, so dass z.B. das Licht angeht, wenn Google’s Börsenkurs um mehr als 3% sinkt. Im Gegensatz zur Nützlichkeit sind der Fantasie kaum Grenzen gesetzt.
Möchte man die API auch von ausserhalb des heimischen Netzwerks aufrufen, muss auf dem Router/Firewall ein entsprechendes Port-Mapping eingestellt werden. Tut man dies ohne weitere Absicherung, stehen die URLs frei jedem zur Verfügung, und vermutlich wird zu Hause das Licht öfter mal an- und ausgehen. Basic Auth wäre einfach zu realisieren, ist aber über unverschlüsseltes HTTP keine gute Idee – und leider kann der ESP zwar in der Clientrolle, nicht aber in der Serverrolle HTTPS. Ein User-, Auth-, und Session-Handling fehlt dem ESP Framework noch (Pull Requests sind willkommen).
An unserem Team Hackathon haben unsere Entwickler den ESP und das ESP Framework ausgiebig ausprobieren können. Wir haben zusätzlich noch Temperatur- und Luftfeuchtigkeits-Sensoren verwendet, um aktive Steuerungen, Daten-Logger und mehr zu bauen. Ein Entwickler hat zudem einen 433 MHz Receiver verwendet, um einen “Steckdosen-RF-Protokoll-Sniffer” zu bauen.
Der ESP ist ein faszinierendes Stück Technologie. Hier werden auf einem einzelnen Chip Elektronik- und Webanwendungen vereinbar, und dies zu Preisen, welche die Massenfertigung erlauben. Dank der Arduino-Kompatibilität steht ein sehr umfangreiches Ökosystem an Tools und Libraries zur Verfügung.
Wir sind uns sicher, dass der ESP8266 in vielen Produkten verwendet werden kann und wohl vielerorts wo eine Internetverbindung einen Mehrwert bringt, die betagten klassischen Atmel Arduino-Prozessoren verdrängen wird. Wir werden ihn für embedded / IoT Projekte auf jeden Fall gerne einsetzen.