WLAN- statt LoRa-Schalter - Integriert in Home Assistant mit ESPHome
über
In Elektor März/April 2020 wurde ein ferngesteuerter Wechselspannungs-Leistungsschalter mit Zustandsrückmeldung vorgestellt, der über LoRa kommunizierte. Es war außerdem ein modulares Projekt mit dem Relais und der Leistungsschaltung auf einer Platine und dem LoRa-Kommunikationsteil auf einer anderen. Die Schaltung in einem wasserdichten IP66-Gehäuse war bestens für den Außeneinsatz geeignet.
Das interessierte mich, weil ich einen Schalter für den Außenbereich suchte, der sich leicht in mein Hausautomatisierungssystem integrieren ließ. Dieses System basiert auf Home Assistant und WLAN, aber nicht auf LoRa. Ich hätte mein System zwar um LoRa erweitern können, aber ich wollte mich nicht damit befassen. Stattdessen dachte ich, wenn ich das LoRa-Modul einfach durch ein WLAN-Modul ersetze, könnte ich es mit ESPHome betreiben, das hervorragend mit Home Assistant funktioniert (Bild 1)[2].
Definieren der Schnittstelle
Wenn man eine Schaltung anpassen möchte, muss man zunächst etwas über die Verbindungsmöglichkeiten herausfinden. Der Schaltplan des Wechselstrom-Leistungsschalters ist nicht besonders kompliziert (Bild 2). Oben haben wir die Stromversorgung mit dem AC/DC-Wandler MOD1, der aus der Netzspannung eine Gleichspannung von +5 V mit einigen Schutz- und Filterfunktionen erzeugt.
In der Mitte befindet sich das bistabile Relais RE1, das die Last ein- und ausschaltet. Ein bistabiles Relais ist einem mechanischen Schalter sehr ähnlich, da es seinen Zustand auch nach der eigentlichen Betätigung beibehält. Zum Umschalten sind die beiden Steuersignale Set und Reset (active high) erforderlich, die von einem Controller stammen und von den MOSFETs T1 und T2 gepuffert werden.
Das Relais ist durch eine 5-A-Sicherung F2 geschützt, obwohl das Relais bis zu 16 A schalten könnte. Der Grund dafür ist, dass die Leiterbahnen auf der Platine nicht so viel Strom vertragen, so dass die Sicherung eher sie vor dem Durchbrennen schützt. Die Schaltplatine kann immerhin Lasten bis etwa 1 kW verarbeiten.
Unten links findet sich ein Optokoppler IC1, der parallel zur Last geschaltet ist und deshalb auch zusammen mit der Last eingeschaltet wird. Seine LED schaltet den Transistor durch, so dass der Ausgang auf Low geht. C4 und R4 sorgen dafür, dass aus der eigentlich pulsierenden Gleichspannung am Ausgang ein schöner, gleichmäßiger Pegel wird. Wenn die Last ausgeschaltet ist, ist der Ausgang des Optokopplers dagegen high.
Der Verbinder rechts unten stellt alle benötigten Signale zur Verfügung. An S1 kann man einen Taster im/am Gerät anschließen, damit der Leistungsschalter auch lokal gesteuert werden kann.
Ein beachtenswertes Detail: Der Optokoppler muss mit 3,3 V versorgt werden. Und da auf der Platine keine 3,3-V-Versorgung vorhanden ist, muss diese Spannung von der Steuerplatine bereitgestellt werden.
Das WLAN-Modul ESP-01
Die Aufgaben einer WLAN-Steuerplatine für den Wechselspannungs-Leistungsschalter sind:
- Sie muss zwei digitale Eingänge zum Lesen des Optokoppler-Ausgangs und von S1 bereitstellen
- Sie benötigt zwei digitale Ausgänge zur Steuerung von T1 und T2
- Sie muss 3,3 V für den Optokoppler bereitstellen.
Wenn Sie „vier digitale I/O-Ports und WLAN und 3,3 V“ sagen, denken Sie natürlich sofort an ein ESP-01-Modul, da dieses genau vier GPIO-Ports und WLAN hat und mit 3,3 V betrieben wird. Dieses beliebte Modul, das auf dem ESP8266EX basiert, ist günstig und leicht erhältlich (Bild 3).
Es gibt jedoch ein großes Aber. Die vier GPIO-Ports des ESP-01 müssen mit Vorsicht behandelt werden, da sie auch bestimmen, wie das Modul nach dem Einschalten arbeitet. Für den normalen Betrieb müssen GPIO0, GPIO1 und GPIO2 beim Einschalten nämlich High sein, wie dies in den Hinweisen unterhalb der Pin-Definitions-Tabelle im Datenblatt des ESP8266EX erwähnt wird. Viele ESP8266-Anwender sind sich dieser Anforderungen an GPIO0 und GPIO2 bewusst, aber nicht jeder kennt die für GPIO1, besser bekannt als TXD oder serieller Ausgang.
Zuordnung von GPIOs zu Steuersignalen
Auf der Relaisplatine sind zwei der vier Steuersignale beim Einschalten immer low, nämlich „Set“ und „Reset“, bedingt durch die Widerstände R7 und R8. Wenn die Last beim Einschalten zufällig eingeschaltet ist, ist auch das „On“-Signal low, da das bistabile Relais seinen letzten Zustand beibehält, auch im stromlosen Zustand.
Der Eingang S1 ist potentialfrei. Sein Zustand beim Einschalten wird von der WLAN-Steuerplatine bestimmt, es sei denn, jemand drückt zufällig den Taster S1, wenn das System eingeschaltet wird. Alles in allem haben wir es also mit vier Signalen zu tun, die beim Einschalten alle low sein können. Sie werden jedoch an vier Ports angeschlossen, von denen drei beim Einschalten high sein müssen. Die Verwendung eines ESP-01-Moduls ist also in dieser Situation eine kleine Herausforderung.
Die Lösung: Transistoren hinzufügen
Die Lösung, die ich mir ausgedacht habe, sieht wie folgt aus (Bild 4):
- RXD (aka GPIO3) ist der einzige Pin, der ohne weiteres angeschlossen werden kann. Ich habe ihn daher mit dem Ausgang des Optokopplers verbunden, da sein Pegel beim Einschalten nicht vorhersehbar ist. RXD wird ein Eingang sein.
- Wenn GPIO0 beim Einschalten low ist, bootet das Modul im Flash-Programmiermodus. Dies kann zum Aktualisieren der Firmware nützlich sein, deshalb habe ich ihn mit S1 verbunden. Daher wird auch GPIO0 als Eingang fungieren.
- GPIO2 und TXD (auch bekannt als GPIO1) bleiben nun übrig und müssen daher als Ausgänge definiert werden. Um sie von den niedrigen Impedanzen zu entkoppeln, die durch R7 und R8 auf der Relaisplatine entstehen, habe ich P-MOSFETs mit einem Pull-Up-Widerstand an ihren Gates eingesetzt. Dadurch wird sichergestellt, dass beim Booten GPIO2 und TXD einen hohen Pegel sehen. Wenn der ESP-01 mit dem Booten fertig ist, können sie als Aktiv-Low-Ausgänge konfiguriert werden.
Der Ausgangstreiber
Der Ausgangstreiber ist in Bild 5 dargestellt. Wenn der GPIO auf low geht, wird der P-MOSFET BSS84 leitend. Dadurch wird das Gate des N-MOSFET BS170 auf high gezogen, so dass dieser ebenfalls leitet und die Spule des Relais mit Strom versorgt wird. Wenn das GPIO-Signal high ist, sperrt der P-MOSFET BSS84, und aufgrund des 1-kΩ-Pull-Down-Widerstands an seinem Gate auch der N-MOSFET BS170, so dass die Relaisspule nicht mit Strom versorgt wird. Der 10-kΩ-Widerstand am Gate des BSS84 sorgt dafür, dass der GPIO-Pin beim Einschalten auf high gezogen wird.
Auch das noch!
Für die 3,3-V-Stromversorgung habe ich einfach einen Low-Dropout-Regler an die 5-V-Versorgungsleitung angeschlossen (Bild 6). In der Praxis werden R1, R6 und LED1 nicht benötigt, da sie bereits auf dem ESP-01-Modul vorhanden sind, weshalb sie mit „NC“ gekennzeichnet sind, also nicht bestückt werden müssen. R5 wird ebenfalls nicht benötigt, aber ich habe ihn vorsichtshalber hinzugefügt. Geeignete Werte für R1 und R5 wären 10 kΩ, für R6 beispielsweise 470 Ω.
Für diese Schnittstelle zwischen WLAN-Modul und Schalterplatine habe ich eine kleine Platine entworfen (Bild 7), deren Dateien unter [3] zu finden sind.
Die YAML-Datei für ESPHome
Nachdem die Ein- und Ausgänge definiert sind, können wir die ESPHome-Konfigurations-YAML-Datei schreiben (siehe Kasten, downloadbar unter [3]). Sie ist etwas komplizierter als üblich, da das bistabile Relais zwei Pins anstelle von einem verwendet. ESPHome und Home Assistant kennen zwar eine sogenannte Cover-Komponente, die solche Peripheriegeräte steuern kann, aber sie ist eher für Garagentore, Fensterjalousien und ähnliches mit einem Öffnungs- und einem Schließtaster gedacht. Sie haben auch ein spezielles Icon. Unser Schalter ist nur ein Schalter, und deshalb soll er sich wie ein Schalter verhalten und wie einer aussehen. Dies lässt sich mit einem Schaltertemplate erreichen, das es erlaubt, das Verhalten für das Ein- und Ausschalten separat festzulegen.
Zuerst definieren wir GPIO1 (TXD) als einen invertierten Ausgang namens relay_set. GPIO2 wird als invertierter Ausgang mit der Bezeichnung relay_reset deklariert. Außerdem definieren wir GPIO3 als Binären Sensor (active low) für den Optokopplerausgang.
Dann spezifizieren wir einen kurzen 100-ms-Impuls auf dem relay_set-Ausgang als Einschaltaktion und dasselbe auf dem relay_reset-Ausgang als Ausschaltaktion. Als Schaltzustand geben wir den Zustand des Optokopplers zurück.
Damit der Taster S1 wie erwartet funktioniert, also ein Tastendruck die Last ein- und der nächste ihn ausschaltet, definieren wir GPIO0 ebenfalls als Binären Sensor (active low). Wenn er gedrückt wird, wird zuerst der Zustand des Optokopplers überprüft. Wenn die Last aktiv ist, dann schaltet das Relais sie aus, wenn die Last inaktiv war, dann schaltet das Relais sie ein. Ein if-then-else reicht dafür aus.
name: wifiswitch
platform: ESP8266
board: esp01_1m
wifi:
ssid: "my_ssid"
password: "my_passphrase"
# Logging impossible as UART0 pins are
# used for switches & sensors.
logger:
baud_rate: 0 # Hardware UART off.
# Enable Home Assistant API
api:
# Enable Over-the-Air programming
ota:
output:
- platform: gpio
id: relay_set
pin: GPIO1 # TXD, may not be pulled low at startup.
inverted: true
- platform: gpio
id: relay_reset
pin: GPIO2 # Do not pull low at startup.
inverted: true
switch:
- platform: template
name: "Wi-Fi switch"
id: wifiswitch
turn_on_action:
# Pulse the Set pin.
- output.turn_on: relay_set
- delay: 0.1s
- output.turn_off: relay_set
turn_off_action:
# Pulse the Reset pin.
- output.turn_on: relay_reset
- delay: 0.1s
- output.turn_off: relay_reset
# Use optocoupler state as switch state.
lambda: return id(optocoupler).state;
# Pushbutton & optocoupler.
binary_sensor:
- platform: gpio
name: "Wi-Fi switch pushbutton"
id: pushbutton
pin:
number: GPIO0 # Do not pull low at startup.
inverted: true
on_press:
then:
- if:
condition:
binary_sensor.is_on: optocoupler
then:
switch.turn_off: wifiswitch
else:
switch.turn_on: wifiswitch
- platform: gpio
name: "Wi-Fi switch optocoupler"
id: optocoupler
pin:
number: GPIO3 # RXD, may be pulled low at startup.
inverted: true
Fertig!
Nachdem Sie ESPHome mit dieser YAML-Datei kompiliert und das ESP-01-Modul geflasht haben, sollte der WLAN-Schalter im Home Assistant auftauchen und bereit sein für die Automatisierung. Jetzt kann er an seinem Bestimmungsort installiert werden und „etwas Last schalten“.
Weblinks:
[1] L. Lemmens und M. Claussen, „Der Elektor-LoRa-Knoten“, Elektor, März/April 2020: https://www.elektormagazine.com/180666-02
[2] C. Valens, „Hausautomation leicht gemacht“, Elektor, September/Oktober 2020: https://www.elektormagazine.de/200019-02
[3] Projektdateien auf Elektor Labs: https://www.elektormagazine.com/labs/wifi-switch
Sie haben Fragen oder Kommentare?
Wenn Sie Fragen oder Kommentare haben, wenden Sie bitte ein E-Mail an den Autor (clemens.valens@elektor.com) oder kontaktieren Sie die Elektor-Redaktion (editor@elektor.com).Ein Beitrag von
Idee, Entwurf, Text und Illustrationen: Clemens ValensÜbersetzung: Rolf Gerstendorf
Layout: Giel Dols
Diskussion (0 Kommentare)