Inhalt
Vor einiger Zeit hatte ich mir den Broadlink-Infrarot-Sender RM Mini 3 zugelegt, um mit ihm die alten TV- und Audio-Geräte in’s Smart-Home einbinden zu können.
Zwar gibt es für die Verbindung zu MQTT das gut funktionierende Paket broadlink-mqtt, aber die Firmware des Geräts selbst ist so instabil, dass sie einen in den Wahnsinn treibt. Ich musste sie mehrmals zurücksetzen und neu konfigurieren, was durch die Einbindung in die Hersteller-Cloud langwierig und aufwändig ist. Zuletzt verweigerte sie den Dienst komplett. Das musste sich ändern!
Der Umbau
Leider lässt sich der eingebaute Chip nicht mit einer Alternativ-Firmware flashen, weil die Hardware nicht unterstützt wird.
Zum Glück gibt es aber in diesem Umbau-Projekt eine sehr gute Anleitung zum Austausch der Hardware gegen einen ESP8266 in Form des Wemos D1 mini. Dabei wird der eingebaute Prozessor samt Platine entfernt und gegen den Wemos ersetzt - nur das Gehäuse und die Platine mit den Sende- und Empfangs-Dioden benutzt man weiter.
Wer etwas mit dem Lötkolben umgehen kann, erledigt diesen Umbau in weniger als einer Stunde.
Tasmota
Die Installation und Konfiguration der Tasmota-Firmware ist Standard. Als Modultyp wird die 18 (Generic) ausgewählt; der Ausgang zum Infrarot-Sender (IRsend) sitzt bei mir an Port GPIO5, der Eingang vom IR-Empfänger (IRrecv) an GPIO2.
Für die Einbindung in MQTT vergibt man in der Tasmota-MQTT-Konfiguration neben den Angaben zum MQTT-Broker jedem Gerät einen eigenen Topic (hier: „broadlink”) - darüber wird er später adressiert.
MQTT-Messages
Für die Topics der Broker-Messages interessieren 3 Präfixe:
cmnd/
für Kommandos an Tasmota und den IR-Sendertele/
für Meldungen des IR-Empfängers undstate/
für Status-Meldungen des Tasmota-Firmware
Zum Senden eines Infrarot-Kommandos sendet man an das Topic
cmnd/broadlink/irsend
eine Payload mit den Daten des Kommandos. Für die Power-Taste meines alten Technics-Radios wäre das zum Beispiel
{"Protocol":"PANASONIC","Bits":48,"Data":"0x40040500BCB9","DataLSB":"0x0220A0003D9D","Repeat":0}
Woher diese Daten kommen erkläre ich später im Kapitel „Tasten anlernen”.
Sind wir schon drin?
Als ersten Test fragen wir den Status des Gerätes ab. Dazu senden eine MQTT-Message wir an das Topic
cmnd/broadlink/status0
Die Payload ist dabei nicht relevant; sie kann leer bleiben. Antwort erhalten wir, wenn wir das Topic
stat/broadlink/STATUS
abonnieren. Sie sollte in etwa so aussehen:
{ "Status" : { "Module" : 18, "FriendlyName" : [ "Tasmota" ], "Topic" : "broadlink", "ButtonTopic" : "0", "Power" : 0, "PowerOnState" : 3, "LedState" : 1, "LedMask" : "FFFF", "SaveData" : 1, "SaveState" : 1, "SwitchTopic" : "0", "SwitchMode" : [ 0, 0, 0, 0, 0, 0, 0, 0 ], "ButtonRetain" : 0, "SwitchRetain" : 0, "SensorRetain" : 0, "PowerRetain" : 0 } }
Diese Abfrage kann man später in einer Applikation verwenden, um zu prüfen, ob die Infrarot-Bridge online ist.
Die IR-Kommandos
Jedes Infarot-Kommando besteht aus einer Folge von Blinkmustern der Infrarot-Diode des Senders, die Hersteller- und Gerätespezifisch aufgebaut ist. Tasmota kennt zwar die Kodierungsarten einer Vielzahl von Herstellern, allerdings nicht von allen. Ob die eigene Fernbedienung also zum Mitspielen zu bewegen ist, muss man ausprobieren.
Auch wenn ein Hersteller grundsätzlich unterstützt wird, muss man die Codes der einzelnen Tasten kennen. Wenn man Glück hat, wurden die Tastencodes schon einmal von einem freundlichen Kollegen (wie mir) veröffentlicht - dazu unten mehr. Im Normalfall muss man aber jede Taste anlernen, was je nach Applikation sehr mühselig werden kann. Gut, wenn man etwas Node-Red Know-How hat.
Tasten anlernen
Die Tasmota-Software hört ständig am IR-Empfänger. Empfangene Kommandos meldet sie mit einer MQTT-Message an das Topic
tele/<topic>/RESULT
In unserem Falle abonniert man also
tele/broadlink/RESULT
und wartet auf empfangene IR-Codes. Im Normalbetrieb werden die Codes an andere Geräte weitergeleitet oder einfach ignoriert. Im Anlernzustand speichern wir aber die empfangene json-Struktur in einer Datei.
Benennt man die Dateien mit den Namen der Fernbedienungs-Tasten und speichert alle Dateien eines Geräts in einem Verzeichnis, erhält man eine hierarchische Struktur mit Tastencodes. Ich habe als zusätzliche Hierarchiestufe noch eine Geräteklasse (av, bd, cd, sat, tv) eingeführt. Das ganze sieht dann in etwa so aus:
$ ls -R
.:
av bd cd sat tv
./av:
technics
./av/technics:
0 4 8 cdmode deckplayback dolbycenterdown dolbyrearup tunerpower vcr1 volumedown
1 5 9 cdplay deckplayfwd dolbycenterup mute tvdown vcrplay volumeup
2 6 cd cdstop deckstop dolbymode power tvpower vcrpower
3 7 cd+10 deck12 disc dolbyreardown tape tvup vcrstop
./bd:
sony
./bd/sony:
0 5 angle display home options programdown right subtitle up
1 6 audio down input pause programup scenesearch theatre volumedown
2 7 back fastforward left play red skipback time volumeup
3 8 blue forward mute popupmenu return skipforward topmenu yellow
4 9 clear green openclose power rewind stop tvpower
./cd:
technics-eu technics-eu64798
./cd/technics-eu:
0 10 3 5 7 9 leveldown openclose play random searchback skipback stop
1 2 4 6 8 abrepeat levelup pause power repeat searchfwd skipfwd timemode
./cd/technics-eu64798:
0 10plus 4 7 abrepeat leveldown pause program repeat sideab stop
1 2 5 8 autocue levelup peaksearch random searchback skipback tapelegth
10 3 6 9 clear openclose play recall searchfwd skipfwd timemode
./sat:
kathrein
./sat/kathrein:
0 3 6 9 blue forward left mute play programup red stop volumedown
1 4 7 archiv down green media ok power question rewind text volumeup
2 5 8 back epg info menu pause programdown record right up yellow
./tv:
sony
./tv/sony:
0 4 8 blue green left power return subtitle syncpause theatre yellow
1 5 9 digital guide mute programdown right syncback syncplay up zoom
2 6 analog down home ok programup scene syncforward syncstop volumedown
3 7 audio favorites info options red source syncmenu text volumeup
Genau den Inhalt dieser Code-Dateien kann man später an den IR-Sender schicken, um das Drücken der entsprechenden Taste zu simulieren.
Ein kleiner Flow in node-red erledigt das Anlernen ganz bequem:
Der Knoten „listen” wird 1 Sekunde nach Start getriggert, löst die Stop-Taste aus und speichert den Inhalt der Eingabefelder im Kontextspeicher. Jede spätere Änderung der Eingabefelder wird ebenso in den Kontext geschrieben.
Zum Start der Aufnahme wird der Kontext-Wert „listen” mit der Start-Taste auf true gesetzt und die Empfangs-LED zum Leuchten gebracht.
Trifft bei gestarteter Aufnahme (listen==true) ein Datenpaket des IR-Empfängers mit dem Topic „tele/broadlink/RESULT” über MQTT ein, wird es in der Verzeichnishierarchie entsprechend der eingetragenen Namen abgelegt. Gleichzeitig wird die Empfangs-LED gelöscht und eine Erfolgsmeldung ausgegeben.
Zur Bedienung erhält das Node-Red-Dashboard eine ui-Gruppe namens Anlernen:
In die 3 oberen Felder trägt man die Geräteklasse, den Gerätenamen und die Bezeichnung der zu lernenden Taste ein. Der Start-Knopf versetzt den Flow in den Anlernstatus, die Stop-Taste bricht ihn ohne Speichern ab, z.B. bei Fehleingaben. Die Empfangs-LED leuchtet bei Empfangsbereitschaft.
Die Tasten einer Fernbedienung lassen sich mit einer einfachen Arbeitsfolge in wenigen Minuten anlernen:
- Geräteklasse und Gerätenamen eintragen
- Für jede Taste:
- Tastenbezeichnung eintragen
- START drücken
(Empfangs-LED leuchtet) - Taste der Fernbedienung drücken
(Empfangs-LED erlischt, Meldung wird angezeigt)
- Punkt 2 wiederholen, bis alle Tasten gespeichert sind
Den Flow könnt ihr euch gern hier herunterladen und als Grundlage für eure Anwendung benutzen.
Tasten Senden
Das Senden ist mit den Vorbereitungen oben auch ganz einfach. Der folgende kleine Flow zeigt das Prinzip:
Der Dashboard-Button links sendet den Namen der Taste, wie er auch im Dateinamen verwendet wurde, also z.B. „power”. Für jede Fernbedienungstaste gibt es einen dieser Buttons.
Die Funktion ergänzt den Namen um das Verzeichnis, hier also z.B. „remote/tv/sony/”. Diese Funktion existiert ein mal pro Gerät; alle Tasten des Geräts sind mit dem Funktionseingang verbunden.
Der Datei-Knoten liest die Datei mit dem eben zusammengebastelten Namen aus und sendet den Inhalt an das MQTT-Topic „cmnd/broadlink/irsend”. Den Rest übernehmen der MQTT-Broker, Tasmota und der Wemos mit den Sendedioden des Broadlink.
Auch dieses Beispiel könnt ihr gern hier herunterladen.
Bibliothek der IR-Codes
Um euch das Leben noch etwas einfacher zu machen, veröffentliche ich hier die Dateien mit den angelernten Tastencodes meiner Fernbedienungen in dem Format, wie ihr es direkt an einen IR-Sender mit Tasmota-Firmware schicken könnt.
Jede Datei enthält ein Verzeichnis mit den Dateien für alle Tasten, eingepackt im zip-Fomat.
Sony
- TV KDL 46W5800
(Fernbedienung RM-ED016) - BD-Player BDP-S350
(Fernbedienung RMT-B102P)
Technics
- AV-Receiver SA-GX350
(Fernbedienung RAK-SA009XH) - CD-Player SL-PG500A
Kathrein
- Sat-Receiver UFS903
Wenn ihr eigene Tastencodes aufgenommen habt. könnt ihr sie gern im gleichen Format an mich schicken, und ich veröffentliche sie hier. So kann dann Stück für Stück eine Bibliothek der Tasmota-Infrarot-Codes entstehen.
Hello
Super Artikel! Danke für das! - Habe einen ESP32 dran gemacht, hat bestens funktioniert. NB. die default Tasmota ESP32 Binary hat IR pins nicht ansteuern können, aber ein OTA Update hat geholfen.