ACHTUNG: Nicht wie beschrieben die PINS 0, 2, 4 nutzen.
Hallo ich wollte meine Markise mit dem Apple HomeKit steuern und bin so hier im Forum bei diesem Beitrag: Somfy Funkrollo-Steuerung per Arduino-Fernbedienung gelandet, da ich nun eine eigene Lösung habe, dachte ich mir; sharing is caring.
Funkfernbedienung
Bei meiner Funkfernbedienung handelt es sich um die Somfy TELIS 1 RTS PURE, da ich keine Lust auf die Fummelei mit dem Protokoll und Sender hatte, habe ich mich auch dazu entschieden die Fernbedienung zu nutzen. Ich benutze hier auf dem Bild ein ESP32 Dev Kit V4 aber jeder x-beliebige ESP sollte es tun solange dieser auf 3.3V schaltet.
Die Fernbedienung wird über den 3.3V Pin vom ESP mit Spannung versorgt, ich habe die Taster auf der Platine mit einer kleinen Zange abgetrennt und danach die Lötpads gereinigt. Die Taster schalten auf LOW an den GPIO Pins, HIGH = nicht gedrückt.
Verkabelung
Die GPIO pins 0, 2, 4 hängen jeweils an den Tastern für Up, Down und My.
Code
Startet einen HTTP-Listener und steuert mittels der GET Routen /btnUp, /btnDown und /btnMy die jeweiligen Taster der Funkfernbedienung.
#include <Arduino_JSON.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
// Daten des WiFi-Netzwerks
#ifndef STASSID
#define HOSTNAME "Markisen ESP"
#define STASSID "your-ssid"
#define STAPSK "your-password"
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
WebServer server(80);
// Pins
// Somfy buttons
const int btnUp = 0;
const int btnDown = 2;
const int btnMy = 4;
const int btnTimeout = 1;
void handleNotFound() {
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; }
server.send(404, "text/plain", message);
}
void handleRoot() {
server.send(200, "text/plain", "ONLINE");
}
void handleBtnUp() {
digitalWrite(btnUp, LOW);
sleep(btnTimeout);
digitalWrite(btnUp, HIGH);
server.send(200);
}
void handleBtnDown() {
digitalWrite(btnDown, LOW);
sleep(btnTimeout);
digitalWrite(btnDown, HIGH);
server.send(200);
}
void handleBtnMy() {
digitalWrite(btnMy, LOW);
sleep(btnTimeout);
digitalWrite(btnMy, HIGH);
server.send(200);
}
void setup() {
pinMode(btnUp, OUTPUT);
pinMode(btnDown, OUTPUT);
pinMode(btnMy, OUTPUT);
digitalWrite(btnUp, HIGH);
digitalWrite(btnDown, HIGH);
digitalWrite(btnMy, HIGH);
Serial.begin(115200);
WiFi.hostname(HOSTNAME);
WiFi.begin(ssid, password);
Serial.println("");
Serial.print("Wait WiFi");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// AutoReconnect
WiFi.setAutoReconnect(true);
WiFi.persistent(true);
server.on("/", handleRoot);
server.on("/btnUp", handleBtnUp);
server.on("/btnDown", handleBtnDown);
server.on("/btnMy", handleBtnMy);
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
// handle client requests
server.handleClient();
}
Die Verbindung zu Siri und HomeKit wird durch https://homebridge.io/ erreicht. Ich gehe hier jetzt nicht näher darauf ein, ich kann nur soviel sagen: es läuft bei mir seit über einem Jahr ohne Ausfälle oder dergleichen und ich steuere selbst meinen Tesla mit homebridge.