Velux ESP8266 MQTT Smart Home

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

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
Bestandteile Velux Fernbedienung KLI313
Bestandteile KLI313

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.

ESPBedieneinheit KLIFunktion
GND (Minus)1
3,3 V (Plus)2
D53Auf
D64Stop
D75Ab
Schaltplan ESP8266 Velux Fernbedienung
Verdrahtung

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.

ESP8266 Velux Pin Header Kontaktfeder
Pin Header Kontaktfeder

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.

ESP 3D Gehäuse Velux Fernbedienung
ESP 3D Gehäuse

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.