Ende 2014 gab es bereits einen Beitrag zu einem Arduino – Infrarot Sende- und Empfangsmodul aber nie eine Fortsetzung. Das Projekt habe ich damals aus zeitlichen Gründen auf Eis gelegt. Als dann vor kurzem die Netzwerkschnittstelle von unserem Denon AV-Receiver gestorben ist, hatte ich wieder einen Grund mehr mich wieder mit dem Thema zu beschäftigen. Daraus wurde ein WLAN IR-Modul, das in eine Unterputzdose passt.
Die Komponenten
Das Prinzip ist geblieben, es haben sich nur einige Bauteile geändert. Den Plan das Ganze mit einem Arduino Pro Micro und die Kommunikation über das RS485 Protokoll durchzuführen, habe ich verworfen. Mit einem ESP8266 Modul, genauer gesagt dem Wemos D1 mini, ist der Aufwand wesentlich geringer. Auch die Installation in einer Unterputzdose war damit kein Problem mehr.
Zum Bau werden neben Widerständen, NPN Transistor und den IR LEDs noch ein Wemos D1 mini mit Wemos DC Power Shield und optional einem Wemos ProtoBoard Shield benötigt. Bastelmaterial wie Kabel und Co. setze ich mal voraus. Den Wemos D1 (mini, mini Pro oder mini Lite) und die Shields könnt ihr im Wemos CC Store (Affiliate-Link) finden.
Stromversorgung
Als Stromversorgung für das WLAN IR-Modul habe ich mich für das Wemos DC Power Shield entschieden. Das Shield nimmt zwar etwas mehr Platz weg als ein kleiner Step-Down Spannungsregler, dafür muss es einfach nur zusammengesteckt werden. Das Shield benötigt eine Spannungsquelle von 7-24 Volt und hat mit 1A ausreichend Reserve.
Zur Info: Für den Aufbau habe ich das Wemos DC Power Shield in der Version 1.0 verwendet. Da mir der Power Plug zu hoch war, habe ich ihn einfach ausgelötet.
Der Aufbau
Die Schaltung ist recht einfach. Base vom BC548 NPN Transistor wird über einem 1k Widerstand mit dem PIN D8 verbunden. Die IR-LED Anode (+) hängt direkt an 5 Volt und die Kathode (-) am Collector des Transistors. Der Emitter vom Transistor ist mit Ground verbunden. Die beiden IR-LEDs sind parallel geschaltet. Da ich keine Daten mehr von den IR-LEDs hatte, habe ich diese ohne Vorwiderstand mit 5V verbunden. Ich habe aber bisher keine Probleme festgestellt, ihr solltet aber je nach IR-LED einen passenden Widerstand einplanen.
Damit das Ganze auch hübsch aussieht, habe ich in eine Gira Blindabdeckung zwei Löcher gebohrt und zwei Halterungen für 5mm IR-LEDs eingesetzt. Achtet unbedingt darauf, dass die IR-LEDs einen möglichst großen Abstrahlwinkel haben und die Halterungen den Abstrahlwinkel nicht verringern. Dies muss nicht unbedingt ein Problem sein, bei mir hatten die Halterungen den Abstrahlwinkel aber so verringert, dass der Beamer unter der Decke nicht mehr auf die IR-Befehle reagiert hat.
Eine IR-Empfangsdiode habe ich nicht verbaut. Diese kann zum anlernen einer neuen Fernbedienung übergangsweise auch direkt auf den Wemos D1 gesteckt werden.
Smart Home
Das WLAN IR-Modul wird ganz einfache über HTTP Befehle gesteuert. Als Beispiel würde der folgende Aufruf den Denon ausschalten.
http://192.168.1.1/irsend?device=denon&command=off
Wenn die IP Adresse direkt aufgerufen wird, erscheint eine kleine Statusseite. Darauf wird der Receive Signal Strength Indicator (RSSI)Wert ausgegeben. Die Seite ist natürlich noch ausbaufähig. Es wäre unter anderem möglich, Buttons für die verschiedenen Befehle auf die Weboberfläche zu legen. So würde die Bedienung auch ohne Smart Home über einen Browser funktionieren.
Loxone Integration
In der Loxone Config muss nur ein Virtueller Ausgang mit der folgenden Adresse angelegt werden. Diese sollte natürlich die statische IP-Adresse vom WLAN IR-Modul beinhalten.
http://192.168.1.1
Für jeden IR-Befehl muss ein Virtueller Ausgang Befehl angelegt werden. Hier muss bei Befehl bei EIN nur der folgende Teil eingetragen werden.
/irsend?device=denon&command=off
Bei mehreren Geräten macht die Kombination aus Device und Command Sinn, da man sonst schnell die Übersicht verlieren kann.
Der Sketch
Für den Sketch benötigt ihr die IRremoteESP8266 Library. Diese kann, wie mittlerweile fast alle Libraries, ganz einfach über den Library Manager installiert werden. Die IRremoteESP8266 Library ist ein Fork der IRremote Library. Die Befehle und IR-Codes sind identisch mit der IRremote Library.
Mit der Over The Air Update Funktion ist das WLAN IR-Modul perfekt vorbereitet für den Einbau in die Unterputzdose. Es müssen natürlich die IR-Codes an eure Geräte angepasst werden und wie immer die WLAN Konfiguration.
#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <ESP8266WebServer.h> #include <IRsend.h> IRsend irsend(D8); //an IR led is connected to GPIO PIN 0 / D8 // WLAN configuration const char* ssid = "<SSID>"; const char* password = "<PASSWORD>"; unsigned long startTime = millis(); // Status page long rssi; // Create an instance of the Telnet-Server, specify the port to listen on as an argument WiFiServer TelnetServer(23); WiFiClient TelnetClient; // Create an instance of the Web-Server, specify the port to listen on as an argument ESP8266WebServer WebServer(80); void setup() { // Begin Serial Serial.begin(115200); delay(10); Serial.println("Booting"); Serial.println(); // Show space usage Serial.printf("Sketch size: %u\n", ESP.getSketchSize()); Serial.printf("Free size: %u\n", ESP.getFreeSketchSpace()); Serial.println(); // Connect to WiFi network Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); unsigned long startTime = millis(); // ... Give ESP 10 seconds to connect to station. while (WiFi.status() != WL_CONNECTED && millis() - startTime < 10000) { delay(500); Serial.print("."); } Serial.println(); while (WiFi.status() != WL_CONNECTED) { Serial.println("Connection Failed! Rebooting ..."); delay(5000); ESP.restart(); } Serial.println("WiFi connected"); rssi = WiFi.RSSI(); Serial.print("RSSI: "); Serial.println(rssi); WebServer.on("/irsend", ArgCheck); // Associate the handler function to the path WebServer.on("/", handleRoot); // Start the server WebServer.begin(); Serial.println("WebServer started"); // Print the IP address Serial.println(WiFi.localIP()); // Start IR irsend.begin(); // OTA ArduinoOTA.setPassword((const char *)"8266"); ArduinoOTA.begin(); } void loop() { WebServer.handleClient(); //Handling of incoming requests ArduinoOTA.handle(); } void handleRoot() { String message = ""; message += "<h1 style=\"font-family:courier; text-align:center\">WLAN IR Modul</h1>"; message += "<b>RSSI: "; message += rssi; message += "</b>"; WebServer.send(200, "text/html", message); } void ArgCheck() { String message = ""; message += "<h1 style=\"font-family:courier; text-align:center\">WLAN IR Modul</h1>"; if (WebServer.arg("device") == "") //Parameter not found { message += "Error: device Argument missing <br>"; } if (WebServer.arg("command") == "") //Parameter not found { message += "Error: command Argument missing<br>"; } String device = WebServer.arg("device"); //Gets the value of the query parameter String command = WebServer.arg("command"); //Gets the value of the query parameter Serial.print("Device: "); Serial.println(device); Serial.print("Command: "); Serial.println(command); if (device == "denon") { if (command == "on") { irsend.sendPanasonic(0x2A4C,0x2840086); // Denon AVR - Power On delay(100); irsend.sendPanasonic(0x2A4C,0x2840086); // Denon AVR - Power On Serial.println("Denon AVR - Power On"); } if (command == "off") { irsend.sendPanasonic(0x2A4C,0x28C008E); // Denon AVR - Power Off delay(100); irsend.sendPanasonic(0x2A4C,0x28C008E); // Denon AVR - Power Off Serial.println("Denon AVR - Power Off"); } } if (device == "epson") { if (command == "on") { irsend.sendNEC(0xC1AA09F6, 32); // Epson Beamer - Power On delay(100); irsend.sendNEC(0xC1AA09F6, 32); // Epson Beamer - Power On Serial.println("Epson Beamer - Power On"); } if (command == "off") { irsend.sendNEC(0xC1AA8976, 32); // Epson Beamer - Power Off delay(100); irsend.sendNEC(0xC1AA8976, 32); // Epson Beamer - Power Off Serial.println("Epson Beamer - Power On"); } } delay(100); WebServer.send(200, "text/html", message); // Returns the HTTP response }
Hallo Stefan,
ich habe die Lösung nachgebaut und an meine Verhältnisse angepasst -funktioniert einwandfrei. Vielen Dank für den Beitrag.
Der Aufruf über den Browser ist problemlos möglich.
Letztendlich möchte ich die Infrarotübertragung aber aus HomeMatic von EQ3 steuern (Monoblock-Klimaanlage einschalten).
Dazu habe ich versucht, den Aufruf in ein Script aus dem Buch von Hartmut Jung “Hausautomation mit Homematic S.186” zu kopieren.
Version mit system.Exec:
!klima ea
string stdout;
string stderr;
system.Exec (“wget -O /dev/null -q http://192.168.178.46/irsend?device=klima&command=on“);
Version mit CuXD:
!klima_cux
string stdout;
string stderr;
dom.GetObject(“CUxD.CUX2801001:13.CMD_EXEC”).State(“wget -0 /dev/null -q http:192.168.178.46 /irsend?device=klima&command=on”);
Die Fehlerprüfung findet beide Fälle OK – funktioniert trotzdem nicht.
(meine eigenen Kenntnisse reichen nicht aus, um das Problem zu lösen und im Homematic-Forum habe ich nichts gefunden)
Hättest Du eine Idee, wie man das Problem lösen könnte?
Viel Grüße Lutz
Hallo Lutz,
ohh, Homematic ist bei mir jetzt schon etwas länger her. Vielleicht hilft dir der Beitrag Homematic Low Battery Check weiter? Hier habe ich auch über http Befehle genutzt um mit dem Loxone Miniserver zu kommunizieren. Eine andere spontane Idee wäre es, mit einem Tool wie “Packet Sender” den http Aufruf zu analysieren. Hoffe damit kommst du ein Stück weiter?!
Viele Grüße
Stefan
Vielen Dank erst mal für die Antwort- ich werde weiter probieren.
VG Lutz
Hallo Stefan,
nochmals vielen Dank für den Tipp mit “HM Low Battery Check” – ich habe den Aufruf einfach hineinkopiert und die Sache funktioniert wunderbar. Damit ist der WLAN-IR Modul auch Homematic-tauglich.
(Der IR-Diode habe ich noch einen 22 Ohm Vorwiderstand gegönnt und die Speisung erfolgt über ein Handynetzteil .)
Viele Grüße Lutz