Ich persönlich bin kein Freund von Universalfernbedienung, da oft wichtige Tasten fehlen oder nicht richtig funktionieren wollen.

Allerdings ist es auch lästig, dass "Fernbedienungschaos" Gästen zu erklären. Was also tun?

Nun, ich wollte gerne etwas, das man über das Handy bedienen kann, aber nicht meinen Geldbeutel unnötigt belastet.

Außerdem möchte ich die Sender direkt einspeichern können, also das ich für jeden Sender eine Taste habe, und mir die Nummern nicht merken muss.

Das klingt doch irgendwie perfekt, um es mit einem Arduino einfach selber zu bauen.

Bei mir ist das Projekt aufgrund von Platz- und Kommunikationsproblemen drei mal umgezogen.

Angefangen hatte ich auf einem Arduino UNO, wo allerdings der Speicherplatz nicht gereicht hatte. Also habe ich auf ein Arduino MEGA gewechselt. Aktuell nutze ich ein NodeMCU mit einem ESP8266, da die Kommunikation über WLAN viel praktischer ist.

Hier schonmal eine Vorschau, auf das Ergebnis.

Universalfernbedienung im Browser Marke Eigenbau

Hardware, welche ich aktuell steuere

  • Onkyo AV Receiver
  • Unitymedia Horizon
  • Samsung TV

IR Codes mit dem Arduino Senden und Empfangen

Auf dem Arduino nutze ich die Arduino-IRremote library zum Senden und Empfangen von Infrarot Signalen.

Arduino MEGA Schaltplan zum Senden und Empfangen von Infrarot Signalen Der Aufbau ist sehr einfach und zum Glück gibt es hier unzählige Beispiele im Internet. Ich habe auf einen Widerstand bei der Infrarot LED verzichtet, da diese immer nur ganz kurz eingeschaltet wird.

Ob die LED leuchtet könnt ihr mit eure Auge natürlich nicht kontrollieren. Hierfür könnt ihr euer Handy nutzen. Beim iPhone muss man die Frontkamera benutzen.

IR Codes auslesen

Aus den Beispielen solltet Ihr als erstes das Beispiel IRrecvDumpV2 auf euer Arduino flashen, und den seriellen Monitor starten.

Wenn Ihr nun eine Fernbedienung auf das Arduino ausrichtet und eine Taste drückt, sollte eine ähnliche ausgabe wie bei mir erscheinen. IR Code Ausgabe

Wenn ihr Glück habt, wird das Encoding erkannt, in diesem Beispiel NEC und es wurden 32 bits gelesen.

Nun können wir uns einen neuen Arduino Sketch erstellen, und versuchen dieses Signal zu senden.

#include <IRremote.h>

//Pin 3 bei einem UNO
//Pin 9 bei einem MEGA2560
IRsend irsend;

void setup(){

}

void loop(){
  irsend.sendNEC(0x44B36D32C, 32);
  delay(2000);
}

Dieses Beispiel hier ist die Power-Taste von meinem Onkyo AV Receiver.

IR Codes des Unitymedia Horizon auslesen

Das war der Punk, an dem es wirklich schwierig wurde. Die originale Fernbedienung des Horizon kommuniziert über Funk (ggf. Bluetooth?).

Die Unitymedia Hotline sagte mir auf Nachfrage (telefonisch), dass man den Horizon nicht mit einer Universalfernbedienung bedienen könnte, obwohl man den Infrarot Empfänger deutlich sieht, wenn man mit einer Taschenlampe in die Front leuchtet -.-

Ich habe also etwas im Internet gesucht und es gibt wohl Universalfernbedienungen, die auch den Horizon ansprechen können. In einem Forum habe ich die Lösung gefunden. Dort erzählte jemand, das die Android App RCoid free - IR Fernbedienung auch mit dem Unitymedia Horizon kann.

Jetzt brauchte ich also nur noch ein Android Handy, was ein IR Sender hat. Das alte Handy meiner Freundin, ein Samsung Galaxy S4 Mini, hatte glücklicherweise einen IR Sender. Nach einem kurzen Test der App stand fest: Ja! Es funktioniert!

Ich habe sofort eine E-Mail an Unitymedia und die Entwickler geschrieben, mit der bitte mir die IR Codes zu geben. Leider bis heute ohne eine Antwort.

Nicht das ich zu faul gewesen bin alle Tasten einmal zu drücken, mir ging es dabei um den Speicherplatz, denn das Protokoll, welches der Horizen für Infrarot verwendet, wurde von der Library nicht erkannt. Damit musste ich die gigantischen binary blobs speicher.

Hier erfolgte dann der erste Umzug vom Arduino UNO auf den Arduino MEGA.

Ich werde die IR Codes nicht veröffentlichen, da ich nicht weis, wie es mit den Lizenzen bei so etwas aussieht.

Alternativ könnte man auch eine Xbox One verwenden. Diese kann wohl auch andere Geräte über Infrarot steuern.

Eventuell hilft euch auch das.

Hier noch ein Forum mit weiteren Apps.

Kleines Update
Ich habe rausgefunden, dass man den Horizon auch über das Netzwerk steuern kann. So benötigt man keine IR Codes mehr.

RAW IR Codes senden

Das Protokoll, welches der Unitymedia Horizen verwendet wurde nicht erkannt. Allerdings besteht auch die möglichkeit, direkt RAW Daten zu senden.

Hier einmal ein Beispiel, wie dies funktioniert. Das Beispiel zeigt wieder die Power-Taste des Onkyo AV Receiver.

#include <IRremote.h>

//Pin 3 bei einem UNO
//Pin 9 bei einem MEGA2560
IRsend irsend;

void setup(){

}

void loop(){
  unsigned int  rawData[67] = {8850,4450, 550,550, 550,1650, 550,600, 500,600, 500,1650, 550,600, 500,1700, 500,1700, 550,600, 500,600, 500,1650, 550,1650, 600,550, 550,1650, 500,1700, 550,600, 500,1650, 550,1650, 550,600, 550,1650, 550,550, 550,550, 550,1650, 550,1650, 550,600, 500,600, 550,1650, 550,550, 550,1650, 550,1650, 550,600, 500,600, 500};  // NEC 4B36D32C
  irsend.sendRaw(rawData, sizeof(rawData) / sizeof(rawData[0]), 38);
  delay(2000);
}

Der erste Prototype

Der erste Prototype sah bei mir so aus. IR Code Ausgabe Über die Taster konnte ich einzelne Knöpfe der Fernbedienungen senden, um zu testen ob die Geräte die richtigen Signale empfangen.

Umzug auf ein NodeMCU mit ESP8266

Der ESP8266 ist ein toller Chip. Man bekommt ihn für kleines Geld im Internet, und er bietet glaube 4MB Speicher. Das Beste: WLAN!

Schaltung

Ich habe bei mir den IR Empfänger weg gelassen, da ich diesen nicht mehr benötige.

Die IR Diode wird an den Port D2 angeschlossen. NodeMCU ESP8266 IR Code senden

Code Anpassungen

Für den ESP8266 muss der Quelltext ein wenig angepasst werden. Als erstes muss die IR Library durch die IRremoteESP8266 getauscht werden.

Danach muss der Datentyp von unsigned int rawData[67] = {8850,4450...}; in uint16_t rawData[67] = {8850,4450...}; geändert werden.

Natürlich muss man auch noch die WLAN Einstellungen setzen. Die fertige Version sah dann so aus NodeMCU ESP8266 IR Code senden Auf eine Platine gelötet ist es dann wenige cm klein, und verschwindet einfach hinter dem Fernseher...

Steuerung über den Browser (und das Handy)

Den ESP8266 kann ich bequem über das WLAN ansprechen. Doch wie mach ich das?

Hierfür habe ich mit AngularJS, Bootstrap und PHP eine kleine Weboberfläche gebaut, welche alle Funktionen die ich benötige enthält. Den Webserver lasse ich auf meinem Homeserver laufen. Hierfür könnte man natürlich auch ein Raspberry Pi verwenden.

Drückt man eine Taste auf der Weboberfläche, wird dies durch AngularJS/AJAX an das PHP Skript auf dem Webserver geschickt. Das PHP Skript wiederrum leitet die Anfrage einfach auf einen Webserver auf dem ESP8266 als GET Request weiter.

Bei mir sind alle Tasten als Zahlen Codiert. Die Power Taste des AV Receiver entspricht der Zahl 50.

Request vom Frontend an das NodeMCU ESP8266 senden Zur Kontrolle antwortet das ESP8266 einfach mit dem übergebenen Wert.

Wenn man ein Arduino verwenden möchte, müsste man die Kommunikation dann über die Serielle Schnittstelle machen.

Version 1

Seit der ersten Version, habe ich eine Liste mit allen Eingängen des AV Receivers. Eingänge des AV Receivers

Und eine Liste von Radio und TV Sendern Radio und TV Sender auf dem iPhone 6 Radio und TV Sender auf dem iPad

Version 2 mit EPG Daten

Nach kurzer Zeit habe ich bemerkt, dass für den perfekten Schliff noch das aktuelle TV Programm fehlt. Ansonsten müsste ich immer zwischen der Webseite und einer App hin und her wechseln.

Ich bin auf den kostenlosen Dienst XMLTV.se gestoßen, welcher das TV Programm, für viele deutsche Sender, als XML und JSON anbietet. Ich habe mich für die JSON Version entschieden und einen kleinen Cronjob gebaut, welcher immer das aktuelle Programm, für die Sender die mich interessieren, in eine MySQL Datenbank schreibt. Diese läuft auch auf meinem Homeserver.

Neben dem Abholen der neuen Daten, löscht der Cronjob auch alle Sendungen, die älter sind als 24 Stunden. So verhindere ich, dass die Datenbank immer größer wird.

Wer mehr Sender benötigt, könnte auch den Dienst epgData.com testen.

Mein fertiges Ergebnis sieht nun so aus Sender mit EPG Daten auf iPad Sender mit EPG Daten auf iPhone 6