ESP8266 oder ESP32 als Home Assistant Schalter und Sensoren
In letzer Zeit experimentiere ich viel mit der Cloud-freien Heimautomatisierungssoftware Home Assistant. Bister habe ich viele Sensoren und Aktoren einzeln betrieben, quasi unabhängig von einem zentralen System. So loggte meine Wetterstation in eine Datenbank, ebenso mein Stromzähler in eine andere. Dafür gab es dann jeweils eine Visualisierung. Meine Bewässerungssteuerung wurde von einem Raspberry Pi mit einer selbst gebauten Oberfläche verwaltet. Nun jedoch möchte ich die Dinge zusammenführen und kosolidieren, um eine bessere Usability zu haben und den WAF zu verbessern.
Kürzlich habe ich daher bereits über meine Integration eines Stromzählers in Home Assistant geschrieben, nun stehen meine Bewässerungssteuerung bzw. meine Relaissteuerung auf dem Plan. Bisher habe ich dafür oben genannten Raspberry Pi verwendet – doch diesen mit einem Raspbian 99% des Tages nichts tun zu lassen halte ich für Verschwendung.
Deswegen kommt nun ein ESP8266-basierter Mikrocontroller (Wemos D1 mini) zum Einsatz, den ich mit der Arduino-IDE ein HTTP-Interface zum Setzen und Abrufen von Ausgängen und Eingängen ausgestattet habe. Beispielhaft für ein Wemos D1 mini mit dem offiziellen Relais-Schild werde ich den Code hier einmal zusammenfassen.
Arduino-Code
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#ifndef STASSID
#define STASSID "WLAN-NAME"
#define STAPSK "WLAN-PASSWORT"
#endif
const char *ssid = STASSID;
const char *password = STAPSK;
ESP8266WebServer server(80);
void handleRoot() {
server.send(200, "text/plain", String(analogRead(A0))); // Testweise den Analogwert ausgeben
}
void handleSet() {
for (uint8_t i=0; i<server.args(); i++){
if (server.argName(i)=="D1") { digitalWrite(D1, server.arg(i).toInt()); }
}
server.send(200, "text/plain","OK");
}
void handleGet() {
for (uint8_t i=0; i<server.args(); i++){
if (server.argName(i)=="D1") { server.send(200, "text/plain", String(digitalRead(D1))); }
}
server.send(200, "text/plain","OK");
}
void setup() {
//IO
pinMode(D1, OUTPUT);
digitalWrite(D1, OFF);
//WIFI
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
//HTTP
server.on("/", handleRoot);
server.on("/set", handleSet);
server.on("/get", handleGet);
server.begin();
}
void loop() {
// put your main code here, to run repeatedly:
server.handleClient();
MDNS.update();
ArduinoOTA.handle();
}
Home Assistant-Code
Hier wird Beispielhaft die IP des ESP als 192.168.178.77 angenommen – dies ist natürlich anzupassen.
#Aktor Wemos D1 mini mit Rückmeldung
switch:
- platform: command_line
switches:
esp_aktor_001_d1:
friendly_name: "Aktor 001 D1"
command_state: "/usr/bin/curl 192.168.178.77/get?D1"
command_on: "/usr/bin/curl 192.168.178.77/set?D1=1"
command_off: "/usr/bin/curl 192.168.178.77/set?D1=0"
value_template: '{{ value == "1" }}'
#Sensor Wemos D1 mini
- platform: command_line
name: "Aktor 001 A0"
command: "/usr/bin/curl 192.168.178.77/get?A0"
Auf diese Weise kann der Relais-Status geschrieben und gelesen werden. Auch den Analog-Eingang kann man auswerten.
Natürlich bleibt es einem überlassen, mehr Ein- oder Ausgänge zu implementieren. Ich beispielweise nutze den erwähnten Wemos mit einem 8-fach Relais-Board, was diesen beinahe auslastet. Mit einem D32 oder ähnlichem wäre da bei weitem mehr möglich.