Überblick Homeautomation mit Raspberry Pi und ESP8266
Im Sinne der steigenden Homeautomation steigen auch die Preise von schlüsselfertigen “Smart Home” Lösungen. Eine Lösung, bei welcher man selbst noch einiges lernen kann, Geld spart und Spaß hat, heißt “mach es selbst” (DIY).
In dieser Anleitung zur Homeautomation wird erklärt, wie man von einem Computer aus einen Verbraucher , welcher mit einem WLAN-fähigen Mikrokontroller verbunden ist, drahtlos ein- und ausschalten kann. Dies könnte man ein bisschen mit einer Funksteckdose vergleichen, allerdings auf WLAN Basis.
Dazu möchte ich zeigen, wie man:
- den Mikrokontroller programmiert
- welche Software installiert werden muss
- was dahinter steckt
Was unterscheidet dieses How-To von anderen ESP8266?
Alle Begriffe im nächsten Absatz werden später noch erklärt und werden nicht als Grundwissen vorausgesetzt. Sie dienen lediglich dazu, Kennern mit Erfahrung in diesem Bereich eine Orientierung des Artikels zu geben.
Dieses How-To verwendet einen üblichen ESP8266 Mikrokontroller. Allerdings wird die Software bereits so angepasst, dass der ferngesteuerte Schalter (über Mosquitto) sehr einfach in ein System zur Heimautomation (OpenHAB2 und Amazon Echo) eingebunden werden kann.
Voraussetzungen/Vorkenntnisse
- Ein Linuxcomputer (z.B. Ubuntu) oder einen Raspberry Pi (empfohlen)
- Ein ESP8266 NodeMCU Board
- Ein WLAN Router oder einfach ein WLAN Netzwerk (dessen SSID und Passwort)
- Ein Relai oder eine LED
- Umgang mit der Kommandozeile
- Installation von Programmen
Zusätzlich empfohlene Hardware:
- ein Mikro USB Kabel
- eine Versuchsplatine
- eine 5V Stromversorgung
- ein paar Jumperkabel
Wieso ein Raspberry Pi oder Linux Computer?
Der Raspberry Pi hat den Vorteil, dass:
- er günstig in der Anschaffung ist
- er eine riesige Community hat
- die Installation sehr einfach ist
- er geringe laufende Kosten hat
- er über eine passive Kühlung verfügt
Das macht ihn zum Spitzenkandidaten. Natürlich gehen auch andere Boards wie Odroid, Beaglebone, Omega2+ usw. Meiner Ansicht nach ist die Installation auf dem Raspberry Pi am einfachsten. Bei einer Neuanschaffung empfehle ich den Raspberry Pi 3 , da dieser Preis-Leistungstechnisch einfach am besten geeignet ist.
Wieso ein ESP8266 Node MCU Board?
Diese Boards haben mehrere große Vorteile:
- Sie sind extrem günstig
- Sie haben einen USB Anschluss
- Sie sind leistungsstärker als ein vergleichbarer ATMega der gleichen Preisklasse
- Sie haben ein integriertes WLAN Modul
Diese Module gibt es mit zwei verschiedenen Chips für den USB Controller. Sofern der CH340 Chip verwendet wird, muss der unten genannte Treiber unter Windows installiert werden. Unter Linux wird dieser sofort erkannt.
Welche Software wird verwendet?
- Mosquitto
- Arduino IDE
- CH340 Treiber (wird nur bei Windows benötigt, wenn das ESP Board den CH340er Chip hat)
- MQTT.fx
Wieso Mosquitto?
Mosquitto ist eine Implementierung des MQTT Protokolls . Dabei handelt es sich um ein Nachrichtenprotokoll zur Kommunikation zwischen verschiedenen Geräten. Da dass Ziel ist, einen Verbraucher von einem entfernten Computer zu steuern, bietet sich dieses Protokoll an. Es hat folgende Vorteile:
- geringer Speicherbedarf
- zuverlässige Übertragung auch bei hohen Verzögerungen
- Standardprotokoll bei IoT (Internet of Things)
- direkte Integration in das Heimautomatisierungssystem OpenHAB2
- einfache Installation durch Mosquitto
Dieses Protokoll wird auch verwendet, da etwas wiederverwertbares realisiert werden soll. Der Verbraucher kann in späterer Folge direkt über eine Schnittstelle von OpenHAB2 gesteuert werden. Diese Schnittstelle, kann dann ein beliebiges Handy, PC, oder Mikrokontroller sein.
Wieso OpenHAB2
OpenHAB2 ist eine Open-Source Lösung für Heimautomation, welche ein Grundgerüst bereitstellt. Sie muss nur mehr für die eigenen Zwecke eingestellt werden und nimmt einem eine Menge Arbeit ab. Darüber hinaus gibt es viele Plugins, welche die Kommunikation vereinfachen. Z.B. gibt es eine einfache Möglichkeit eine Amazon Echo mit OpenHAB2 zu verbinden. Damit kann man dann die Verbraucher/Sensoren direkt über einen Sprachbefehl steuern. Auf die Amazon Echo und OpenHAB2 wird in diesem Tutorial nicht weiter eingegangen.
Weitere Infos zu Mosquitto
Wer ROS , welches in der Robotik sehr verbreitet ist, kennt, wird mit Mosquitto seine Freude haben. Die Funktionalität ähnelt sehr stark dem Publisher-Subscriber Prinzip bei ROS. Bei Mosquitto gibt es einen zentralen Punkt, wo sämtliche Kommunikation zusammenläuft, der sogenannte Broker bzw Server. Bei ROS wäre das der roscore. Ein Beispiel: Gerät A möchte etwas mitteilen (z.B. Temperatur eines Sensors) und meldet sich beim Broker an. Nun kann sich ein anderes Gerät B beim Broker anmelden und mitteilen, dass er gerne den Temperaturwert hätte. Daraufhin verbinden Sie diese beiden und Gerät A schickt an Gerät B den Wert. Der Broker ist also für die Verbindungsherstellung notwendig. Daher sollte der Broker, wenn man sein Zuhause automatisieren möchte, eigentlich immer verfügbar sein. Daher bietet sich der Raspberry Pi sehr gut an, da man für diese kleinen Arbeitsaufgaben keinen vollständigen PC benötigt.
Wieso Arduino IDE
Zur Programmierung des Mikrokontrollers brauchen wir irgendeine praktische Programmierumgebung. Die Arduino IDE ist frei verfügbar und sehr flexibel. Alle benötigten Bibliotheken und Boards sind einfach hinzuzufügen. Außerdem gibt es eine riesige Community, welche bei Fragen helfen kann.
Wieso MQTT.fx?
Zum Einstieg empfehle ich, MQTT.fx zu installieren. Dies ist ein einfaches grafisches Fenster, welches Nachrichten anzeigen kann, welche über Mosquitto gesendet werden. Das ist zur Fehlersuche äußerst nützlich. Diese Software ist natürlich frei verfügbar und gibt es zum Download für alle großen Systeme.
Ziele dieses How-To
Damit wir sehen, dass die Kommunikation in beide Richtungen funktioniert, sind das unsere Ziele:
- Steuern des Verbrauchers am Mikrokontroller über WLAN mit der Kommandozeile.
- Empfang einer Nachricht vom Mikrokontroller.
Damit wir am Schluss auch unser tolles Resultat sehen können, wären eine LED und ein Widerstand von Vorteil. Angeblich soll es auch mit der eingebauten LED gehen, was bei mir aber nicht der Fall war.
Installation
Raspberry Pi
Sofern der Raspberry Pi neu sein sollte und noch kein System darauf läuft, empfehle ich gleich die komplette Installation des OpenHABian. Ansonsten kann dieses Kapitel übersprungen werden.
Hier eine kleine Zusammenfassung wie man das Betriebssystem auf die SD Karte des Raspberries bekommt.
- SD Kartenabbild (Image)
- Kartenabbild entpacken. ( 7zip unter Windows, unxz unter Linux)
- Software , um das Kartenabbild auf die SD Karte zu schreiben.
Möchte man Name, Benutzer, Passwort und WLAN Einstellungen anpassen, öffnet man nun die SD Karte am PC und sucht die Datei “openhabian.raspbian.conf”. Dort können dann folgende Werte verändert werden:
- hostname=openHABianPi
- username=openhabian
- userpw=openhabian
- wifi_ssid=”My Wi-Fi SSID”
- wifi_psk=”password123″
Danach die Karte in den Raspberry Pi stecken, Netzwerkstecker verbinden und den Pi per Mikro USB mit Spannung versorgen und warten. Das kann durchaus bis zu 45 Minuten dauern. Danach meldet sich dieser unter dem Namen “openhabianpi” im Netzwerk an.
Benutzer und Passwort sind “openhabian”, wenn diese nicht verändert wurden.
Mosquitto
Die Installation des Mosquitto Brokers auf dem Raspberry Pi unter Ubuntu oder einem anderem Debian-basierten Betriebssystem verläuft hier über den Paketmanager sehr einfach.
- sudo apt-get update
- sudo apt-get install mosquitto
- sudo apt-get mosquitto-clients
Falls der vorige Befehl zur Installation von Mosquitto nicht funktionieren sollte, muss zuerst eine neue Paketquelle über den folgenden Befehl hinzugefügt werden:
- wget http://repo.mosquitto.org/debian/ mosquitto-repo.gpg.key
- sudo apt-key add mosquitto-repo.gpg.key
Für die Installation unter Windows muss die Installationsdatei hier heruntergeladen werden.
Arduino IDE
Das Arduino IDE kann hier heruntergeladen werden. Damit wir das ESP8266 Node MCU auswählen können, muss dieses Board zuerst hinzugefügt werden. Dies geht ganz einfach, indem wir die Quelle für dieses Board hinzufügen unter: Datei -> Voreinstellungen -> Zusätzliche Boardverwalter URLs
Dort fügen wir dann folgende Zeile hinzu:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Zusätzlich brauchen wir nun noch eine MQTT Bibliothek . Dazu gehen wir einfach auf “Sketch->Include Library->Manage Libraries” und suchen dort nach “adafruit mqtt”. Aktuell habe ich die Version 0.17.0 installiert. Eine neuere Version kann natürlich auch verwendet werden. Es gibt zwar noch ein paar andere Implementierungen des MQTT Protokolls, aber Adafruit liefert gleich ein recht übersichtliches Beispiel mit.
Aufbau und Ausführung
Nun wird der Mikrokontroller über USB mit dem Computer, wo die/das Arduino IDE installiert ist, verbunden. Unter Tools/Werkzeuge wählen wir dann unser verwendetes Board aus. In meinem Fall entspricht das einem NodeMCU 1.0 (ESP-12E Module) . Ähnliche USB Module wie das Huzzah von Adafruit oder andere ESP8266 Chips, welche über einen USB Programmierer verbunden sind, funktionieren eigentlich genauso. Die ESP Module mit USB Port sind natürlich komfortabler. Für mobile Projekte auf Akkubasis wären kleine Module ohne USB Port und Spannungswandler natürlich sparsamer. Allerdings ist die Hauptzielgruppe hier die Heimautomatisierung und hier machen ein paar Milliampere im Verbrauch keinen großen Unterschied.
Weitere folgende Einstellungen unter Tools/Werkzeuge sind dann noch die CPU Frequenz: 80 MHz , die Flash Größe: 4M (1M SPIFFS) und die Upload Geschwindigkeit: 115200 .
Als Port wählt ihr natürlich das angesteckte ESP Modul z.B: /dev/tty/USB0 unter Linux oder COMX unter Windows.
Dann wählt ihr unter “File/Datei->Examples/Beispiele->Adafruit MQTT Library->mqtt_esp8266”, wie im Bild unten zu sehen ist. Dieses Beispiel hat beinhaltet schon fast alles. Das Einzige, was hierbei fehlt, ist die Steuerung eines Ausganges, wenn wir eine bestimmte Nachricht erhalten.
Nun müssen nur noch ein paar Kleinigkeiten eingestellt werden und der erste Schritt Richtung Homeautomation ist getan. Darüber hinaus können wir dann gleich testen, ob die Kommunikation funktioniert.
Zuerst müssen wir noch den Namen und das Passwort des WLANs definieren, mit welchem sich unser Modul verbinden soll.
Danach muss man die IP Adresse des Rechners angeben, auf dem Mosquitto installiert wurde.
Auf Linux bekommt man diese ganze einfach, indem man “ifconfig” in ein Terminal eingibt. Unter Window gehts am schnellsten mit Windowstaste + R -> cmd -> ipconfig
Wurde kein Benutzer und Passwort für den Mosquitto Server gesetzt, ist die Kommunikation, innerhalb des lokalen Netzwerkes, ungeschützt. Das ist eigentlich kein Problem, außer ihr befindet euch in einem öffentlichen Netzwerk. Wollt Ihr einen Benutzer und ein dazugehöriges Passwort erstellen, könnt Ihr euch hier einlesen.
Wenn ihr den Namen der Nachrichten (“topic”) einstellen wollt braucht ihr diesen (siehe Markierung im nächsten Bild) nur abzuändern.
Nun wollen wir endlich die LED schalten. Die LED soll angehen, wenn wir “ON” über “/feeds/onoff” senden und ausgehen, wenn etwas anderes gesendet wird. Das is übrigens der Standardwert von Schaltern bei OpenHAB2.
Zunächst müssen wir einen Ausgang definieren, der geschaltet werden soll. Dafür nehme ich einfach den ersten Ausgang und definiere diesen unterhalb von “void setup” in Zeile 60 mit “ pinMode(D0, OUTPUT); ”
Um die Schaltfunktionalität mit möglichst geringem Aufwand zu erreichen, gehen wir nun auf Zeile 100 und fügen den folgenden Code nach “Serial.println” ein, welcher die erhaltene Nachricht auswertet und den Ausgang D0 entweder ein- oder ausschaltet.
Dann seid ihr bereit, den Sketch auf den Mikrokontroller hochzuladen und zu testen. Mit STRG+R könnt ihr zunächst mal den Sketch kompilieren, um zu sehen, ob der Code Fehler enthält. Wenn keine Fehler aufgetreten sind, kann der Sketch nun mit STRG+U hochgeladen werden. Dies kann durchaus einige Sekunden dauern. Erhaltet ihr als Ergebnis “ Done uploading ”, scheint alles geklappt zu haben.
Manchmal liefert der USB Port auch zuwenig Strom oder das USB Kabel ist schlecht. Dann könnt ihr das Board zusätzlich an eine externe Stromversorgung anschließen. Dazu sind die Pins “Vin” und “GND” zu verwenden. Normalerweise hält ein ESP8266 nur 3.3V aus, aber bei dem NodeMCU ist ein Spannungsregler an Board, darum ist es möglich Spannungen bis 20V anzuschließen. Allerdings wird die Spannung auf 3.3V heruntergeregelt, was heißt, dass die überflüssige Spannung irgendwo verheizt werden muss. Der interne Spannungsregler kann bis zu 800mA zur Verfügung stellen. Von daher bietet sich ein Netzteil (Handyladegerät) mit einer Spannung von 5V/1A an. Wenn man keine Pläne hat viel anzuhängen, reicht natürlich eine geringere Stromversorgung auch aus.
Öffnet nun den Seriellen Monitor (STRG+Shift+M oder Lupe rechts oben) im Arduino IDE, stellt auf Baud 115200 und drückt die Resettaste am Modul oder verbindet kurz mit einem Jumperkabel den Pin RST mit GND des Mikrokontrollers. Danach solltet ihr sehen, wie sich das Modul verbindet.
Nun ist der Softwareteil für den NodeMCU fertig. Damit wir auch etwas sehen, sollten wir nun etwas an den Ausgang “D0” des NodeMCU anschließen. Ich empfehle, zu Beginn die Anode einer kleinen LED an den Ausgang D0 zu hängen und die Kathode der LED mit Ground “GND” zu verbinden. Dies ist im nachfolgenden Bild zu sehen. Außerdem habe ich zur Sicherheit einen kleinen Widerstand in Serie zur LED geschaltet. Die Batterie dient nur als Symbolfoto. Anstatt des LEDs kann natürlich auch ein Relais geschaltet werden.
Nun ist es an der Zeit MQTT.fx zu starten. Läuft das Programm auf dem gleichen Rechner wie der Mosquitto Server, könnt ihr euch gleich verbinden (“localhost”). Ansonsten klickt man links oben (unterhalb von File) auf das Dokumentensymbol und erhält ein Eingabefenster wo die IP des Mosquitto Servers eingegeben werden kann. Der Port ist für gewöhnlich 1883. Ein Klick auf “Connect” sollte uns direkt verbinden.
Sobald ihr verbunden seid, klickt ihr auf “Subscribe”, dann unten auf “Scan”.
Sofern der NodeMCU richtig ins WLAN eingeloggt ist, sollte er bereits Nachrichten unter dem Namen “/feeds/photocell” mit einer aufsteigenden Zahl senden. Das zeigt uns, dass die Kommunikation vom Modul zum PC funktioniert. Ansonsten sollte nochmal im seriellen Monitor der Arduino IDEs überprüft werden, ob sich das Modul richtig verbunden hat.
Die Nachrichtenanzeige sollte auch von der Kommandozeile aus funktionieren mit:
mosquitto_sub -d -t “/feeds/photocell”
Sollte der Mosquittoserver auf einem anderen Rechner laufen, muss natürlich dessen IP noch definiert werden. Dann würde der Kommandozeilenbefehl folgendermaßen aussehen. Bitte die IP Adresse mit der eures Servers ersetzen.
mosquitto_sub -h 192.168.0.19 -t “/feeds/photocell”
Die andere Richtung kann genauso getestet werden. Nun ist die Stunde der Wahrheit gekommen. Wurde der Name der Nachricht nicht geändert könnt ihr nun die LED einschalten mit:
mosquitto_pub -d -t “/feeds/onoff” -m “ON”
und ausschalten mit:
mosquitto_pub -d -t “/feeds/onoff” -m “OFF”
Die Nachricht sollte auch in MQTT.fx sichtbar sein, ansonsten gibt es ein Problem mit der Kommunikation. Das gleiche Prinzip wie beim Lesen der Nachrichten (Subscriber), gilt natürlich auch für das Senden der Nachrichten (Publisher). Wenn der Befehl nicht am Mosquittoserver selbst ausgeführt wird dann muss noch der Parameter für den Host “ -h 192.168.0.19” hinzugefügt werden.
Erweiterungsmöglichkeiten für Homeautomation
Der nächste Schritt wäre nun OpenHAB2 auf dem Rechner mit Mosquitto zu installieren. Sofern OpenHABian verwendet wurde, ist das auch schon erledigt. Danach ist es sehr einfach, ein schönes grafisches Interface zu erstellen, um die Geräte zu steuern, welche am NodeMCU hängen. Ein einfaches Beispiel für Homeautomation mit Schaltern ist in der nächsten Grafik zu sehen.
Darüber hinaus können diese auch mit der Amazon Echo verbunden werden. Somit hat man gleich die Möglichkeit, seine Geräte per Sprache anzusteuern. Wie das genau funktioniert, schauen wir uns ein anderes mal an!