Die alte Fern­be­die­nung ins IoT-Zeit­al­ter retten

Broad­link RM 3 mini

Vor eini­ger Zeit hat­te ich mir den Broad­link-Infra­rot-Sen­der RM Mini 3 zuge­legt, um mit ihm die alten TV- und Audio-Gerä­te in’s Smart-Home ein­bin­den zu können.

Zwar gibt es für die Ver­bin­dung zu MQTT das gut funk­tio­nie­ren­de Paket broad­link-mqtt, aber die Firm­ware des Geräts selbst ist so insta­bil, dass sie einen in den Wahn­sinn treibt. Ich muss­te sie mehr­mals zurück­set­zen und neu kon­fi­gu­rie­ren, was durch die Ein­bin­dung in die Her­stel­ler-Cloud lang­wie­rig und auf­wän­dig ist. Zuletzt ver­wei­ger­te sie den Dienst kom­plett. Das muss­te sich ändern!

Der Umbau

Lei­der lässt sich der ein­ge­bau­te Chip nicht mit einer Alter­na­tiv-Firm­ware fla­shen, weil die Hard­ware nicht unter­stützt wird. 

Wemos D1 mini

Zum Glück gibt es aber in die­sem Umbau-Pro­jekt eine sehr gute Anlei­tung zum Aus­tausch der Hard­ware gegen einen ESP8266 in Form des Wemos D1 mini. Dabei wird der ein­ge­bau­te Pro­zes­sor samt Pla­ti­ne ent­fernt und gegen den Wemos ersetzt - nur das Gehäu­se und die Pla­ti­ne mit den Sen­de- und Emp­fangs-Dioden benutzt man weiter.

Wer etwas mit dem Löt­kol­ben umge­hen kann, erle­digt die­sen Umbau in weni­ger als einer Stunde.

Tas­mo­ta

Die Instal­la­ti­on und Kon­fi­gu­ra­ti­on der Tas­mo­ta-Firm­ware ist Stan­dard. Als Modul­typ wird die 18 (Gene­ric) aus­ge­wählt; der Aus­gang zum Infra­rot-Sen­der (IRsend) sitzt bei mir an Port GPIO5, der Ein­gang vom IR-Emp­fän­ger (IRrecv) an GPIO2.

Für die Ein­bin­dung in MQTT ver­gibt man in der Tas­mo­ta-MQTT-Kon­fi­gu­ra­ti­on neben den Anga­ben zum MQTT-Bro­ker jedem Gerät einen eige­nen Topic (hier: „broad­link”) - dar­über wird er spä­ter adressiert. 

MQTT-Mes­sa­ges

Für die Topics der Bro­ker-Mes­sa­ges inter­es­sie­ren 3 Präfixe:

  • cmnd/ für Kom­man­dos an Tas­mo­ta und den IR-Sender
  • tele/ für Mel­dun­gen des IR-Emp­fän­gers und
  • state/ für Sta­tus-Mel­dun­gen des Tasmota-Firmware

Zum Sen­den eines Infra­rot-Kom­man­dos sen­det man an das Topic

cmnd/broadlink/irsend

eine Pay­load mit den Daten des Kom­man­dos. Für die Power-Tas­te mei­nes alten Tech­nics-Radi­os wäre das zum Beispiel

{"Protocol":"PANASONIC","Bits":48,"Data":"0x40040500BCB9","DataLSB":"0x0220A0003D9D","Repeat":0}

Woher die­se Daten kom­men erklä­re ich spä­ter im Kapi­tel „Tas­ten anlernen”.

Sind wir schon drin?

Als ers­ten Test fra­gen wir den Sta­tus des Gerä­tes ab. Dazu sen­den eine MQTT-Mes­sa­ge wir an das Topic

cmnd/broadlink/status0

Die Pay­load ist dabei nicht rele­vant; sie kann leer blei­ben. Ant­wort erhal­ten wir, wenn wir das Topic

stat/broadlink/STATUS

abon­nie­ren. Sie soll­te 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
 }
}

Die­se Abfra­ge kann man spä­ter in einer Appli­ka­ti­on ver­wen­den, um zu prü­fen, ob die Infra­rot-Bridge online ist.

Die IR-Kom­man­dos

Jedes Inf­arot-Kom­man­do besteht aus einer Fol­ge von Blink­mus­tern der Infra­rot-Diode des Sen­ders, die Her­stel­ler- und Gerä­te­spe­zi­fisch auf­ge­baut ist. Tas­mo­ta kennt zwar die Kodie­rungs­ar­ten einer Viel­zahl von Her­stel­lern, aller­dings nicht von allen. Ob die eige­ne Fern­be­die­nung also zum Mit­spie­len zu bewe­gen ist, muss man ausprobieren.

Auch wenn ein Her­stel­ler grund­sätz­lich unter­stützt wird, muss man die Codes der ein­zel­nen Tas­ten ken­nen. Wenn man Glück hat, wur­den die Tas­ten­codes schon ein­mal von einem freund­li­chen Kol­le­gen (wie mir) ver­öf­fent­licht - dazu unten mehr. Im Nor­mal­fall muss man aber jede Tas­te anler­nen, was je nach Appli­ka­ti­on sehr müh­se­lig wer­den kann. Gut, wenn man etwas Node-Red Know-How hat.

Tas­ten anlernen

Die Tas­mo­ta-Soft­ware hört stän­dig am IR-Emp­fän­ger. Emp­fan­ge­ne Kom­man­dos mel­det sie mit einer MQTT-Mes­sa­ge an das Topic

tele/<topic>/RESULT

In unse­rem Fal­le abon­niert man also

tele/broadlink/RESULT

und war­tet auf emp­fan­ge­ne IR-Codes. Im Nor­mal­be­trieb wer­den die Codes an ande­re Gerä­te wei­ter­ge­lei­tet oder ein­fach igno­riert. Im Anlern­zu­stand spei­chern wir aber die emp­fan­ge­ne json-Struk­tur in einer Datei.

Benennt man die Datei­en mit den Namen der Fern­be­die­nungs-Tas­ten und spei­chert alle Datei­en eines Geräts in einem Ver­zeich­nis, erhält man eine hier­ar­chi­sche Struk­tur mit Tas­ten­codes. Ich habe als zusätz­liche Hier­ar­chie­stu­fe noch eine Gerä­te­klas­se (av, bd, cd, sat, tv) ein­ge­führt. Das gan­ze 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 die­ser Code-Datei­en kann man spä­ter an den IR-Sen­der schi­cken, um das Drü­cken der ent­spre­chen­den Tas­te zu simulieren.

Ein klei­ner Flow in node-red erle­digt das Anler­nen ganz bequem:

Der Kno­ten „lis­ten” wird 1 Sekun­de nach Start getrig­gert, löst die Stop-Tas­te aus und spei­chert den Inhalt der Ein­ga­be­fel­der im Kon­text­spei­cher. Jede spä­te­re Ände­rung der Ein­ga­be­fel­der wird eben­so in den Kon­text geschrieben.

Zum Start der Auf­nah­me wird der Kon­text-Wert „lis­ten” mit der Start-Tas­te auf true gesetzt und die Emp­fangs-LED zum Leuch­ten gebracht.

Trifft bei gestar­te­ter Auf­nah­me (listen==true) ein Daten­pa­ket des IR-Emp­fän­gers mit dem Topic „tele/broadlink/RESULT” über MQTT ein, wird es in der Ver­zeich­nis­hier­ar­chie ent­spre­chend der ein­ge­tra­ge­nen Namen abge­legt. Gleich­zei­tig wird die Emp­fangs-LED gelöscht und eine Erfolgs­mel­dung ausgegeben.

Zur Bedie­nung erhält das Node-Red-Dash­board eine ui-Grup­pe namens Anlernen:

In die 3 obe­ren Fel­der trägt man die Gerä­te­klas­se, den Gerä­te­na­men und die Bezeich­nung der zu ler­nen­den Tas­te ein. Der Start-Knopf ver­setzt den Flow in den Anlern­sta­tus, die Stop-Tas­te bricht ihn ohne Spei­chern ab, z.B. bei Fehl­ein­ga­ben. Die Emp­fangs-LED leuch­tet bei Empfangsbereitschaft.

Die Tas­ten einer Fern­be­die­nung las­sen sich mit einer ein­fa­chen Arbeits­fol­ge in weni­gen Minu­ten anlernen:

  1. Gerä­te­klas­se und Gerä­te­na­men eintragen
  2. Für jede Taste:
    • Tas­ten­be­zeich­nung eintragen
    • START drü­cken
      (Emp­fangs-LED leuchtet)
    • Tas­te der Fern­be­die­nung drü­cken
      (Emp­fangs-LED erlischt, Mel­dung wird angezeigt)
  3. Punkt 2 wie­der­ho­len, bis alle Tas­ten gespei­chert sind

Den Flow könnt ihr euch gern hier her­un­ter­la­den und als Grund­la­ge für eure Anwen­dung benutzen.

Tas­ten Senden

Das Sen­den ist mit den Vor­be­rei­tun­gen oben auch ganz ein­fach. Der fol­gen­de klei­ne Flow zeigt das Prinzip:

Der Dash­board-But­ton links sen­det den Namen der Tas­te, wie er auch im Datei­na­men ver­wen­det wur­de, also z.B. „power”. Für jede Fern­be­die­nungs­tas­te gibt es einen die­ser Buttons.

Die Funk­ti­on ergänzt den Namen um das Ver­zeich­nis, hier also z.B. „remote/tv/sony/”. Die­se Funk­ti­on exis­tiert ein mal pro Gerät; alle Tas­ten des Geräts sind mit dem Funk­ti­ons­ein­gang verbunden.

Der Datei-Kno­ten liest die Datei mit dem eben zusam­men­ge­bas­tel­ten Namen aus und sen­det den Inhalt an das MQTT-Topic „cmnd/broadlink/irsend”. Den Rest über­neh­men der MQTT-Bro­ker, Tas­mo­ta und der Wemos mit den Sen­de­di­oden des Broadlink.

Auch die­ses Bei­spiel könnt ihr gern hier her­un­ter­la­den.

Biblio­thek der IR-Codes

Um euch das Leben noch etwas ein­fa­cher zu machen, ver­öf­fent­li­che ich hier die Datei­en mit den ange­lern­ten Tas­ten­codes mei­ner Fern­be­die­nun­gen in dem For­mat, wie ihr es direkt an einen IR-Sen­der mit Tas­mo­ta-Firm­ware schi­cken könnt.

Jede Datei ent­hält ein Ver­zeich­nis mit den Datei­en für alle Tas­ten, ein­ge­packt im zip-Fomat.

Sony

  • TV KDL 46W5800
    (Fern­be­die­nung RM-ED016)
  • BD-Play­er BDP-S350
    (Fern­be­die­nung RMT-B102P)

Tech­nics

  • AV-Recei­ver SA-GX350
    (Fern­be­die­nung RAK-SA009XH)
  • CD-Play­er SL-PG500A
    • Fern­be­die­nung EUR64798
      („nor­ma­le” Fernbedienung)
    • Fern­be­die­nung EUR643900
      (Mini-Fern­be­die­nung)

Kath­rein

Wenn ihr eige­ne Tas­ten­codes auf­ge­nom­men habt. könnt ihr sie gern im glei­chen For­mat an mich schi­cken, und ich ver­öf­fent­li­che sie hier. So kann dann Stück für Stück eine Biblio­thek der Tas­mo­ta-Infra­rot-Codes entstehen.

Veröffentlicht am
Kategorisiert in SmartHome

Ein Kommentar

  1. Hel­lo
    Super Arti­kel! Dan­ke für das! - Habe einen ESP32 dran gemacht, hat bes­tens funk­tio­niert. NB. die default Tas­mo­ta ESP32 Bina­ry hat IR pins nicht ansteu­ern kön­nen, aber ein OTA Update hat geholfen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

elf − vier =