IR-WLAN-Gateway

Aus FHEMWiki
IR-WLAN-Gateway
IR-WLAN-Gateway
Allgemein
Protokoll HTTP
Typ Sender/Receiver
Kategorie Other
Technische Details
Kommunikation 2,4 GHz
Kanäle 1
Betriebsspannung 5V
Leistungsaufnahme ~0,2W(Standby)
Versorgung Kleinspannung
Abmessungen 55x20 mm (Durchm. x Höhe)
Sonstiges
Modulname HTTP oder IR-Blaster (inoff.)
Hersteller HomeBrew


Das IR-WLAN-Gateway ist ein ESP8266-basierter Sender und Empfänger für Infrarotsignale zur Steuerung von Unterhaltungselektronik.

Prinzipiell genügen sehr wenige externe Bauteile zum ESP8266 oder einem Entwicklermodul, 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
address - (optional) additional device address (decimal!)
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 zweimal 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!

Betrieb über MQTT

Die Einbindung als MQTT_DEVICE mit remotecontrol ist hier dargestellt.

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 LG- und 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}]

LG-Fernseher verwenden ebenfalls NEC-Codes mit 32 bit, Syntax wie bei Yamaha-Receivern. Auch hier gibt es glücklicherweise extra ON- und OFF-Befehle, um gezielt ein- und auszuschalten (statt Toggle). (Natürlich lassen sich alle modernen Geräte auch via Netzwerk steuern, aber man spart ordentlich Standbystrom, wenn man die Connectivity im Standby deaktiviert und den TV stattdessen infrarot einschaltet). Vollständige Liste in den Links unten.

  attr IRWz IR_LGTVPOWER_OFF [{"data":"20DFA35C","type":"NEC","length":32}]
  attr IRWz IR_LGTVPOWER_ON [{"data":"20DF23DC","type":"NEC","length":32}]
  attr IRWz IR_LGTVMUTE [{"data":"20DF906F","type":"NEC","length":32}]

Panasonic

Auch wenn sich ein Panasonic-TV (wie viele andere Geräte auch) optimal über Netzwerk steuern lässt, muss er zunächst ggf. aus dem deep standby geweckt werden. Leider gibt es hierfür keine dedizierten ON- und OFF-Befehle, sondern nur power toggle. Zum Einschalten muss der Befehl allerdings etwas länger gesendert werden (ebenso wie man den Knopf auf der Fernbedienung länger drücken muss), dies lässt sich durch zusätzliche 'pulse'- und 'pdelay'-Angaben erreichen:

  IR_PanasonicTV_Power_long [{'data':'0100BCBD','address':'4004','type':'PANASONIC','length':48,'pulse':10,'pdelay':1}]

Für TV-Mute könnte ein Befehl lauten:

  IR_PanasonicTV_Mute [{'data':'01004C4D','address':'4004','type':'PANASONIC','length':48}]

Auch diese Befehle zur Lautstärkesteuerung sind erprobt - durch Variation der 5 hinter pulse kann gesteuert, wie groß die Lautstärkeänderung ist:

  IR_PanasonicTV_VolDown [{'data':'01008485','address':'4004','type':'PANASONIC','length':48,'pulse':5,'pdelay':1}]
  IR_PanasonicTV_VolUp [{'data':'01000405','address':'4004','type':'PANASONIC','length':48,'pulse':5,'pdelay':1}]

Bitte beachten: Die Adresse des Gerätes muss hexadezimal angegeben, also 4004 statt 16388

Weitere Befehle finden sich über die Links am Ende des Artikels.

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':'0C','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}]

Die folgenden Codes steuern Lumix Weihnachtsbaumkerzen von der Firma Krinner (2. Generation). Diese gibts in verschiedenen Farben und unterschiedlichen Größen (AA vs AAA Batterien). Die Kerzen haben drei Kanäle, die folgenden Beispiele funktionieren für Kanal B:

 LumixChanBFlicker
 [{'data':[500,1000, 500,400, 1100,1000, 500,1000, 500,1000, 500,400, 1100,1000, 500,400, 2050,4900, 2050,1000, 500,1000,
 500,400, 1100,1000, 500,1000, 500,1000, 500,400, 1100,1000, 500,400, 2050], 'type':'raw', 'khz':38}]
 LumixChanBOFF
 [{'data':[1100,1000, 500,1000, 500,1000, 500,400, 1100,400, 1100,400, 2050,4900, 2050,1000, 500,1000, 500,400, 1100,1000,
 500,1000, 500,1000, 500,400, 1100,400, 1100,400, 2050], 'type':'raw', 'khz':38}]
 LumixChanBON
 [{'data':[500,1000, 500,1000, 500,1000, 500,1000, 500,400, 2050,4900, 2050,1000, 500,1000, 500,400, 1100,1000, 500,1000,
 500,1000, 500,1000, 500,1000, 500,400, 2050], 'type':'raw', 'khz':38}]

ON = Anschalten volle Helligkeit, OFF = Aus, Flicker = Flackern. Die Kerzen können auch gedimmt werden - war mir aber nicht wichtig.

Bekannte Probleme

Das etwas problematische Erkennen wurde bereits beschrieben.

Links