Herbert Reloaded: Haus Automation

Mein Projekt, die Wohnung komplett über ein Automationsbus zu steuern, geht langsam voran. Aber warum noch ein Haus Automations Bus? Weil die bereits verfügbaren nicht genau dem entsprechen, was ich gerne hätte. Einige sind auf eine dauerhafte Verbindung ins Internet angewiesen, andere sind zu teuer, oder nicht vollständig. Oder benötigen Datenleitungen zu den Knotenpunkten.

Herbert wird einmal die Wohnung steuern und dafür werde ich existierende Hardware umbauen, oder eigene Hardware entwerfen, die genau die Aufgaben erfüllt, die ich mir von einem Hausbus wünsche. Der Aufbau wird folgende Topologie besitzen:

Herbert Topologie V2.0

Das Zentrum von Herbert ist ein Raspberry Pi 2, der in einem externen Festplattengehäuse untergebracht ist. Die externe Festplatte ist immer noch in dem Gehäuse und wird die Speicherzentrale für das NAS. Der Pi hat leider nur langsames USB 2.0. Da das WLAN und die Festplatte über USB angeschlossen sind werden keine neune Geschwindigkeitsrekorde aufgestellt werden können. Für regelmäßige Backups ist es allerdings schnell genug.

Herbert 2.0

Neben dem NAS besitzt Herbert ein openHAB Interface. openHAB ist ein offenes Haus Automation System, dass in Java entwickelt wurde, dadurch ist es auf vielen Plattformen lauffähig. Es besitzt Module um viele bereits verfügbaren Systeme zusammen zu schließen und über die eine Plattform zu steuern. Ich habe mich entschieden die Kommunikation über MQTT zu lösen. MQTT ist eine Kommunikationsplattform für Maschine-zu-Maschine Kommunikation. Man kann sich ein einem Verteiler (Broker) anmelden und für verschiedene Nachrichten anmelden. Danach erhält man die Nachrichten auf diesem Kanal. Der Part des Brokers wird von der offenen Software Mosquitto übernommen, die ebenfalls auf dem Raspberry Pi läuft.

Die Firmware NodeMCU besitzt ein Lua Modul, dass die Kommunikation mit einem MQTT Broker sehr einfach gestaltet. Das Modul mqtt.Client() bietet Funktionen zum Anmelden für Nachrichten, als auch zum Verschicken von Nachrichten.

Diese Nachrichten werden an vereinbarte Topics gesendet. Diese sind in der Konfigurationsdatei von openHAB und in der Lua Quelltext abgespeichert. Weitere Funktionen des NodeMCU sind der Stromsparende Tiefschlafmodus und die Kommunikation über die serielle Schnittstelle. Beide dieser Funktionen werden an unterschiedlicher Stelle benötigt. Der Tiefschlaf ist für die Sensoren notwendig, wenn diese nur Nachrichten senden, aber keine Empfangen sollen. Die serielle Schnittstelle ist für die Kommunikation mit einem anderen Controller gedacht, der dem ESP die nötige Berechnungspower zur Verfügung stellen kann.

Der Auf/Zu Sensor ist in der Aktuellen Version dem Fensterwächter sehr ähnlich. Allerdings ist er noch nicht so weit veröffentlicht zu werden. Alle Module mit allen Programmen und Schaltungen werden aber in der nächsten Zeit hier zur Verfügung stehen. Der Code und die Konfigurationsdateien für Herbert liegen ebenfalls auf GitHub.

Resourcen:
Raspberry Pi Debian Variante: Rasbian
openHAB Dokumentation + Autostart Anleitung
MQTT auf dem Raspberry Pi installieren
NodeMCU API Dokumentation

ESP8266 – 1: Fensterwächter

Wie in einem früheren Beitrag schon beschrieben kann für die ESP8266 Module aus China die Entwicklungsumgebung für NodeMcu aufgesetzt werden. In diesem Beitrag werden wir das erste Projekt erstellen und den Controller programmieren.

Morgens mache ich das Schlafzimmerfenster immer auf, um zu lüften. Wenn ich dann vor dem ersten Kaffee schon auf dem Weg zur Arbeit bin, kann es passieren, dass das Fenster weiterhin offen ist. Mist. Also brauch ich etwas, dass mir sagt, dass das Fenster noch geöffnet ist. Ein Fensterwächter.

Mit Hilfe von einigen Komponenten, dem ESP-01 Modul, einem Mikroschalter und einer Batterie kann genau das erreicht werden.

Das ganze soll neben dem Fenster am Fensterrahmen befestigt werden. Dazu werde ich ein 3D gedrucktes Gehäuse verwenden, in dem alles untergebracht ist. Wenn das Fenster geöffnet wird, wird der Mikroschalter nicht mehr betätigt und schließt den Stromkreis zum Controller. Dieser startet und geht sofort für 10 Minuten in den Tiefschlaf. Wenn er daraus erwacht, ohne dass die Batteriespannung zwischendurch getrennt wurde, verbindet es sich mit dem WLAN Accesspoint und sendet eine Email, die dann auch meinem Mobiltelefon angezeigt wird.

Hardware

Wie schon beschrieben benötigen wir mehrere Komponenten für den Aufbau des Fensterwächters. Das ESP8266 Modul ESP-01 hat 8 Pins mit dem es die wichtigsten Signale nach Außen führt. Wie zu erkennen sind lediglich zwei GPIOs herausgeführt. Für unsere Zwecke benötigen wir aber genau keine. Für das Flashen der NodeMcu Software allerdings werden genau diese beiden Pins benötigt. Weiterhin ist der CH_PD Pin herausgeführt, der sorgt dafür, dass das Modul abgeschaltet ist, wenn er nicht auf VCC liegt. Für Experimentierzwecke habe ich den Pin über einen 100Ohm Widerstand mit VCC verbunden. Zu beachten ist, dass auf dem ESP-01 Modul der Pin zum Aufwecken des Controllers (GPIO 16) nicht mit dem RST Pin verbunden ist.

ESP-01 Pinbelegung

Das Modul kommt mit einer Firmware ausgestattet, die über die Serielle Schnittstelle angesprochen werden kann. Um diesen Betriebsmodus zu verwenden benötigt man dann noch einen zweiten Controller, der mit dem Modul kommuniziert. Wir wollen allerdings nur den einen Controller einsetzen, müssen also die darauf befindliche Firmware ändern. Das kann ganz einfach mit dem NodeMcu Flasher passieren. Dazu verbinden wir die Pins GPIO0 mit GND und GPIO2 mit VCC. Dadurch befindet sich der Chip nache einem Reset in einem Zustand indem der Bootloader über die serielle Schnittstelle eine neue Firmware in den Speicher des Moduls schreiben kann. Der Flasher übernimmt alles was dafür notwendig ist.

Mit dem ESPlorer kann jetzt die Lua Software auf dem Modul geschrieben werden. Das Erste was wir tun ist eine ‚init.lua‘ erstellen, die wird beim Start des Controllers ausgeführt.
Der grundlegende Programmablauf ist oben schon aufgeführt:

  • Power up
  • Deep Sleep für 10 Minuten
  • Wake up
  • Verbinde mit WLAN Router
  • Sende Email
  • Deep Sleep bis Power down
Die API von NodeMcu gibt Informationen über die benötigten Funktionen:
Es fehlt lediglich der Programmteil zum senden der Email-Warnung.

So weit zur Theorie. Ein Problem zeigt sich bei der Umsetzung des Email Versandes. Da der ESP sich nicht als SMTP Server behaupten kann, Eine Möglichkeit ist es die Kommunikation mit einem SMTP Server manuell zu programmieren, einfacher ist es jedoch einen bereits existierenden Service, wie zum Beispiel PushingBox.com zu nutzen. Dort kann man über eine HTTP API eine Notification, oder eine Email abschicken. Das Ganze ist dann auch von dem PC aus konfigurierbar und lässt auf dem ESP genügend Platz für andere Funktionen.

Gestartet wird immer in der ‚init.lua‚. Egal ob aus dem Power down, oder dem Tiefschlaf. Das führt dazu, dass nicht genau erkannt werden kann, aus welchem Vorzustand der Chip kommt. Es wird also nach dem Aufwachen ein Timer gestartet und der Chip befindet sich im idle Modus. Welche Folgen das für den Stromverbrauch und die daraus resultierende Batterielaufzeit hat, wird sich noch herausstellen. http://gist-it.appspot.com/github/DasBasti/esp8266/blob/master/Sensoren/Fenster/FensterOffenWarner/init.lua?footer=minimal&slice=8:11
Nachdem die 10 Minuten, oder (600000 ms) abgelaufen sind, wird die Datei ‚fenster.lua‚ aufgerufen und interpretiert. Als erstes muss das WiFi-Modul gestartet werden. Dann wird die Verbindung mit dem Accesspoint hergestellt. http://gist-it.appspot.com/github/DasBasti/esp8266/blob/master/Sensoren/Fenster/FensterOffenWarner/fenster.lua?footer=minimal&slice=5:8
Sobald die Verbindung zum Accesspoint besteht und das Modul eine IP-Adresse erhalten hat, soll die Funktion pollPushingBox() aufgerufen werden. Dazu verwenden wir einen neuen Timer: http://gist-it.appspot.com/github/DasBasti/esp8266/blob/master/Sensoren/Fenster/FensterOffenWarner/fenster.lua?footer=minimal&slice=33:41
Die pollPushingBox() Funktion baut eine TCP Verbindung mit dem PushingBox Service auf und sendet einen API Request um einen Alarm auszulösen. http://gist-it.appspot.com/github/DasBasti/esp8266/blob/master/Sensoren/Fenster/FensterOffenWarner/fenster.lua?footer=minimal&slice=12:26http://gist-it.appspot.com/github/DasBasti/esp8266/blob/master/Sensoren/Fenster/FensterOffenWarner/fenster.lua?footer=minimal&slice=28:31
Nachdem der Server geantwortet hat, geht das Modul in den unendlichen Tiefschlaf. Erst ein Wegfallen der Batteriespannung (durch Schließen des Fensters) wird der Chip resettet und bei erneutem Öffnen beginnt der Code wieder in der ersten Zeile der init.lua.

Der Code zeigt, wie einfach mit NudeMcu und Lua ein ESP2866 für einfache Zwecke verwendet werden kann.