Wenn es bisher darum ging den ESP8266 D1 Mini in HomeKit einzubinden, bin ich immer den Weg über meine Homebridge auf dem Raspberry Pi gegangen. Mittlerweile gibt es aber nicht mehr nur eine Lösung das auch ohne zusätzliche Bridge zu erreichen. Wir werden heute einen D1 Mini ohne Bridge oder andere weitere Software oder Hardware direkt und nativ in HomeKit einbinden. Es handelt sich dabei um einen einfachen HomeKit Schalter der ein Relaismodul betätigt.
Zum Kapitel springen Schalter? Was genau?
Der Schalter, den wir in diesem Tutorial implementieren, kann in HomeKit verschiedene Formen annehmen:
- Schalter
- Lampe
- Ventilator
Diese drei Varianten kennen allesamt nur zwei Zustände: True
und False
. Bei einem Schalter mag das in erster Linie logisch klingen. Bei dem Ventilator und der Lampe eher nicht. Das liegt an der Art und Weise, wie wir den Schalter implementieren. Auch wenn es HomeKit Lampen gibt bei denen man die Farbe ändern oder die Helligkeit dimmen kann, so ist ein Schalter, der eine Lampe darstellt, ohne diese Funktionen. Das gleiche gilt für einen Ventilator. Bei diesem gibt es auch nur an oder aus. Es gibt eine Menge Zubehör für Homekit, unter anderem auch eben genannte Schalter und Lampen.
Produktempfehlungen und -suche in Verbindung mit dem Amazon Partnerprogramm:
¹ Angaben ohne Gewähr. Bei einem Kauf über den Link erhalten wir eine Provision.
Eine DIY-Lösung mag also nicht in jedem Fall die beste Wahl sein. Abhängig vom Einsatzbereich kann es vorteilhafter sein, einen fertigen Aktor zu erwerben. Der Nutzen einer Eigenbau-Lösung liegt jedoch darin, dass sie für spezifische Anforderungen maßgeschneidert werden kann.
Zum Kapitel springen Funktionen
Neben der nativen Unterstützung verschiedender Aktoren ( Schalter, Lampe, Ventilator ) habe ich noch ein paar zusätzliche Funktionen eingebaut. Allgemein sind mit dem Programmcode also folgende Features enthalten:
- direktes Schalten über die Home App oder über Siri
- Optional: Auto-Toggler um den Schalter nach x Millisekunden wieder zurück in seinen Ausgangspunkt zu schalten
- Optional: Schaltung per Hardware-Button; Man kann einen Hardware-Taster auslesen, der dann ebenfalls die Schaltaktion ausführt und den Status an HomeKit zurückmeldet
Zum Kapitel springen Hardware
Primär braucht man natürlich erstmal ein ESP8266 Board, auf dem die passende Software läuft. Hier mal einige Boards, die für dieses Tutorial in Frage kommen würden:
Grundätzlich lässt sich sagen, dass im Grunde genommen jedes ESP8266 basierte Board genutzt werden kann. In diesem Tutorial verwende ich einen ESP8266 D1 Mini.
Zu dem Microcontroller braucht man natürlich noch einen passenden Aktor. In meinem Fall ist der Aktor ein High-Trigger Relais. Da der ESP8266 direkt mit dem HomeKit Interface kommuniziert, weiß HomeKit im Grunde genommen gar nicht, was am Ende bei einem Schaltvorgang passiert. HomeKit übermittelt lediglich die Schaltbefehle oder nimmt neue Zustände entgegen.
Produktempfehlungen und -suche in Verbindung mit dem Amazon Partnerprogramm:
¹ Angaben ohne Gewähr. Bei einem Kauf über den Link erhalten wir eine Provision.
Du kannst eine komplett eigene Logik implementieren um festzulegen, was bei einem Schaltvorgang passieren soll. Du bist nicht auf das Relais beschränkt. Theoretisch kannst du sogar einfach nur die Anzeige auf einem LCD-Display ändern wenn das für deine Anwendung der Zweck sein soll.
Zum Kapitel springen Bibliotheken installieren
Bevor wir damit beginnen unseren eigenen HomeKit-Schalter einzubinden, muss eine Bibliothek in der Arduino IDE installiert werden. Das geht über den Bibliotheksverwalter. Ihr erreicht ihn über das Menü der Arduino IDE. Die Bibliothek heißt "HomeKit-ESP8266" ist von Mixiaoxiao auf Github und kann über die Suche des Bibliotheksverwalters gefunden werden.
Arduino IDE
└───Werkzeuge
└───Bibliotheken verwalten ...
Zum Kapitel springen Die Verdrahtung
Solltest du eine eigene Logik ohne Relais implementieren brauchst du die Verdrahtung natürlich nicht durchführen. Anderenfalls kannst du dein Relais folgendermaßen verdrahten um direkt loszulegen:
KY-19 Relaismodul | ESP8266 D1 Mini |
---|---|
S | D8 |
+ | 5V |
- | G |
Zum Kapitel springen Programmcode
Um den ESP8266 in HomeKit einzubinden ist mehr als nur eine Datei notwendig. Insgesamt sind es drei Dateien. Diese Dateien habe ich in einem ZIP-Archiv vorberitet. Das Archiv könnt ihr direkt über makesmart downloaden:
- Download: esp8266-native-homekit-switch.zip
Die Dateistruktur innerhalb des Archivs sieht wie folgt aus:
/esp8266-native-homekit-switch.zip
├── esp8266-native-homekit-switch.ino
├── my_accessory.c
└── wifi_info.h
Ihr müsst lediglich die Datei mit dem Namen esp8266-native-homekit-switch.ino
mit einem Doppelklick öffnen. Die anderen zwei Dateien werden dann automatisch innerhalb der Arduino IDE geladen.
Zum Kapitel springen esp8266-native-homekit-switch.ino
Diese Datei enthhält die eigentliche Logik was beim Schalten über HomeKit passieren soll oder wann welcher Status an HomeKit zurückgemeldet werden soll.
In dieser Datei ist die Zeile homekit_storage_reset();
in der setup()
-Funktion sehr wichtig. Diese Zeile löscht beim Start die komplette HomeKit Konfiguration vom ESP8266. Somit ist immer wieder ein erneutes Pairing notwendig. Für die Phase der Entwicklung ist dies sehr praktisch - für den laufenden Betrieb jedoch nicht. Haltet ein Auge auf die setup()
-Funktion und fügt diese Zeile je nach Bedarf ein. Standardmäßig ist diese Zeile nicht vorhanden!
void setup() {
Serial.begin(115200);
pinMode(switchPin, OUTPUT);
wifi_connect();
homekit_storage_reset();
my_homekit_setup();
}
Das Relais wird über die folgende Zeile angesteuert:
void setPinState(bool currentSwitchState){
digitalWrite(switchPin, currentSwitchState ? HIGH : LOW);
}
Diese Methode kann verwendet werden eine komplett eigene Logik zu implementieren. Diese Methode wird aufgerufen aufgerufen, wenn der Zustand über HomeKit geändert wird. Die Variable currentSwitchState
enthält dabei immer den Target-State. Neben der Funktion benötigt ihr für eine grundlegene Basis nur die folgenden Zeilen:
byte switchPin = 15;
// Optionale Parameter
bool autoToggle = false;
int autoToggleDelay = 5000;
bool enableHardwareButton = false;
byte hardwareButton = 0;
Habt ihr die Schaltung vom Relais 1:1 übernommen? Dann müsst ihr gar nichts anpassen.
Zum Kapitel springen wifi_info.h
Diese Datei enthält die Daten für die WLAN-Verbindung innerhalb eures Netzwerkes. Was ihr auf jeden Fall anpassen müsst, sind die WLAN Daten. Dazu benötigt ihr nur die folgenden beiden Zeilen in der Datei wifi_info.h
:
const char *ssid = "WIFI-SSID";
const char *password = "WIFI-PSK";
Zum Kapitel springen my_accessory.c
Diese Datei enthält die Definitionen des Schalters für HomeKit. Solltet ihr genau diesen Schalter benötigen, müsst ihr diese Datei eigentlich nicht anpassen.
Zum Kapitel springen Programm hochladen
Nach diesen Informationen könnt ihr das Programm schon kompilieren und auf den ESP8266 laden. Die einzige Änderung die ihr machen solltet ist, die Taktrate des ESP8266 von 80MHz auf 160MHz zu stellen.
HomeKit ESP8266 benötigt eine menge Rechenleistung durch die Verschlüsselung mit WolfSSL. Die Erhöhung der Taktrate kann dem etwas entgegenwirken.
Die Taktrate kann einfach über die Einstellungen geändert werden. Geht dazu innerhalb der Arduino IDE auf den folgenden Pfad und passt die Taktrate dementsprechend an:
Arduino IDE
└───Werkzeuge
└───CPU Frequency: 160MHz
Zum Kapitel springen Pairing mit Apple Home
- Nach dem erfolgreichen Upload kann der ESP8266 wie gewohnt zu HomeKit hinzugefügt werden. ( Gerät hinzufügen / + oben rechts )
- Gehe auf den Punkt
Weitere Optionen ...
und warte, bis dein ESP8266 gefunden wird - Der Pairing-Code lautet:
123-45-678
- Das Pairing wird anschließend durchgeführt
Sollte das Pairing nicht auf Anhieb klappen reicht es oftmals den ESP8266 vom Strom zu trennen und es anschließend erneut zu versuchen.