Einstieg in LIRC mit inputlirc
Verfügt der Computer bzw. die Sound- oder DVB/TV-Karte über einen Infrarot-Empfänger, kann der Computer via Infrarot-Fernbedienung bedient werden, um zum Beispiel die Lautstärke und Medienplayer vom Sofa aus zu steuern.
Für die Verarbeitung der Infrarot-Signale der Fernbedienung ist unter Linux LIRC (Linux Infrared Remote Control) verantwortlich. Dies benötigt eine Konfigurationsdatei, die auf die jeweilige Fernbedienung abgestimmt sein muss.
Dieser Artikel zeigt eine einfache Lösung mit inputlirc auf, die alle Infrarot-Empfänger unterstützt, die als Human Interface Device (HID) implementiert sind. Diese Geräte vereinheitlichen die benötigte LIRC-Konfigurationsdatei, sodass immer die selben Tastencodes (definiert in der Linux-Quellcodedatei input.h) genutzt werden können.
Der Infrarot-Empfänger als Eingabegerät
Um den Computer mittels Fernbedienung bedienen zu können, müssen die Pakete inputlirc
, ir-keytable
und lirc
über die Paketverwaltung installiert werden.
Das Paket inputlirc
installiert den Daemon inputlircd. Dieser wird während des Bootvorgangs gestartet, nimmt die Ereignisse von sämtlichen Empfängern (/dev/input/eventN
) entgegen und übergibt sie an alle laufenden LIRC-Clientprogramme wie Medienplayer oder irexec aus dem Paket lirc
, damit diese entsprechend die Befehle ausführen.
Um eine Liste der verfügbaren Infrarot-Empfänger samt unterstützter Übertragungsprotokolle zu bekommen, wird das Programm ir-keytable ohne Kommandozeilenoptionen aufgerufen:
$ ir-keytable Found /sys/class/rc/rc2/ (/dev/input/event6) with: ...
Hier wurde das Eingabegerät /dev/input/event6
als Infrarot-Empfänger erkannt.
Wird auf der Fernbedienung nun eine Taste gedrückt, gibt der Empfänger nicht das empfangene Infrarot-Signal (»scancode« genannt), sondern einen definierten Tastencode an den LIRC-Deamon inputlircd weiter. Diese Abstraktion ermöglicht es u.a. für unterschiedliche Geräte der HID-Klasse, dieselbe Konfiguration zu verwenden. Der LIRC-Deamon inputlircd stößt dann über einen Unix Domain Socket (Pfad /var/run/lirc/lircd) die LIRC-Clientprogramme an, damit diese entsprechend des Tastencodes in der Konfigurationsdatei $HOME/.lircrc reagieren.
Tastencodes des Infrarot-Empfängers auslesen
In der sogenannte Übersetzungstabelle sind für die Scancodes die einheitlichen Tastencodes (Keycodes genannt) definiert. Mit folgendem Befehl wird die aktuell vom Empfänger verwendete Übersetzungstabelle ausgelesen:
$ ir-keytable --read ... scancode 0x0017 = KEY_CHANNELDOWN (0x193) scancode 0x0019 = KEY_CHANNELUP (0x192) scancode 0x004d = KEY_PLAYPAUSE (0xa4) ...
Der Empfänger reagiert nur auf die in der Übersetzungstabelle definierten Signale (»scancodes«, d.h. der Teil vor dem Gleichheitszeichen) und gibt den entsprechenden Tastencode (»keycode«, also der Teil nach dem Gleichheitszeichen) weiter.
Wurde zum Empfänger eine Fernbedienung mitgeliefert, zeigt die Tabelle eine Liste aller Tastencodes, die für die Konfiguration von inputlircd verwendet werden können. Andernfalls kann die Tabelle auch leer sein. Für viele Empfänger liegt die Konfiguration unter /lib/udev/rc_keymaps/.
Um zum Empfänger eine passende Fernbedienung zu finden, ist es wichtig, das Protokoll des Empfängers zu wissen. Es wird z.B. in der Ausgabe von ir-keytable --read
unter »Enabled protocols:« angezeigt.
$ ir-keytable --read | grep "^Enabled protocols:" Enabled protocols: NEC
Neben dem Protokoll NEC, gibt es noch andere Protokolle wie bspw. rc-5, rc-6 und weitere. Die wichtigsten Protokolle listet u.a. das Magazin ELVjournal auf.
Nach passender Fernbedienung suchen
Eine passende Fernbedienung zu finden, erfordert etwas Glück. Zuerst sucht man sich alle im Haushalt greifbaren Fernbedienung zusammen, schaut, auf welche der Empfänger reagiert und notiert sich die Scancodes der Tasten. Dazu öffnet man ein Terminal, startet den Befehl ir-keytable --test
und testet, ob bei einem Tastendruck auf der Fernbedienung ein Ereignis ausgelöst wird.
Hier ein Beispiel:
$ ir-keytable --test Testing events. Please, press CTRL-C to abort. 1385405182.689787: event MSC: scancode = 10ed09 1385405182.689793: event sync ... ^C
Hier wurde ein Ereignis mit dem (hexadezimalen) Scancode 10edf1
ausgelöst.
Werden keine Ereignisse ausgelöst, passen die Übertragungsprotokolle von Empfänger und Fernbedienung nicht zusammen. Hierauf ist beim Kauf einer Fernbedienung zu achten. Ggf. kann das verwendete Protokoll geändert werden. Hier sollte die Dokumentation zur Hardware weiterhelfen.
Um nun die Signale (Scancodes) der Fernbedienung mit dem Empfänger abzugleichen, muss dem Empfänger eine neue Übersetzungstabelle mit passenden Scancodes zugewiesen werden.
Für Fernbedienungen die zum Empfänger mitgeliefert wurden, entfällt dieser Schritt, da vom Hersteller eine Übersetzungstabelle mit passenden Scancodes bereits hinterlegt ist. Allenfalls die Tastencodes könnten angepasst werden.