Im nachfolgenden Artikel beschreibe ich das Steuern gängiger Funksteckdosen (wie z.B. Elro 440) mit dem günstigen Wlan-SoC ESP8266 (bzw. dem darauf basierenden NodeMCU-Board). Dabei erfolgt die Umsetzung wie bei der Lösung mit dem Raspberry Pi inklusive Webinterface, das auch über HTTP-Requests, wie z.B. zur Sprachsteuerung über AIVC oder dem Steuern über die NetIO-App benötigt, steuern lässt. Damit lassen sich für einen Gesamtpreis von unter 10€ vorhandene Funksteckdosen vernetzen.
1. Benötigte Hardware
- ESP8266 (hier: ESP-201) oder NodeMCU-Entwicklungsboard (hier: V1.0): ca. 5€
- 433 MHz-Sender + Jumper-Kabel: ca. 1€
- Netzteil (für NodeMCU-Board ein Micro-USB-Netzteil, für ESP-201 3V Netzteil) + USB-Kabel: ca. 4€
→ insgesamt ca. 10€
Für den ESP-201 benötigt ihr zusätzlich noch einen USB-to-UART-Adapter (3 Volt-Variante!), welchen es für 1-2€ in China gibt (dafür ist der ESP-201 etwas günstiger als das NodeMCU-Entwicklungsboard). Habt ihr kein 3V Netzteil, so könnt ihr behelfsweise auch die Stromversorgung des FTDI-Adapters verwenden, welche ihr mit einem Elko (hier verwendet: 220µF) stützt. Das ist aber nur eine Behelfslösung.
Hinweis: Kauft euch am Besten keinen Billig-FTDI-Clone aus China – damit habe ich bereits schlechte Erfahrungen gemacht, was die Qualität betrifft. Gerade am Anfang kann es frustrierend sein, wenn die Kommunikation einfach nicht stabil laufen will, egal, wie man die Stromversorgung und Verkabelung macht. Wenn es möglichst günstig sein soll, greift besser zu Adaptern mit CP2102- oder CH340-Chip.
(+ geeignete Funksteckdosen; hier verwendet: Elro AB440S [analog zum Raspberry Pi-Tutorial])
2. Die Verkabelung
Beginnen möchte ich dabei mit dem Anschluss des 433 MHz-Transmitters an das NodeMCU-Board, da dieser sehr simpel über 3 Jumper-Kabel erfolgt.
Der Anschluss ist nachfolgendem Schaltplan zu entnehmen:
In tabellarischer Form:
NodeMCU | 433 MHz Transmitter |
GND | GND |
3V3 | VCC |
D4 | Data |
Beim ESP-201 sieht der Anschluss etwas komplizierter aus, was daran liegt, dass hier noch der FTDI-Adapter sowie ein Netzteil (bzw. hier ein Stützkondensator) zum Einsatz kommt:
In tabellarischer Form:
ESP-201 | FTDI-Adapter | 433 MHz Transmitter |
RX | TX | |
TX | RX | |
3.3V | VCC | |
GND | GND | |
IO15 | GND | |
IO0 | GND | |
CHIP_EN | VCC | |
3.3V | VCC | |
GND | GND | |
IO2 | Data |
Hinweis (danke an Tobi!): Wenn ihr das Programm auf den ESP-201 übertragen habt und ihr den ESP-201 nach Trennung vom Strom damit betreiben wollt, so müsst ihr die Verbindung zwischen IO0 und GND trennen, da der ESP8266 sonst in den Flash-Modus startet, statt das bereits darauf vorhandene Programm zu starten. Eventuell hilft es bei Problemen auch, den IO0 mit 3.3V zu Verbinden, um den Flash-Modus zu unterdrücken.
[Update 07.12.2015] Wollt ihr den ESP-201 mit einer externen Stromversorgung betreiben (empfohlen!), könnt ihr den Schaltungsaufbau nachfolgendem Bild entnehmen:Es sollte auch das kleine Modell ESP-01 reichen, um die Funksteckdosensteuerung umzusetzen. Der Aufbau der entsprechenden Schaltung (mit externer Stromversorgung) ist nachfolgendem Bild zu entnehmen:
2.1 Exkurs: Hintergrundinfos zu Pinbelegung
Vorweg: Dieser Teil ist nicht relevant, wenn ihr das Tutorial nur nachbauen wollt. Ihr könnt diesen Teil also überspringen. Für den, den es interessiert, habe ich hier ein PinOut vom NodeMCU-Board:
Wie man sehen kann, entspricht der D4-Pin dem GPIO2. Daher der unterschied an dieser Stelle bei der Verkabelung im Vergleich zum ESP-201.
Das entsprechende PinOut des ESP-201 findet ihr auf dieser Seite.
3. Einstellen der Funksteckdosen
Da dieser Schritt komplett gleich, wie bei der Umsetzung mit Raspberry Pi abläuft, habe ich die entsprechende Passage übernommen:
Aber zuerst solltet ihr noch den Hauscode bei euren Dosen ändern, nicht, dass euer Nachbar zufällig auch diese Steckdosen hat und ihr euch diese gegenseitig an- und ausschaltet. Dazu öffnet ihr einfach mit einem Kreuz-Schraubendreher die Dosen hinten und legt die Dip-Schalter mit einem Code eurer Wahl um. Also z.B. hoch, hoch, unten, hoch, unten.
Diese Kombination solltet ihr bei allen Steckdosen eingeben und dann auch bei dem Handsender. Mit diesem könnt ihr dann auch überprüfen, ob alles soweit schon funktioniert.
4. Einrichten der Entwicklungsumgebung
Bei diesem Projekt verwende ich als IDE die Arduino IDE, welche es einfach ermöglicht, auch ESP8266-Modelle und NodeMCU-Boards mit Software zu versorgen.
Dazu muss die IDE in der Version 1.6.5 (oder neuer) auf eurem Rechner installiert sein. Öffnet die IDE und öffnet den Punkt „Voreinstellungen“ unter „Datei“ (unter Umständen variiert die Benennung ja nach IDE-Version und Betriebssystem etwas).
Im sich nun öffnenden Fenster „Voreinstellungen“ gebt ihr unten im Textfeld neben „Additional Boards Manager URLs“ die folgende URL ein:
1 | http://arduino.esp8266.com/stable/package_esp8266com_index.json |
Klickt auf „OK“ und startet die IDE neu. Geht dann auf „Werkzeuge“ → „Platine“ → „Boards Manager…“ und tippt in das Suchfeld „esp“ ein. Klickt bei „esp8266“ auf „Install“.
Die benötigten Komponenten werden nun heruntergeladen und installiert.
Nun solltet ihr unter „Werkzeuge“ → „Platine“ unten ein paar neue Einträge für ESP8266-Modelle haben. Wählt für den ESP-201 „Generic ESP8266 Module“ aus und für ein NodeMCU-Board den entsprechenden Eintrag eures Modells (aktuell verkaufte Boards sind in der Regel 1.0er Versionen).
Die restlichen Einstellungen („CPU Frequency“ und „Upload Speed“) könnt ihr vom Screenshot übernehmen. Als Port wählt ihr den seriellen Anschluss aus, unter dem sich der ESP8266 am PC angemeldet hat. Startet dazu am einfachsten einfach die IDE, ohne das jeweilige Board eingesteckt zu haben, schaut dann, welche Ports zur Verfügung stehen und schließt das Board anschließend an den PC an. Es sollte nun ein neuer Port zur Auswahl stehen, welchen ihr anklickt.
Hinweis für Mac-Nutzer (bzw. für Nutzer anderer Betriebssysteme, bei denen der Port nach Anschluss des NodeMCU-Boards nicht angezeigt wird): Unter OS X „El Capitan“ erhielt ich nach Anschluss des NodeMCU-Boards mit CP2102-Chip keinen neuen Port angezeigt. Es stellte sich heraus, dass der entsprechende Treiber des Herstellers noch installiert werden musste. Dieser ist für alle verfügbaren Betriebssysteme auf dieser Seite zu bekommen. Habt ihr bei eurem NodeMCU-Board also auch das Problem, dass kein Port angezeigt wird, müsst ihr vermutlich noch den Treiber installieren. Da dieser (je nach Betriebssystem) nur wenige Kilobyte bis Megabyte groß ist, geht das allerdings recht zügig.
Damit habt ihr eure Arduino IDE erfolgreich erweitert, um ESP8266-Module programmieren zu können. Was jetzt noch fehlt für die Steckdosensteuerung ist eine Bibliothek namens „RCSwitch“. Diese ist hier erhältlich. Ladet sie euch herunter und installiert sie für die Verwendung mit der Arduino IDE. Wie das geht ist detailliert auf dieser Arduino-Seite beschrieben.
5. Der Sketch (= Programm)
Den benötigten Sketch habe ich so gestaltet, dass er einfach an das eigene Setup an Funksteckdosen angepasst werden kann. Lediglich euer Hauscode der Funksteckdosen, die jeweiligen Gerätecodes und Namen für die einzelnen Steckdosen müssen eingetragen werden. Daraus wird dann dynamisch ein kleines Webinterface erstellt.
Das Interface ist sehr einfach gehalten, ich habe aber den .css-Teil in eine eigene Variable gepackt, sodass ihr es einfach anpassen könnt. Auch die HTML-Komponenten lassen sich natürlich noch an eure Wünsche anpassen.
Mein Sketch sieht folgendermaßen aus:
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 | #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> #include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); MDNSResponder mdns; // Replace with your network credentials const char* ssid = "your_ssid"; const char* password = "your_password"; ESP8266WebServer server(80); // replace with your values char* housecode = "11010"; char* socketcodes[] = {"00010", "00001", "10000", "01000"}; char* socketnames[] = {"Lampe", "Lautsprecher", "Fernseher", "Ventilator"}; int numofsockets = sizeof(socketcodes)/4; // you can write your own css and html code (head) here String css = "body {background-color:#ffffff; color: #000000; font-family: 'Century Gothic', CenturyGothic, AppleGothic, sans-serif;}h1 {font-size: 2em;}"; String head1 = "<!DOCTYPE html> <html> <head> <title>Steckdosensteuerung</title> <style>"; String head2 = "</style></head><body><center>"; String header = head1 + css + head2; String body = ""; String website(String h, String b){ String complete = h+b; return complete; } void setup(void){ // if you want to modify body part of html start here body = "<h1>Steckdosensteuerung</h1>"; // socket names and buttons are created dynamical for(int i = 0; i < numofsockets; i++){ String namesocket = socketnames[i]; body = body + "<p>" + namesocket + " <a href=\"socket" + String(i) + "On\"><button>AN</button></a> <a href=\"socket" + String(i) + "Off\"><button>AUS</button></a></p>"; } body += "</center></body>"; mySwitch.enableTransmit(2); delay(1000); Serial.begin(115200); WiFi.begin(ssid, password); Serial.println(""); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } // serial output of connection details Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); if (mdns.begin("esp8266", WiFi.localIP())) { Serial.println("MDNS responder started"); } // this page is loaded when accessing the root of esp8266´s IP server.on("/", [](){ String webPage = website(header, body); server.send(200, "text/html", webPage); }); // pages for all your sockets are created dynamical for(int i = 0; i < numofsockets; i++){ String pathOn = "/socket"+String(i)+"On"; const char* pathOnChar = pathOn.c_str(); String pathOff = "/socket"+String(i)+"Off"; const char* pathOffChar = pathOff.c_str(); server.on(pathOnChar, [i](){ String webPage = website(header, body); server.send(200, "text/html", webPage); mySwitch.switchOn(housecode, socketcodes[i]); delay(1000); }); server.on(pathOffChar, [i](){ String webPage = website(header, body); server.send(200, "text/html", webPage); mySwitch.switchOff(housecode, socketcodes[i]); delay(1000); }); } server.begin(); Serial.println("HTTP server started"); } void loop(void){ server.handleClient(); } |
Tragt in die Variable „housecode“ den Hauscode eurer Funksteckdosen ein (Dip-Schalter oben entspricht einer „1“ und Dip-Schalter unten einer „0“) und in die Variable „socketcodes“ alle Codes eurer Steckdosen (A-E) in gleicher Form wie beim Hauscode. In die Variable „socketnames“ könnt ihr euren Steckdosen dann noch Namen geben, die im Webinterface angezeigt werden.
Außerdem müsst ihr bei den Variablen „ssid“ und „password“ die jeweiligen Daten eures WLAN-Netzes eingeben.
Übertragt den Sketch nun auf euren ESP8266 und öffnet den seriellen Monitor der Arduino IDE. Stellt dort die Baudrate auf 115200 und wartet, bis sich euer ESP8266 mit dem WLAN verbunden hat. Ihr solltet nun die IP-Adresse angezeigt bekommen, die eurem ESP8266 zugewiesen wurde.
Öffnet diese in einem Browser eurer Wahl (der PC oder anderes Gerät, das ihr hierzu verwendet, muss natürlich im gleichen Netzwerk sein). Ihr solltet nun das oben abgebildete Webinterface sehen. Bei einem Klick auf den jeweiligen Button sollten sich nun eure Funksteckdosen bequem schalten lassen.
Hinweis: Die Steuerung ist im Übrigen nicht nur via Browser möglich, sondern auch mittels HTTP-Request auf die entsprechende Adresse. Damit könnt ihr eure Steckdosen beispielsweise auch per Tastatur-Shortcut, per Sprachsteuerung unter Android, per Android oder iOS Widget oder auch via NetIO steuern – also all das, was mit der Umsetzung via Raspberry Pi auch möglich ist.
Das Webinterface hat aktuell noch keine Statusspeicherung implementiert, auch eine zeitverzögerte Schaltung habe ich noch nicht eingebaut. Ich denke aber, dass der Sketch einfach ausbaubar ist und als Grundlage für eigene Umsetzung ausreichende Grundfunktionen liefert. Gerne dürft ihr den Sketch erweitern und mich auch über erweiterte Webinterfaces benachrichtigen, wenn ich diese im Artikel verlinken soll.
Ich wünsche euch viel Erfolg und Spaß bei der Umsetzung! Bei Fragen, Problemen oder Anregungen könnt ihr natürlich wie immer das Kommentarfeld unten verwenden.
Hallo,
Habe das gleiche Problem das immer ein AP aufgemacht wird „FairyLink“
in welcher Datei bzw Lib. ist es zu finden ? wifi.setmode
Gruß
Zetzi
ACHTUNG SEHR WICHTIG !!! Für das Sketch Funksteckdosen
Hallo ,
Das Problem mit dem AP FairyLink gelöst. Durch einen Freund unbedingt das hier eintragen !!!
// JZ Ganz Wichtig für die Sicherheit sonst ist ein offener AP vorhanden ( FairyLink_xxxx ) womit
mann sich doppel ein klinken kann bzw jeder andere auch und somit ins eigene Netz gelangt.
WiFi.mode(WIFI_STA);
Das ganze vor der zeile WiFi.begin(ssid, password);
Gruß
Zetzi
Hallo Alex,
vielen Dank erst mal für den schönen Artikel. Sowas in der Art hab ich jetzt lange gesucht. Ich habe dennoch ein Frage. Derzeit Arbeit ich viel mit dem Raspi und habe an den GPIOS auch einen 433MHZ Sender und Empfänger. Ich hab zum Spaß mal eine led Lampe geholt die eine Fernbedienung hat und diese kann ich auch wunderbar auslesen. An aus ist bei der Lampe immer der gleiche Code, mit dem raspi kann ich genau diese einen Code senden als auch empfangen und die Lampe geht dann an und aus. Nun will ich halt keinen Raspi „verschwenden“ für eine Lampe. Von dem ESP8266-Nodemcu hab ich genau, es wäre mir lieber davon einen zu nehmen. Ich habe jetzt nur das Problem, dass ich keinen HOUSECODE und keine DIPschalter habe. Alles was ich habe ist diese 10-stellige Nummer die auch die Fernbedienung absendet 64828262825. wie kann ich deinen SKETCH anpassen, dasss er genau dösen Code rausschickt ?
Vielen Dank schon mal voraus . :)
Hat sich vielleicht schon erledigt, aber hier trotzdem ein Ansatz.
Mit der RCSwitch Bibliothek kannst du auch einen dezimalen Code (du sagst zehnstellig, schreibst aber elf Stellen) senden. Dazu in Zeile 83 bzw. 90 mySwitch.send(6482826285, 36) schreiben. Die 36 ist die Länge deines Codes in Bits. Eventuell ist das anzupassen (z.B. auf 40, nächsthöhere ganzzahlige Länge in Bytes) um die passende Anzahl von führenden Nullen zu senden.
@ Alex:
Danke für das schöne Tutorial!
Viel Erfolg!
Hi,
leider gibt die NodeMCU nur 3,3V aus. Das ist für die meisten 433MHZ Sender etwas zu wenig, denn damit kann man nur max. 2-3m senden, deshalb habe ich einen kleinen Step-Up-Wandler dazwischen geschaltet:
https://imageshack.com/a/img922/8608/0ImoaW.png
Die gibt es für ein bis zwei Euro in der Bucht, oder bei Amazon. ;)
Auf wieviel Volt Ausgang hast Du den Step-Up gestellt? Gibt es keine Probleme mit Wärmeentwicklung / Spannungsabfall am NodeMCU?
super, endlich eine brauchbare verständliche Anleitung. 1000 Dank! Jetzt muss ich es nur noch mit Alexa einbinden…
Wer flexibler mit den Codes sein möchte kann auch diesen Code benutzen.
Hier werden die Codes flexibel im GET definiert.
server.on(„/code“, [](){
String webPage = website(header, body);
server.send(200, „text/html“, webPage);
gethousecode = server.arg(„housecode“);
getsocketcode = server.arg(„socketcode“);
char char_gethousecode[6];
char char_getsocketcode[6];
gethousecode.toCharArray(char_gethousecode, 6);
getsocketcode.toCharArray(char_getsocketcode, 6);
if(server.arg(„onoff“) == „on“){
mySwitch.switchOn(char_gethousecode, char_getsocketcode);
}
else{
mySwitch.switchOff(char_gethousecode, char_getsocketcode);
}
delay(1000);
});