Ich möchte meinen Dachfenster-Sonnenschutz gerne in mein MQTT System integrieren und hierfür den ESP8266 verwenden. Der Rollladen meiner Dachfenster von Velux besitzen eine Funk-Fernbedienung vom Typ KLI 313. Der Hersteller verwendet IO-Homecontrol 868 MHz für die Kommunikation.
Situation Sonnenschutz
- Ich habe 3 Fernbedienungen KLI313, die je einen außen montierten Sonnenschutz bzw. elektrischen Dachrollladen steuern.
- Funksystem des Dachfensterherstellers arbeitet mit 868 MHz und verwendet das IO-Homecontrol Protokoll. Bisher habe ich mit diesem Funkprotokoll keine Berührungen gehabt und und möchte mein Smart Home nicht mit weiteren Routern und Funkprotokolle hinzufügen.
- Ich möchte die vorhandenen Fernbedienungen, Empfänger, Steuergeräte etc. nur so weit anpassen, dass ich jede Änderung restlos wieder demontieren kann.
- Die Fernsteuerung kann trotz Umbau weitern normal verwendet werden.
- Es gibt bereits Projekte, die sich mit der Steuerung dieser Dachrollläden auseinandergesetzt haben.
https://github.com/reefab/homeassistant-velux
https://community.home-assistant.io/t/controlling-velux-remote-with-esp8266-and-esphome/591751
https://www.reddit.com/r/homeassistant/comments/pzhkia/hack_velux_kli3xx_to_use_blinds_without_gateway/
ESP8266 soll Velux KLI313 Jalousie steuern.
Mein Ansatz zur Lösung ist, die Bedieneinheit mit einem 3D-Druck etwas zu erweitern, um so innerhalb der Einheit Platz zu schaffen, um den Mikrocontroller mit zu integrieren. Die Abmessungen sollten dabei aber kaum verändert werden.
Wie ist die KLI-Fernsteuerung aufgebaut.
Die Fernbedienung besteht aus 3 Kunststoffteilen und einer Platine.
- Oberseite mit Tasten
- Unterseite, die als Wandbefestigung und Batteriefachdeckel dient.
- Batteriefach und Platinenabdeckung.
- Platine
Umsetzung Zusammenbau
Bauteile
- ESP8266 Microcontroller WEMOS D1 Mini AliExpress
- „Federn“ Pin Header Male Female lange Beine AliExpress
Verwendeter 3D Drucker Anycubic KOBRA 2 (AliExpress)
Die 3D-Druck Modelle
Für meinen Umbau benötige ich das Batterie-/Platinenabdeckung nicht. Letztlich soll die Fernbedienung nur ca 7-8 mm höher (dicker) werden. Dazu habe ich folgende 3D-Modelle entworfen.
- Eine neue Gehäuseabdeckung, die Platz für den ESP8266 und zusätzliche Kabel schafft.
- Kontakt Platte, die als Aufnahme für die selbst gebauten Kontaktfedern verwendet wird.
Beide Modelle stehen auf Thingiverse bereit. Das Gehäuse besitzt eine Aufnahme für den ESP8266 und eine Öffnung, um den ESP mit Strom zu versorgen.
Schaltplan Fernbedienung KLI313 zu ESP Mqtt
Der Mikrocontroller wird per Netzteil über die Micro-USB Schnittstelle angeschlossen. Der Ausgang 3.3 V des ESP wird mit dem Pluspol der KLI-Platine verbunden. Der Minuspol der KLI-Platine mit GND des ESP. Die Fernbedienung hat drei Tasten, die für die Steuerung vorgesehen sind. Auf, Ab und Stop.
ESP | Bedieneinheit KLI | Funktion |
GND (Minus) | 1 | |
3,3 V (Plus) | 2 | |
D5 | 3 | Auf |
D6 | 4 | Stop |
D7 | 5 | Ab |
Herstellung Kontaktfeder
In meiner Ausgangssituation habe ich beschrieben, dass ich die Fernbedienung jederzeit in ihren ursprünglichen Zustand zurückversetzen können möchte. Daher musst ich eine Möglichkeit finden, die Kontakte an der Unterseite der KLI313 Platine mit dem ESP8266 zu verbinden. Leider hatte ich keine Federn oder Kontakte zur Verfügung.
Im Lieferumfang meiner ESP Wemos waren auch immer „Pin Header Male Female“ mit langen Anschluss-Pins enthalten. Diese habe ich mit einer Zange oder einem Messer zerschnitten, dass ein einzelner Male-Female-Pin übrig blieb. Den langen herausstehenden Pin habe ich dann zu einer kleinen Lasche gebogen.
Kontaktfederplatte und Gehäuse 3D-Druck
In der Platte für die Kontaktfedern sind die Positionen der Kontakte der KLI- Fernbedienung exakt markiert. Für die selbst erstellten Federn ist eine Aufnahme vorbereitet. Die 5 Kontaktfedern habe ich mit Heißkleber eingeklebt.
Zur Verkabelung habe ich isolierten 2mm² draht verwendet. An den Federn habe ich das Kabel abisoliert und verzinnt. Dadurch konnte ich die einzelnen Kabel direkt in die Pin-Öffnungen der Federn stecken.
Die Kabel habe ich, wie oben beschrieben, an die Kontakte des ESP angelötet. Die Federplatte kann zusammen mit dem ESP in die neu gedruckte Gehäuseabdeckung eingeklebt werden. Die Federplatte passt, mit etwas spiel, an die richtige Position, um die Kontakte der Fernbedienung zu treffen. Ich habe vor dem Einkleben aller Bauteile die Platine auf die Federkontaktplatte gelegt und mit einem Durchgangsprüfer die korrekte Verbindung durchgetestet. Die Federn ließen sich leicht nachstellen, wenn ein Kontakt nicht gleich funktionierte.
Programmierung
Der ESP8266 soll sich am MQTT Broker mit für eine Topic anmelden um bei Nachrichten an die Topic diese zu empfangen. Wird eine Nachricht empfangen soll geprüft werden ob diese einer der Funktionen Auf, Ab oder Stop entspricht und entsprechend der Funktion dann die Ausgänge D5-D7 auf HIGH oder LOW setzen.
Ist der ESP über Serial mit einem Terminal verbunden, lasse sich die Funktionen AUF, AB und STOP auch über das Terminal auslösen.
#include "MqttSetup.h" #define mqtt_topic_ir_device "your/topic/the/esp/listen/to" String readString; void setup() { // open serial port Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); // LEFT // UP pinMode(D5, OUTPUT); digitalWrite(D5, HIGH); // Stop pinMode(D6, OUTPUT); digitalWrite(D6, HIGH); // Down pinMode(D7, OUTPUT); digitalWrite(D7, HIGH); // RIGHT // Up pinMode(D1, OUTPUT); digitalWrite(D1, HIGH); // Stop pinMode(D2, OUTPUT); digitalWrite(D2, HIGH); // Down pinMode(D8, OUTPUT); digitalWrite(D8, HIGH); setupWifiMqtt(); delay(1000); subscribeWifiMqtt(mqtt_topic_ir_device); setWifiMqttMessageCallback( roofWindowShadingCallback ); Serial.println(); Serial.println("Bereit "); digitalWrite(LED_BUILTIN, HIGH); } void loop() { while (Serial.available() > 0) { readString = Serial.readString(); readString.replace("\n", ""); } if (readString.length() > 0) { if (readString == "up") { veluxUp(); } if (readString == "stop") { veluxStop(); } if (readString == "down") { veluxDown(); } readString = ""; } } void roofWindowShadingCallback( char* messageTopic, char* message ){ if(strcmp(messageTopic, mqtt_topic_ir_device) == 0){ if(strcmp(message, "up") == 0){ veluxUp(); } else if(strcmp(message, "stop") == 0){ veluxStop(); } else if(strcmp(message, "down") == 0){ veluxDown(); } } } void veluxUp(){ Serial.println("up"); digitalWrite(LED_BUILTIN, LOW); digitalWrite(D5, LOW); digitalWrite(D6, HIGH); digitalWrite(D7, HIGH); delay(200); digitalWrite(D1, LOW); digitalWrite(D2, HIGH); digitalWrite(D8, HIGH); delay(200); VeluxReset(); } void veluxStop(){ Serial.println("stop"); digitalWrite(LED_BUILTIN, LOW); digitalWrite(D5, HIGH); digitalWrite(D6, LOW); digitalWrite(D7, HIGH); delay(200); digitalWrite(D1, HIGH); digitalWrite(D2, LOW); digitalWrite(D8, HIGH); delay(200); VeluxReset(); } void veluxDown(){ Serial.println("down"); digitalWrite(LED_BUILTIN, LOW); digitalWrite(D5, HIGH); digitalWrite(D6, HIGH); digitalWrite(D7, LOW); delay(200); digitalWrite(D1, HIGH); digitalWrite(D2, HIGH); digitalWrite(D8, LOW); delay(200); VeluxReset(); } void VeluxReset(){ digitalWrite(D5, HIGH); digitalWrite(D6, HIGH); digitalWrite(D7, HIGH); delay(200); digitalWrite(D1, HIGH); digitalWrite(D2, HIGH); digitalWrite(D8, HIGH); digitalWrite(LED_BUILTIN, HIGH); }
Link zur MqttSetup.h .
Anmerkung
Ich habe hier im Programm 6 Ein- und Ausgänge belegt. Hintergrund ist, dass ich in einem Raum zwei Jalousien für zwei einzelne Fenster habe. Im Programm erhalten beide Fernbedienungen den gleichen Befehl. Trotzdem sind beide Fenster per Fernbedienung unabhängig voneinander steuerbar.
Zwischen der Aktivierung eines Ausgangs auf Fernbedienung 1, habe ich eine kurze Pause eingebaut, bis ich die Ausgänge für Fernbedienung 2 schalte. Tests ergaben, dass beide Steuereinheiten nicht zur selben Zeit aktiviert werden sollten. Ich fand heraus, dass dann nur unzuverlässig und meist nur eine Sonnenschutz aktiviert wird. Das lässt sich auch über die Fernsteuerungen manuell nachstellen.
Ein ähnliches Projekt, das ebenfalls auf Nachrichten aus dem MQTT-Protokoll hört, ist das IR-Fernbedienung Projekt.