Es gibt inzwischen unzählige Angebote an smarten und schaltbaren Steckdosen. Von der Fritz Steckdose, über Osram bis hin zur speziellen Homekit Lösung. Alle haben eine Sache gemeinsam. Sie benötigen meist eine eigene Basis und sind sehr teuer. In vielen Kellern schlummert noch die ein oder andere „normale“ Funksteckdose, die sich über eine eigene Fernbedienung an- und ausschalten lässt. Die Schaltbefehle werden über ein 433MHz Funkband übertragen. Wie es der Zufall will, gibt es für den NodeMCU (ESP8266) ein Sende- und Empfangsmodul. Damit lässt sich ein Sender bauen, der über MQTT ansteuerbar ist.
Hardware für Steuerung der Funksteckdose
Um die Steuerung für die Funksteckdose bauen zu können, werden folgende Teile benötigt. Es sollten alle Funksteckdosen mit 433MHz funktionieren.
Codes auslesen
Im ersten Schritt müssen die Sendecodes der Fernbedienung ausgelesen werden, um herauszufinden welcher Befehl gesendet werden muss, um eine Steckdose zu schalten. Hierfür musst du den NodeMCU mit dem Empfängermodul verbinden und das entsprechende Skript hochladen.
Der Empfänger benötigt im Normalfall 5Volt, daher solltest du VCC mit Vin am NodeMCU verbinden. In meinem Fall hat es auch mit 3,3V funktioniert, so dass du am besten einfach ausprobierst welche Variante bei dir funktioniert.
Nun kannst du schon den Sketch hochladen, um die Schaltcodes der Steckdose auslesen zu können. Hierzu habe ich den Sketch von Sui77 genutzt. Diesen findest du auf Github herunterladen. Achte darauf, dass du beide Dateien herunterlädst und in 2 Tabs öffnest. Solltest du noch nie mit einem NodeMCU gearbeitet haben und ihn erst an deinem Computer einrichten müssen, schau einfach bei OpenDataLab vorbei.
Sobald du den Sketch hochgeladen hast, kannst du den Seriellen Monitor öffnen. Stelle die Baut Rate auf 9600 ein. Nun kannst du mit der Fernbedienung der Funksteckdose die Steckdose direkt vor dem Empfänger einmal AN und AUS schalten. Du solltest jetzt auf deinem seriellen Monitor in etwa das sehen:
Der obere Block ist AN, der untere Block AUS. Hier findest du alle Informationen, die du benötigst, um deinen NodeMCU Sender zu befüllen.
- Protocol: 1
- Pulse Length: 344
Der Tri-State Wert ist dann der tatsächliche Schaltbefehl. Wie du siehst unterscheidet sich dieser zwischen AN und AUS. Notiere dir alle Werte oder kopiere dir am besten die gesamten Blöcke in einer Textdatei zwischen.
Sender bauen
Wenn du alle Codes ausgelesen hast, kannst du den Empfänger entfernen und den Sender anschließen. Im folgenden Schaubild siehst du wie der Sender angeschlossen wird. Achte darauf, dass hier der DATA an D1 angeschlossen ist. Auch hier gilt: Teste, ob du mit 3,3V zurecht kommst und stecke VCC entsprechend um.
Nun kannst du den Sketch für die Steuerung hochladen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
/******************************************************************* MQTT Fernbedienung Funksteckdosen 433MHz by zukunftathome https://zukunftathome.de *******************************************************************/ #include <RCSwitch.h> #include <ESP8266WiFi.h> #include <PubSubClient.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> RCSwitch sender = RCSwitch(); const char* ssid = "XXXXXXXXX"; const char* password = "0123456789"; const char* mqtt_server = "broker.hivemq.com"; WiFiClient espClient; PubSubClient client(espClient); void setup_wifi() { delay(100); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } randomSeed(micros()); Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Command from MQTT broker is : ["); Serial.print(topic); Serial.println(); Serial.print(" publish data is:"); char* payload_str; payload_str = (char*) malloc(length + 1); memcpy(payload_str, payload, length); payload_str[length] = '\0'; if(String(topic) == "Buero/Funksteckdose1") { Serial.print((String)payload_str); //Steckdose An/Aus if(String(payload_str) == "ON") { sender.sendTriState("FF0FFFFF0101"); } if(String(payload_str) == "OFF") { sender.sendTriState("FF0FFFFF0110"); } } } void reconnect() { while (!client.connected()) { Serial.print("Attempting MQTT connection..."); String clientId = "YOU_CHOOSE_id"; clientId += String(random(0xffff), HEX); if (client.connect(clientId.c_str())) { Serial.println("connected"); client.subscribe("Buero/Funksteckdose1"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(6000); } } } void setup() { Serial.begin(9600); setup_wifi(); client.setServer(mqtt_server, 1883); //Funkmodul sender.enableTransmit(5); //Pin D1 sender.setProtocol(1); sender.setPulseLength(344); //OTA Programming ArduinoOTA.setHostname("Funksteckdose"); ArduinoOTA.onStart([]() { Serial.println("Start"); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("End Failed"); }); ArduinoOTA.begin(); Serial.println("Ready"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { if (!client.connected()) { reconnect(); } client.setCallback(callback); client.loop(); ArduinoOTA.handle(); } |
Folgende Daten musst du anpassen:
const char* ssid = „XXXXXXXXX“;
const char* password = „0123456789“;
const char* mqtt_server = „broker.hivemq.com“;
Trage hier dein eigenes WLAN ein, in das du den NodeMCU integrieren möchtest. Achte darauf, dass es sich um ein 2,4Ghz Netz handelt. Solltest du einen eigenen MQTT Server/Broker betreiben, kannst du diesen hier ebenfalls eintragen. Ansonsten kannst du den eingetragenen Broker zum Testen stehen lassen. Es handelt sich um einen öffentlichen MQTT Broker. Für den Live Betrieb empfehle ich einen eigenen Broker oder einen, der nicht für jeden zugänglich ist. Ansonsten besteht die Gefahr, dass Dritte deine Steckdosen fernsteuern.
Suche im Code nach dieser Stelle:
1 2 3 4 5 6 7 8 9 10 |
if(String(topic) == "Buero/Funksteckdose1") { Serial.print((String)payload_str); //Steckdose An/Aus if(String(payload_str) == "ON") { sender.sendTriState("FF0FFFFF0101"); } if(String(payload_str) == "OFF") { sender.sendTriState("FF0FFFFF0110"); } |
Wie du sehen kannst, lautet das Topic Buero/Funksteckdose1. Mit dem Befehl ON wird die Steckdose eingeschaltet und mit OFF ausgeschaltet. An genau dieser Stelle, nämlich bei sender.sendTriState(„XXXXXXXXXXX“) musst du nun noch die entsprechenden AN/AUS Codes der Fernbedienung vom Auslesen einfügen.
Übrigens: Für Android gibt es eine tolle MQTT Client App. Diese eignet sich super, um neue Projekte zu testen.
Sobald du die Änderungen vorgenommen hast, kannst du den Sketch auf das Gerät laden. Wenn du nun mit einem MQTT Client an das Topic Buero/Funksteckdose1 den Befehl ON sendest, sollte sich deine Steckdose einschalten. Bei OFF wieder aus. Nun hast du eine Funksteckdose, die sich per MQTT steuern lässt.
Funksteckdose über openHAB steuern
Um die Fernbedienung über openHAB zu steuern, musst du vorher das MQTT Binding installieren und einrichten. Hier kannst du nachlesen wie es funktioniert.
Du benötigst nur noch ein entsprechendes Item. Hier im Beispiel wäre das:
1 |
Switch Funksteckdose_1 "Funksteckdose 1" {mqtt=">[mosquitto:Buero/Funksteckdose1:command:ON:ON],>[mosquitto:Buero/Funksteckdose1:command:OFF:OFF]"} |
Das Item Funksteckdose_1 kann nun von dir in der Sitemap oder in beliebigen Regeln verwendet werden. Viel Spaß beim ausprobieren.
Cooles Tutorial. Konnte es für den ESP32 nutzen.
Leider funktionieren nur die Steckdosen von ELRO die mit Schaltern einstellbar sind. Die Plug in and Go Steckdosen von CMI konnte ich bis jetzt noch nicht zum laufen bringen. Noch eine Idee?
Guten Morgen Lucy,
freut mich, wenn dir das Tutorial geholfen hat. Super, dass es mit dem ESP32 funktioniert hat. Musstest du den Code anpassen?
Ich hatte auch schon feststellen müssen, dass programmierbare Funksteckdosen mit dem Code nicht funktionieren. Habe leider keine Lösung parat 🙁
Viele Grüße
Patrick
Nein, konnte den Code komplett übernehmen.
Ich hab mich nochmal an den anderen Funksteckdosen versucht und die gesendeten Daten genauer angesehen. Dabei ist mir aufgefallen das die Elro Steckdosen eine andere Pulse length verwenden als die von CMI. Nach der Anpassung funktionieren jetzt beide 😄