IR-WLAN-Gateway
Das IR-WLAN-Gateway ist ein ESP8266-basierter Sender und Empfänger für Infrarotsignale zur Steuerung von Unterhaltungselektronik.
An dieser Seite wird momentan noch gearbeitet. |
Prinzipiell genügen sehr wenige Bauteile, besondere Verbreitung hat jedoch ein Projekt gefunden, das auch unter dem Namen IRBlaster bekannt ist. Eine Zusatzplatine zu einem WEMOS-D1-Modul mit bis zu sechs Infrarot-Sendedioden und optionalen Status-LED benötigt insgesamt nur eine 5-Volt-Versorgung, etwa aus einem Handynetzteil. Durch die hohe Sendeleistung werden auch ungünstig platzierte Geräte per Streulicht oft besser erreicht als mit den originalen Fernbedienungen.
Eigenschaften
- direkte Unterstützung zahlreicher Hersteller-Protokolle
- indirekte Unterstützung diverser anderer Hardware durch RAW-Protokoll
- Integrierter Webserver u.a. mit Analyse empfangener IR-Codes inkl. Zuordnung zu Protokollen, Liste zuletzt empfangener und gesendeter Codes, diverse Einstellungen
- Aussendung von IR-Codes mittels einzeiliger Aufrufe (aus FHEM mit getHttp, inkl. Rückmeldung)
- over-the-air (OTA) Firmware-Update möglich
Spezifikationen
- Eingangsspannung: 5V, max. 1A
- Maße: ca. 55 x 20 mm (Durchmesser x Höhe)
- Netzwerk-Anschluss: WLAN, 2,4 Ghz
Weitere Informationen
Einen sehr umfänglichen Artikel gibt es im ESP8266-Unterforum der Bastelecke (Link s.u.), in welchem Aufbau, Verwendung in FHEM sowie Firmwareversionen fortlaufend diskutiert und weiterentwickelt werden. Die Informationen dort sind i.d.R. aktueller als in diesem Artikel.
Fertige WLAN-Interfaces oder Leiterplatten werden gelegentlich in wechselnden Threads im Marktplatz - Güter angeboten.
Die Entwicklung ist derzeit (Januar 2018) noch im Gange, weitere Funktionen werden noch eingebaut.
Hinweise zum Betrieb mit FHEM
Betrieb über GetHttpFile-Aufrufe
Man kann einen Dummy definieren:
define IR_Command dummy attr IR_Command room IR_Remote attr IR_Command setList TV_1 TV_2 TV_12 TV_Power attr IR_Command webCmd TV_1:TV_2:TV_12:TV_Power
und auf dessen Änderung mit einem DOIF reagieren:
define IR_Remote DOIF ([IR_Command] eq "TV_1") ({GetHttpFile("192.168.1.27","/json?plain=[{'data':'E0E020DF','type':'SAMSUNG','length':32}]")})\ DOELSEIF ([IR_Command] eq "TV_2") ({GetHttpFile("192.168.1.27","/json?plain=[{'data':'E0E0A05F','type':'SAMSUNG','length':32}]")})\ DOELSEIF ([IR_Command] eq "TV_12") ({GetHttpFile("192.168.1.27","/json?plain=[{'data':'E0E020DF','type':'SAMSUNG','length':32},{'data':'E0E0A05F','type':'SAMSUNG','length':32}]")})\ DOELSEIF ([IR_Command] eq "TV_Power") ({GetHttpFile("192.168.1.27","/json?plain=[{'data':'E0E040BF','type':'SAMSUNG','length':32}]")}) attr IR_Remote do always attr IR_Remote room IR_Remote attr IR_Remote verbose 0
Der JSON Part kann folgende Parameter enthalten:
data - IR code data, may be simple HEX code such as "A90" or an array of int values when transmitting a RAW sequence type - Type of signal transmitted. Example "SONY", "RAW", "Delay" or "Roomba" (and many others) length - (conditional) Bit length, example 12. Parameter does not need to be specified for RAW or Roomba signals pulse - (optional) Repeat a signal rapidly. Default 1 pdelay - (optional) Delay between pulses in milliseconds. Default 100 repeat - (optional) Number of times to send the signal. Default 1. Useful for emulating multiple button presses for functions like large volume adjustments or sleep timer rdelay - (optional) Delay between repeats in milliseconds. Default 1000 khz - (conditional) Transmission frequency in kilohertz. Default 38. Only required when transmitting RAW signal
Zwei oder mehr unterschiedliche Signale können in einem Kommando gesendet werden:
{GetHttpFile("192.168.1.27","/json?plain=[{'data':'E0E020DF','type':'SAMSUNG','length':32},{'data':'E0E0A05F','type':'SAMSUNG','length':32}]")}
Soll das gleiche Signal 2 mal gesendet werden, gibt es dafür den Parameter "repeat"
{GetHttpFile("192.168.1.27","/json?plain=[{'data':'E0E020DF','type':'SAMSUNG','length':32,'repeat':2}]")}
Betrieb über eigenes FHEM-Modul 84_IRBlaster
Wesentlich komfortabler und einrichtungsfreundlicher ist das Modul 84_IrBlaster.pm (Link s.u.). Das Modul kann die Erreichbarkeit der Hardware prüfen, Codes werden per set <IrBlaster> add <Codename> [{'data...}]
als Attribute hinterlegt und gepflegt, der Aufruf erfolgt dann mit set <IrBlaster> send <Codename>
. Mehrfache oder wiederholte Codes sind entsprechend ebenso möglich. Die Modulhilfe erläutert umfassend Einrichtung und Einsatz. Eine Beispieldefinition:
defmod IRWz IrBlaster 192.168.178.60 IR_ ## IR_ ist ein definierte Präfix für alle Attribute, kann selbst bestimmt werden attr IRWz userattr IR_.* ... ## diese Userattribute werden vom Modul IR_PhilipsTVON IR_PhilipsTVPOWER IR_SonyBeamer2XPOWER IR_SonyBeamerOFF IR_SonyBeamerON IR_SonyBeamerPOWER IR_SonyBlurayEJECT attr IRWz icon IR attr IRWz interval 60 ## das Gateway wird jede Minute angepingt attr IRWz maxRetries 0 ## Anzahl der Wiederholungen, wenn das Gateway nicht reagiert ... attr IRWz IR_KerzenAN [{'data':'FF10EF','type':'NEC','length':32}] attr IRWz IR_KerzenAUS [{'data':'FF20DF','type':'NEC','length':32}] ... usw. siehe Codebeispiele!
Anzeige empfangerer Codes mit KeyValueProtokoll
FHEM kann die empfangenen Codes, die das Hardware-Modul per UDP broadcastet, anzeigen. Zunächst definiert man ein KVP-Device, z.B.:
defmod myKVPUDP KVPUDP attr myKVPUDP group Schnittstellen attr myKVPUDP room System
Empfängt das WLAN-Modul innerhalb von 2 Minuten zwei oder mehrere IR-Codes, legt myKVPUDP automatisch ein passendes Gerät an, z.B.:
defmod KeyValueProtocol_IR_Blaster_1440790 KeyValueProtocol IR_Blaster 1440790 attr KeyValueProtocol_IR_Blaster_1440790 IODev myKVPUDP
in dessen Readings dann die letzten fünf empfangenen Codes gelistet werden:
2018-02-05 19:06:22 CR01_Json_Local_IP http://192.168.178.60:80/json?plain=[{'data':[588,3522,298,468,354,5316,272], 'type':'raw', 'khz':38}] 2018-02-05 19:06:22 CR02_Json_Local_IP http://192.168.178.60:80/json?plain=[{'data':[1116,1478,510,550,586], 'type':'raw', 'khz':38}] 2018-02-05 19:06:22 CR03_Json_Local_IP http://192.168.178.60:80/json?plain=[{'data':[776,1292,482,2910,350], 'type':'raw', 'khz':38}] 2018-02-05 19:06:22 CR04_Json_Local_IP http://192.168.178.60:80/json?plain=[{'data':[1432,1004,432,1106,664,1534,484,1184,324,5450,302,824,276], 'type':'raw', 'khz':38}] 2018-02-05 19:06:22 CR05_Json_Local_IP http://192.168.178.60:80/json?plain=[{'data':[588,3280,302,8356,380], 'type':'raw', 'khz':38}] 2018-01-31 23:03:43 ChipID 1440790 2018-01-31 23:03:43 FlashChipId 1458400 2018-01-31 23:03:43 MAC 60:01:94:xx:xx:xx 2018-01-31 23:03:43 ResetURL http://192.168.178.60:80/reset 2018-01-31 23:03:43 UpdateURL http://192.168.178.60:80/upload 2018-01-31 23:03:43 Version v2.7.3beta
Auf die Änderungen von CR0x_JSON_...
kann dann entsprechend reagiert werden. Die Funktion ist aber derzeit noch nicht wirklich stabil und vor allem für eine zeitnahe Auswertung von empfangenen Codes zu langsam, zudem ist der Code-Interpreter im ESP8266 nicht sehr sicher und liefert viele Fake-Codes. Dessen Funktion ist eigentlich auch nur zur einmaligen Ermittlung von IR-Codes vorhandener Fernbedienungen gedacht.
Ermittlung von IR-Codes vorhandener Fernbedienungen
Hat man ein KVP-Device definiert, lassen sich die letzten fünf empfangenen Codes von Fernbedienungen anzeigen. Alternativ kann man direkt im Webinterface des Moduls nachsehen, welches man mit http://<IP-Adresse-des-Moduls
aufruft, ggf. nach einem Browser-Refresh. Dort lassen sich auch definitionsfreundliche JSON-Blöcke direkt kopieren.
Beim Anlernen ist Fingerspitzengefühl gefragt, manche Codes werden bei längerem, manche bei sehr kurzem Tastendruck besser erkannt. Taucht ein Code besonders regelmäßig oder häufig in der Liste auf, ist er wahrscheinlich der richtige. Ein Test kann direkt aus dem Browser erfolgen, dazu einfach eine angezeigte Zeile in ein separates Fenster kopieren und abschicken.
Erzeugung eigener Codes und Beispiele
Nachfolgend werden Details und Beispiele zu einzelnen Code-Familien vorgestellt, bitte die Liste ergänzen!
SONY
Für SONY-Geräte gibt es derzeit verschiedene Codes mit verschiedenen Bitlängen und Formaten:
- 12-bit-Folgen bestehen aus 5 Adress- und 7 Befehlsbits.
- 15-bit-Folgen bestehen aus 8 Adress- und 7 Befehlsbits.
- 20-bit-Folgen bestehen aus 8 Extension-, 5 Adress- und 7 Befehlsbits.
Sony sendet LSB first, die Bitfolgen müssen also invertiert werden. Das IR-Gateway wird immer mit Bytes befüttert, im Falle von 15-bit-Folgen setzt man dazu eine 0 vor die gespiegelte Folge.
Konstruktionsbeispiele:
Beamer (Gerätecode 84, Befehl 47 = POWER OFF) -> Adresse 84 (8 bit) ist hex "54" oder "01010100", Befehl ist 47, hex "2F", aber nur sieben bits, also "0101111", zusammen also "01010100,0101111". spiegeln und noch eine 0 davor setzen und gruppiert für die Optik: 0,111 1010,0010 1010 = hexadezimal "7A2A".
SONY-TV (Gerät 1, Befehl 47 = POWER OFF) -> Adresse (5 bit) "00001", Befehl "2F" bzw. "0101111", zusammen also "00001,0101111" gespiegelt "1111 010,1 0000", 12 bits, ohne Füllbit = "F50"
SONY-Bluray-Player (Gerät 26, Extension 226, Befehl 47 = POWER OFF) -> Extension (8bit) hex E2h bzw. "1110 0010", Adresse (5 bit) hex 1Ah bzw. "11010", Befehl "2F" bzw. "0101111", zusammen also "11100010,11010,0101111" gespiegelt "1111 010,0 1011,0100 0111", kein Füllbit nötig, "F4B47"
Ein fertiger Befehl wäre dann zum Beispiel
{GetHttpFile("192.168.178.60","/json?plain=[{'data':'7A2A','type':'SONY','length':15}]")}
Fertige Codes aus der 84_IrBlaster-Definition zur Nachnutzung:
IR_SonyBeamerOFF [{'data':'7A2A','type':'SONY','length':15}] IR_SonyBeamerON [{'data':'3A2A','type':'SONY','length':15}] IR_SonyBlurayEJECT [{'data':'68B47','type':'SONY','length':20}] IR_SonyBlurayOFF [{'data':'F4B47','type':'SONY','length':20}] IR_SonyBlurayON [{'data':'74B47','type':'SONY','length':20}]
NEC
NEC-Codes werden unter anderem von Yamaha-Geräten, aber auch von Dingen wie infrarotgesteuerte LED-Wachs- oder Baumkerzen verwendet. Es werden 16-, 24- und 32-bit Codes unterschieden, deren Konstruktion einfachen Regeln folgt - unter anderem werden die Informationen oft zu 32-bit-Folgen ergänzt
16-bit Codes werden byteweise negiert wiederholt. Ein gesendeter Code "00FF807F" setzt sich eigentlich aus "00" und "80" zusammen, die jeweils von den bitweise negierten Bytes gefolgt werden: Auf 0000 0000 folgt 1111 1111, auf 1000 0000 entsprechend 0111 1111.
IR_BaumkerzenAN [{'data':'FF807F','type':'NEC','length':32}] IR_BaumkerzenAUS [{'data':'FF906F','type':'NEC','length':32}] IR_KerzenAN [{'data':'FF10EF','type':'NEC','length':32}] IR_KerzenAUS [{'data':'FF20DF','type':'NEC','length':32}]
Diese Codes wurden mit dem Gateway ermittelt. Allerdings gibt es eine gegenseitige Beeinflussung, so führt jeder Baumkerzenbefehl zu einem Einschalten der Wachskerzen, und ein anderer Befehl toggelt sie. Amn muss in diesem Fall eben stets zwei Codes senden.
Ein Yamaha-AVR-Receiver wird mit 16-, 24- und 32-bit-Befehlen gesteuert. Die in den Codetabellen (etwa in Servicehandbüchern) gelisteten Befehle gehorchen einem Schema xx-xx, xx-xxxx, xxxx-xx oder xxxx-xxxx. Auch hier wird eine xx-Gruppe negiert wiederholt, bei xxxx-Angaben jedoch nicht. Außerdem werden die Bytes jeweils gespiegelt gesendet (LSB->MSB).
Der Code "7A-1C" (Mute) wird wie folgt umgerechnet:
- 7A entspricht 0111 1010, gespiegelt 0101 1110, negiert 1010 0001, zusammengesetzt = 5EA1
- 1C entspricht 0001 1100, gespiegelt 0011 1000, negiert 1100 0111, zusammengesetzt = 38C7, beides zusammen ergibt als Befehlscode
[{'data':'5EA138C7','type':'NEC','length':32}]
Der Code "7A-4738" (Eingang HDMI-1 bei einem RX-V 667 und kompatiblen) wird entsprechend
- 7A entspricht 0111 1010, gespiegelt 0101 1110, negiert 1010 0001, zusammengesetzt = 5EA1
- 47 entspricht 0100 0111, gespiegelt 1110 0010, nicht negiert wiederholt, = E2
- 38 entspricht 0011 1000, gespiegelt 0001 1100 = 1C, alles zusammen wird
[{'data':'5EA1E21C','type':'NEC','length':32}]
Nur wenig dokumentiert sind hier die wertvollen diskreten ON- und OFF-Befehle statt des üblichen Power-Toggle. Sie funktionieren aber zum Glück auch hier:
IR_YamahaReceiverHDMI1 [{'data':'5EA1E21C','type':'NEC','length':32}] IR_YamahaReceiverHDMI2 [{'data':'5EA152AC','type':'NEC','length':32}] IR_YamahaReceiverHDMI3 [{'data':'5EA1B24C','type':'NEC','length':32}] IR_YamahaReceiverHDMI4 [{'data':'5EA10AF4','type':'NEC','length':32}] IR_YamahaReceiverMUTE [{'data':'5EA138C7','type':'NEC','length':32}] IR_YamahaReceiverOFF [{'data':'7E81FE01','type':'NEC','length':32}] IR_YamahaReceiverON [{'data':'7E817E81','type':'NEC','length':32}] IR_YamahaReceiverPOWER [{'data':'7E8154AB','type':'NEC','length':32}]
RC5 und RC6
Mit dem Gateway ermittelte und getestete Codebeispiele für einen Philips-Fernseher des 2010er Baujahres
IR_PhilipsTVAmbilight [{'data':'8F','type':'RC6','length':20}] IR_PhilipsTVMUTE [{'data':'D','type':'RC6','length':20}] IR_PhilipsTVOFF [{'data':'3D','type':'RC6','length':20}] IR_PhilipsTVON [{'data':'3F','type':'RC6','length':20}] IR_PhilipsTVPOWER [{'data':'1000C','type':'RC6','length':20}]
Hinweis: Hier fehlen noch Hinweise, wie man RC5- und RC6-Codes mit zusätzlichen Adressen (etwa RC5 3,56) korrekt umrechnet.
RAW-Codes
Die folgenden Codes steuern eine Motorleinwand von EliteScreens. Die Codes wurden vom Gateway als RAW erkannt und nachträglich im Timing etwas gerichtet. Die krummen Zahlen entsprechen den umgerechneten Timing-Angaben aus der Herstellerdokumentation.
IR_LeinwandAB [{'data':[1263,421,1263,421,1263,421,1263,421,421,1263,421,1263,421,1263,421,1263,421,1263,1263,421,421,1263,421,1263,421,1263,1263,421,421,1263,1263,421,1263,421,1263,421,1263,421,421,1263,1263,421,1263,421,1263,421,421,1263,1263,421,1263,421,421,1263,421,1263,1263,421,421,1263,421,1263,1263],'type':'raw','khz':38}] IR_LeinwandAUF [{'data':[1263,421,1263,421,1263,421,1263,421,421,1263,421,1263,421,1263,421,1263,421,1263,421,1263,1263,421,421,1263,421,1263,1263,421,421,1263,1263,421,1263,421,1263,421,421,1263,1263,421,1263,421,1263,421,421,1263,1263,421,1263,421,421,1263,1263,421,421,1263,1263,421,421,1263,421,1263,1263],'type':'raw','khz':38}] IR_LeinwandSTOP [{'data':[1263,421,1263,421,1263,421,1263,421,421,1263,421,1263,421,1263,421,1263,421,1263,421,1263,421,1263,1263,421,421,1263,1263,421,421,1263,1263,421,1263,421,1263,421,421,1263,421,1263,1263,421,1263,421,421,1263,421,1263,421,1263,1263,421,1263,421,1263,421,1263,421,421,1263,421,1263,421],'type':'raw','khz':38}]
Bekannte Probleme
Das etwas problematische Erkennen wurde bereits beschrieben.
Links
- Hardwarebeschreibung: Platinenlayout, Bauteileliste
- Infos zur Hardware und Firmware: 360 Grad IR WLAN Gateway
- Infos zum FHEM-Modul: 84_IrBlaster - Modul zur Ansteuerung des (360 Grad) IR WLAN Gateways