Lirc
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Dieser Artikel ist mit keiner aktuell unterstützten Ubuntu-Version getestet! Bitte teste diesen Artikel für eine Ubuntu-Version, welche aktuell unterstützt wird. Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Artikel für fortgeschrittene Anwender
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
- Installation
- Einrichten von LIRC und der Fernbedienung
- Tasten mit Funktionen belegen
- Problemlösungen
- Doppeltes Ausführen von Befehlen
- Wechselndes "eventX"
- Fehlerhafte Tastenerkennung bei dvb-usb-dib0700-1.xx.fw
- Fehler beim Laden des lirc_serial-Moduls
- irw und mode2 geben keine Ausgabe
- irw gibt keine Ausgabe bei einer mit irrecord selbst erstellten lircd.conf
- /dev/lirc existiert nicht
- RAW-Modus
- USB IR / IgorUSB
- Reaktionszeit verringern
- irexec / irw "No such file or directory"
- Links
Mit LIRC (Linux Infrared Remote Control) ist es möglich, das Linux-System mit einer Fernbedienung zu steuern. Dazu sind ein Infrarot-Empfänger am PC und eine handelsübliche Fernbedienung nötig. Auch wenn der Name es nicht vermuten lässt: Auch Funkfernsteuerungen werden unterstützt. Weitere Informationen zu LIRC sind auf der offiziellen LIRC-Homepage 🇬🇧 und in den Links am Ende dieses Artikels zu finden.
Installation¶
LIRC kann direkt aus den Paketquellen installiert[1] werden:
lirc (universe)
lirc-x (universe, optional )
liblircclient0 (universe, optional, um bestimmte Programme steuern zu können)
inputlirc (universe, optional, liest automatisch die Eingaben aller /dev/input/eventX-Geräte aus; etliche Geräte funktionieren damit "Out-of-the-Box".)
Befehl zum Installieren der Pakete:
sudo apt-get install lirc lirc-x liblircclient0 inputlirc
Oder mit apturl installieren, Link: apt://lirc,lirc-x,liblircclient0,inputlirc
Bei der Installation von lirc wird abgefragt, welche Fernbedienung und welcher Sender (Transmitter
) verwendet werden sollen. Die Angabe des Transmitters ist allerdings nur in dem seltenen Falle notwendig, wenn via Computer ein weiteres Gerät (Stereo-Anlage, CD-Player etc.) gesteuert werden soll. Falls die eigene Fernbedienung/Sender nicht aufgeführt sind, dort None
auswählen; z.B. auch dann, wenn inputlirc zum Einsatz kommen soll.
Falls falsche Eingaben gemacht wurden, kann die ganze Prozedur im Terminal[2] mit
sudo dpkg-reconfigure lirc
erneut durchgeführt werden.
Ggf. kann für die Fernbedienung (z.B. für etliche Fernbedienungen, die zu USB-Sticks gehören) auch der Eintrag Linux Input Layer (dev/input/eventX)
verwendet werden. Im nächstfolgenden Dialog dann das verwendete Gerät (Device
) eintragen (unter neueren Lirc-Versionen auch direkt auswählbar). Dieses kann mit dem Befehl
cat /proc/bus/input/devices
in Erfahrung gebracht werden, aus dem Eintrag geht das verwendete Gerät hervor, z.B.
I: Bus=0003 Vendor=0000 Product=0000 Version=0000 N: Name="em2880/em2870 remote control" P: Phys=USB S: Sysfs=/devices/virtual/input/input6 U: Uniq= H: Handlers=kbd event6 B: EV=100003 B: KEY=4afc334 0000000 0 0 0 0 0000 1a0 c0000801 9e96c0 0 0 ffd
In diesem Falle müsste, ersichtlich aus Zeile H: Handlers=kbd event6
, als Gerät /dev/input/event6
ausgewählt werden.
Einrichten von LIRC und der Fernbedienung¶
Um LIRC einzurichten gibt es zwei Möglichkeiten (funktionieren nicht gleichzeitig; entweder inputlirc oder die (manuelle) Einrichtung):
Verwenden von 'inputlirc'
(Manuelle) Einrichtung der hardware.conf und der lircd.conf
Wichtig: Bei Verwendung der manuellen Einrichtung sollte zunächst inputlirc deinstalliert werden, da die manuelle Konfiguration ansonsten von der automatischen Einrichtung durch inputlirc bei jedem Neustart des Systems überschrieben wird.
Verwenden von 'inputlirc'¶
inputlirc liest standardmäßig alle Impulse aller /dev/input/event*-Geräte aus. Dabei wird auf die Tastenbelegung zurückgegriffen, die auch der Kernel verwendet (definiert in /usr/include/linux/input.h). Damit erübrigt sich für viele USB-Fernbedienungen und sogenannte HID-Geräte (Human Interface Devices, z.B. Fernbedienungen mit integriertem Joystick oder Trackball etc.) eine aufwändige LIRC-Konfiguration, da die Impulse ohne weitere Arbeiten erkannt werden. Weder in der hardware.conf noch in der lircd.conf brauchen spezielle Angaben gemacht zu werden (bei der Installation von LIRC einfach überall "None" angeben; das Paket lirc selbst wird allerdings gebraucht, schon um z.B. irexec oder irw
verwenden zu können). Der LIRC-daemon (lircd) wird nicht benötigt; ggf. darauf achten, dass in der hardware.conf die Werte für START_LIRCD=""
auf false
gesetzt sind. Der inputlirc-Daemon inputlircd
wird automatisch beim Systemstart ausgeführt.
Funktionstest für inputlirc¶
Bei einem Test sollte für die Tasten bei der Verwendung von irw im Terminal z.B.
66 0 KEY_HOME event6 8b 0 KEY_MENU event6 2 0 KEY_1 event6
ausgegeben werden; die Tastennamen (die dritte Variable der Ausgabe, also z.B. KEY_HOME
] können dann in einer .lircrc verwendet werden.
Falls gar keine Ausgabe erfolgt, oder falls es Probleme gibt, die Nummerntasten zu verwenden (nur für diese keine Ausgabe bei irw
) hilft es, in einem Editor[3] mit Rootrechten in der /etc/default/inputlirc-Datei folgende Optionen festzulegen:
1 2 3 | # Options to be passed to inputlirc. EVENTS="/dev/input/event*" OPTIONS="-g -m 0" |
Die Option -g
ist mit Vorsicht zu verwenden; sie führt dazu, dass nur noch inputlirc auf die Impulse der festgelegten Geräte reagiert. Daher nur bei festgelegten events
(s.u.) nutzen, sonst fällt ggf. Maus und Tastatur aus! (Die weiter unten beschriebene Anpassung von lirc.fdi sollte damit hinfällig werden). -m 0
sorgt dafür, dass alle Tasten erkannt werden; Standard ist, dass die Tasten unterhalb der Wertes 88
(das sind die der "Standard-Tastatur") nicht ausgelesen werden. Weiteres zu den verwendbaren Optionen in der man-Page (Befehl man inputlircd
).
In /etc/default/inputlirc kann (bei Verwendung der "-g"
-Option muss!) auch festgelegt werden, welche events
inputlirc tatsächlich auslesen soll; dazu "*" durch das gewünschte event
ersetzen, oder auch mehrere events
angeben (z.B. EVENTS="/dev/input/event4, /dev/input/event5"
), ansonsten kann es zu Problemen z.B. mit Maus und Keyboard kommen, weil deren Eingaben dann nur noch von inputlirc ausgelesen werden. Ggf. lässt sich dort auch etwas wie /dev/input/by-path/pci-5-2--event-ir
festlegen (siehe dazu auch hier). Die Angaben werden erst nach einem Neustart von inputlirc wirksam:
sudo systemctl restart inputlirc.service
Zur Verwendung der Fernbedienung ist allerdings eine funktionsfähige .lircrc-Datei nötig.
"Manuelle" Einrichtung¶
hardware.conf einrichten¶
Nach der Installation müssen die LIRC-Module geladen[5] und der passende Treiber verwendet werden. Welche Module, und welcher Treiber, benötigt werden, hängt von der verwendeten Hardware ab. Eine umfangreiche Liste findet sich hier 🇬🇧. Sie werden automatisch beim Systemstart geladen, wenn die richtigen Werte in die hardware.conf eingetragen sind. Wenn schon bei der Installation die passenden Angaben gemacht wurden, sind diese bereits in der Datei gespeichert. Sie befindet sich in /etc/lirc, in ihr können auch weitere Parameter festgelegt werden, die der LIRC-Daemon dann bei jedem Start verwendet. Welche davon zwingend benötigt werden und welche nicht, variiert je nach verwendeter Hardware. Bei Unsicherheiten kann man den jeweiligen Eintrag vorerst leer lassen. Alle Parameter werden zwischen den beiden " " eingetragen. Zeilen, die mit einer #
beginnen, sind Kommentare.
Bestandteile der hardware.conf | |
Zeile | Erklärung |
LIRCD_ARGS | Parameter die lircd bei jedem Start ausführt. |
START_LIRCMD | Der LIRC mouse daemon ermöglicht es, den Mauszeiger über die Fernbedienung zu steuern. Soll lircmd beim Start von lircd geladen werden, muss die Zeile einkommentiert und auf true gesetzt werden. |
LOAD_MODULES | Bei true versucht lircd selbstständig ein passendes Modul für die verwendete Hardware zu laden. |
DRIVER | Wählt einen Treiber aus. Wenn die Fernbedienung über /dev/input/"irgendwas" angesprochen wird, sollte hier "devinput " eingetragen werden. Eine Liste weiterer Treiber findet man mittels "lircd --driver=help " |
DEVICE | Über welches Device die Fernbedienung angesprochen wird, z.B. /dev/input/eventX. |
MODULES | Gibt an, welches Kernelmodul[5] lircd laden soll. |
LIRCD_CONF | Hier kann ein individueller Pfad zur lircd.conf angegeben werden. Standard ist ~/.lircd.conf. |
LIRCMD_CONF | Hier kann ein individueller Pfad zur lircmd.conf angegeben werden. Standard ist ~/.lircmd.conf. |
Ab lirc-0.8.3 wird außerdem zwischen den Einträgen für die Fernbedienung (REMOTE
) und Sender (TRANSMITTER
, nur benötigt, wenn IR-Signale von einem tatsächlich vorhandenen Sender an andere Geräte weitergesendet werden sollen, siehe irsend 🇬🇧 ) unterschieden; eine für Linux input layer (/dev/input/eventX)
und das Gerät /dev/input/event6
von lirc-0.8.3 automatisch erstellte hardware.conf sieht so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | # /etc/lirc/hardware.conf # #Chosen Remote Control REMOTE="Linux input layer (/dev/input/eventX)" REMOTE_MODULES="" REMOTE_DRIVER="devinput" REMOTE_DEVICE="/dev/input/event6" REMOTE_LIRCD_CONF="generic/devinput.conf" REMOTE_LIRCD_ARGS="" #Chosen IR Transmitter TRANSMITTER="None" TRANSMITTER_MODULES="" TRANSMITTER_DRIVER="" TRANSMITTER_DEVICE="" TRANSMITTER_LIRCD_CONF="" TRANSMITTER_LIRCD_ARGS="" #Enable lircd START_LIRCD="true" #Don't start lircmd even if there seems to be a good config file #START_LIRCMD="false" #Try to load appropriate kernel modules LOAD_MODULES="true" # Default configuration files for your hardware if any LIRCMD_CONF="" #Forcing noninteractive reconfiguration #If lirc is to be reconfigured by an external application #that doesn't have a debconf frontend available, the noninteractive #frontend can be invoked and set to parse REMOTE and TRANSMITTER #It will then populate all other variables without any user input #If you would like to configure lirc via standard methods, be sure #to leave this set to "false" FORCE_NONINTERACTIVE_RECONFIGURATION="false" START_LIRCMD="" |
lircd.conf einrichten¶
Fernbedienungscodes | |
Modell | Download |
TS35 DVB-T Technisat Airstar 2 | lircd.conf |
Terratec Cinergy Hybrid T USB XS | lircd.conf |
Bei jedem Tastendruck wird ein Zahlen-Buchstaben-Code an den Rechner gesendet (Bsp. 0x0067
). Die lircd.conf stellt einen für Menschen nachvollziehbaren Zusammenhang zwischen den gesendeten Codes und den entsprechenden Tasten auf der Fernbedienung her. Ggf. wird bei der Installation bereits eine passende Konfiguration erstellt; z.T. sind sie unter /usr/share/lirc/remotes/ bereits vorhanden und werden in der automatisch erstellten lircd.conf einfach per include
aufgerufen. Als Beispiel dafür wieder eine automatisch erstellte lircd.conf für Linux Input Layer
, Gerät /dev/input/event6
, die eigentlich nur aus dieser einen include
-Zeile besteht:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #This configuration has been automatically generated via #the Ubuntu LIRC package maintainer scripts. # #It includes the default configuration for the remote and/or #transmitter that you have selected during package installation. # #Feel free to add any custom remotes to the configuration #via additional include directives or below the existing #Ubuntu include directives from your selected remote and/or #transmitter. #Configuration for the Linux input layer (/dev/input/eventX) remote: include /usr/share/lirc/remotes/generic/devinput.conf |
Vorgefertigte lircd.conf-Dateien findet man ggf. unter lirc.sourceforge.net 🇬🇧, die dann mit Root-Rechten nach /etc/lirc kopiert werden müssen. Falls keine passende vorhanden ist (oder man sich unsicher ist), kann mit irrecord
sehr einfach eine eigene lircd.conf erstellt werden. irrecord
benötigt den verwendeten Treiber, das verwendete Device
, einen Speicherort für die lircd.conf und Root-Rechte:
sudo irrecord -H <Treibername> -d /dev/<das_ermittelte_device> /pfad/zur/lircd.conf
Danach die Anweisungen befolgen und die Datei unter /etc/lirc/lircd.conf abspeichern (Root-Rechte nötig). Ab Version 0.8.6 sind standardmäßig nur noch bestimmte Tastennamen vorgesehen, sie lassen sich mit dem Befehl irrecord -l
auflisten.
Funktionstest der Konfiguration¶
Nach einem Neustart von lircd
und irw
mit
sudo systemctl restart lirc.service irw
kann getestet werden, ob LIRC die Signale der Fernbedienung erkennt. Die Ausgabe sieht beispielsweise wie folgt aus:
0000000000000000 00 KEY_UP lircd.conf 0000000000000000 00 KEY_DOWN lircd.conf
Es erscheinen u.a. die in der lircd.conf hinterlegten Tastennamen (KEY_UP
, KEY_DOWN
), die dann für die .lircrc verwendet werden können. Ggf. erscheinen bei jedem Tastendruck zwei oder mehr Ausgaben; eigentlich sollte das keine Probleme verursachen, da in der Standardeinstellung Wiederholungen zunächst ignoriert werden. Falls aber die Befehle auch im Normalbetrieb doppelt ausgeführt werden, wie in Doppeltes Ausführen von Befehlen angegeben verfahren.
Falls keine Ausgabe erfolgt, kann ein erweiterter Test aufschlussreich sein. Dazu wird LIRC mit folgendem Befehl gestartet
sudo lircd --nodaemon -H devinput -d /dev/input/event6
wobei die Parameter -H
(driver) und -d
(device) der eigenen Konfiguration angepasst werden müssen.
Ggf. muss zuvor ein laufendes lircd
z.B. mit
sudo systemctl stop lirc.service
beendet werden.
In einem weiteren Terminal kann jetzt irw
aufgerufen werden; wenn alles funktioniert, wird für jede Taste der Fernbedienung etwas wie oben beschrieben ausgegeben.
⚓︎
Falls allerdings, bei Verwendung des "devinput
"-Treibers gelegentlich der Fall, im ersten Terminal jetzt eine Meldung wie
lircd-0.8.3[8085]: can't get exclusive access to events comming from `/dev/input/event6' interface
erscheint, muss die Datei /usr/share/hal/fdi/preprobe/20thirdparty/lirc.fdi (existiert erst seit Version 0.8.3!) in einem Editor[3] so angepasst werden, dass dort die eigene Fernbedienung (aus der "cat /proc/bus/input/devices
"-Ausgabe ersichtlich) statt des dort angegebenen Strings "saa7134
" in der Zeile
1 | <match key="info.product" contains_ncase="saa7134"> |
eingetragen wird. Für die LIRC-Version > 0.8.4a müssen ggf. auch alle weiteren Einträge entfernt werden; damit steht dann in der lirc.fdi nur noch:
1 2 3 4 5 6 7 8 9 | <?xml version="1.0" encoding="UTF-8"?> <deviceinfo version="0.2"> <device> <match key="info.product" contains_ncase="Eigene Fernbedienung"> <merge key="info.ignore" type="bool">true</merge> </match> </device> </deviceinfo> |
Danach müssen HAL und der XServer neu gestartet werden:
sudo /etc/init.d/hal restart sudo /etc/init.d/gdm restart
Im Zweifelsfall den Rechner neu booten. Ein Neustart von LIRC alleine reicht nicht aus!
Falls irw
auch dann keine Ergebnisse liefert, ist vermutlich keine passende lircd.conf-Datei vorhanden, oder es ist zuvor ein Fehler unterlaufen; ggf. wird aber auch die Fernbedienung nicht unterstützt (was eher unwahrscheinlich ist). Einige Empfänger können mit gleichzeitig installiertem inputlirc nicht betrieben werden, das Programm muss dann gestoppt und ggf. das Paket ganz deinstalliert werden.
Tasten mit Funktionen belegen¶
Jetzt müssen den Tasten der Fernbedienung die gewünschten Funktionen zugeordnet werden. Mit diesem umfangreichen Thema beschäftigt sich ein eigener Unterartikel.
Problemlösungen¶
Bei der Installation sollte es eigentlich keine allzu großen Schwierigkeiten geben. Da jedoch die Einrichtung sehr komplex ist, werden hier Lösungsansätze für eventuell auftretende Probleme vorgestellt.
Doppeltes Ausführen von Befehlen¶
Wenn bei einer Fernbedienung, die über den devinput
-Treiber läuft, beim Tastendruck der zugehörige Befehl doppelt ausgeführt wird, und auch nicht durch die Parameter repeat und delay beeinflussbar ist, hilft es, in der .lircd.conf den pre_data
-Wert auf
1 | pre_data 0x8001 |
zu setzen, und den toggle_bit_mask
-Wert zu löschen/auszukommentieren. Viele Fernbedienungen senden als Standard zweimal (teilweise auch häufiger) den Impuls der Taste, um sicherzustellen, dass er wirklich ankommt. Allerdings gibt es auch Fernbedienungen, die auf einen Tastendruck hin nicht mehrfach den identischen Impuls, sondern auch noch abwechselnd unterschiedliche Impulse senden, die sich aber meist nur in den "high order bit" am Anfang des gesendeten Codes unterscheiden. In einer, mit mit irrecord erstellten, lircd.conf für derartige Fernbedienungen findet sich ein Eintrag wie
1 | toggle_bit_mask 0x8000000 |
Dieser Filter führt dazu, dass die Impulse, z.B. von irw, doppelt ausgegeben werden.
Im Normalfall werden doppelte Befehle (wenn nicht explizit anders angegeben) von .lircrc ignoriert; allerdings werden durch diese toggle-bit-mask
gefilterten Impulse mit dem devinput
-Treiber nicht mehr als "identische", sondern als zwei unterschiedliche Befehle aufgefasst, und somit auch beide hintereinander ausgeführt (ein bekannter Bug in irrecord
). Das führt dazu, dass z.B. keine einzelnen Zahlen mehr eingegeben werden können, und Wechsel-Tasten sofort wieder in den Ausgangszustand zurückspringen. Abhilfe kann zum einen das Auskommentieren dieser Zeile schaffen (dann wird der zweite Impulse nicht mehr verarbeitet), allerdings lassen sich so noch keine Dauertastendrücke (wie z.B. zur Lautstärkeregelung wünschenswert) realisieren. Mit dem pre_data 0x8001
-Wert wirkt dann auch der zweite gesendete Impulse (der beim Loslassen der Taste generiert wird) nicht mehr, und die Impulse können bei längerem Druck wie erwünscht als Wiederholung erkannt werden.
Wechselndes "eventX"¶
Wenn es Probleme mit dem Ansprechen der Fernbedienung gibt, weil von Start zu Start (aufgrund unterschiedlicher Verwendung der USB-Anschlüsse o.ä.) unterschiedliche "events" ausgegeben werden, kann ggf. auch ein fester Wert in die hardware.conf eingetragen werden, unter dem dann die Fernbedienung immer erkannt werden sollte. Dazu mit
ls -l /dev/input/by-path/*
die Geräte nach Pfad-Angabe auflisten; das Ergebnis sieht in etwa so aus:
lrwxrwxrwx 1 root root 9 2009-02-22 13:16 /dev/input/by-path/pci-0000:00:10.1-usb-0:1:1.0-event-mouse -> ../event5 lrwxrwxrwx 1 root root 9 2009-02-22 13:16 /dev/input/by-path/pci-0000:00:10.1-usb-0:1:1.0-mouse -> ../mouse1 lrwxrwxrwx 1 root root 9 2009-02-22 13:16 /dev/input/by-path/pci-5-2--event-ir -> ../event7 lrwxrwxrwx 1 root root 9 2009-02-22 13:16 /dev/input/by-path/platform-i8042-serio-0-event-kbd -> ../event1 lrwxrwxrwx 1 root root 9 2009-02-22 13:16 /dev/input/by-path/platform-pcspkr-event-spkr -> ../event6
Der "event"-Wert, den man mit cat /proc/bus/input/devices
erhalten hat, mit dem entsprechenden Wert abgleichen (hier für die Fernbedienung pci-5-2--event-ir
als event7
) und den String in der /etc/lirc/hardware.conf eintragen, hier also z.B.
1 | REMOTE_DEVICE="/dev/input/by-path/pci-5-2--event-ir" |
statt
1 | REMOTE_DEVICE="/dev/input/event7" |
verwenden.
Das funktioniert allerdings nicht, wenn für den Receiver bei cat /proc/bus/input/devices
ein "virtuelles" Gerät angegeben wird, wie z.B. hier:
S: Sysfs=/devices/virtual/input/input6
Dann gibt es auch bei ls -l /dev/input/by-path/*
keine passende Ausgabe für das Gerät.
Eigene udev-Regel erstellen¶
Falls für die Fernbedienung keine Einträge in /dev/input/by-path/ zu finden sind, kann man versuchen, eine eigene udev-Regel anzulegen. Gleiches gilt auch für Fernbedienungen ("HID", Human Interface Devices), die sich als Maus und Tastatur mit gleichem Namen ins System einhängen. Das kann man daran erkennen, dass cat /proc/bus/input/devices
zwei Geräte mit gleichem Namen aufführt. Um eine udev-Regel zu verfassen muss mit cat /proc/bus/input/devices
der Name des oder der Fernbedienungen herausgefunden werden, z.B.:
CoI: Bus=0003 Vendor=05a4 Product=9881 Version=0110 -> N: Name="HID 05a4:9881" <- P: Phys=usb-0000:00:10.3-1/input0 S: Sysfs=/class/input/input11 U: Uniq= H: Handlers=kbd event7 B: EV=120013 B: KEY=e080ffdf 1cfffff ffffffff fffffffe B: MSC=10 B: LED=7 de
Mit diesem kann man in /etc/udev/rules.d/10-local.rules (muss ggf. angelegt werden; Root-Rechte werden benötigt) eine udev-Regel erstellen:
KERNEL=="event*",ATTRS{name}=="HID 05a4:9881",SYMLINK+="input/ir"
Der "*
" gibt an, dass alle events durchsucht werden sollen. Der Eintrag nach ATTRS{name}
gibt den Namen des Gerätes an und SYMLINK
erstellt einen Link auf das angegebene Verzeichnis. Mit diesem kann das Gerät dann auch von inputlirc angesprochen werden. Falls nun zwei Geräte für die Fernbedienung mit dem selben Namen bestehen, kann die udev-Regel auch mit den Phys
-Angaben erstellt werden:
CodeI: Bus=0003 Vendor=05a4 Product=9881 Version=0110 N: -> Name="HID 05a4:9881" <- P: -> Phys=usb-0000:00:10.3-1/input0 <- S: Sysfs=/class/input/input11 U: Uniq= H: Handlers=kbd event7 B: EV=120013 B: KEY=e080ffdf 1cfffff ffffffff fffffffe B: MSC=10 B: LED=7 I: Bus=0003 Vendor=05a4 Product=9881 Version=0110 N: -> Name="HID 05a4:9881"<- P: -> Phys=usb-0000:00:10.3-1/input1 <- S: Sysfs=/class/input/input12 U: Uniq= H: Handlers=kbd mouse1 event8 B: EV=17 B: KEY=1f0000 0 2020000 3878 d801d001 1e0000 0 0 0 B: REL=103 B: MSC=10
Die Regel würde dann folgendermaßen aussehen:
KERNEL=="event*",ATTRS{phys}=="usb-0000:00:10.3-1/input0",SYMLINK+="input/ira" KERNEL=="event*",ATTRS{phys}=="usb-0000:00:10.3-1/input1",SYMLINK+="input/irb"
Jedes Gerät wird nun zu einem eigenen Verzeichnis verlinkt. udev
muss nun noch neu gestartet werden mit einem Reboot oder:
sudo udevadm trigger
Hinweis:
sudo /etc/init.d/udev restart
startet nur den udev-Daemon neu, ohne einen neuen Link /dev/input/ir anzulegen.
Inputlirc kann sie nun folgendermaßen ansprechen:
/etc/default/inputlirc
# Options to be passed to inputlirc. EVENTS="/dev/input/ira /dev/input/irb" OPTIONS="-g -m 0"
Fehlerhafte Tastenerkennung bei dvb-usb-dib0700-1.xx.fw¶
Bei Receivern von Karten, die über die Firmware 🇬🇧 dvb-usb-dib0700-1.xx.fw betrieben werden (z.B. TerraTec Cinergy T USB XXS, Hauppauge WinTV-NOVA-T-500) kann es zu Fehl- bzw. Nicht-Erkennung von Impulsen der Fernbedienung kommen. Abhilfe kann folgender Eintrag in /etc/modprobe.d/options schaffen:
options dvb_usb_dib0700 dvb_usb_dib0700_ir_proto=0
Danach sollten die Impulse eindeutig erkannt werden können (siehe auch im Forum und Forum im Forum).
Hinweis:
Die weiteren Problemlösungen wurden noch nicht mit einer aktuellen Version von Lirc getestet. Sie könnten daher veraltet sein und nicht mehr funktionieren.
Fehler beim Laden des lirc_serial-Moduls¶
Falls beim Laden des lirc_serial
-Moduls ein Fehler auftritt, kann ggf. Folgendes Abhilfe schaffen:
sudo setserial /dev/ttyS0 uart none
Nummerierung in Linux und Windows:
/dev/ttyS* | |||
Schnittstelle | Linux Device | Windows Device | |
1 | /dev/ttyS0 | COM 1 | |
2 | /dev/ttyS1 | COM 2 |
Dauerhaft kann das in der Datei /var/lib/setserial/autoserial.conf festgelegt werden.
irw und mode2 geben keine Ausgabe¶
Falls irw
und mode2
keine Ausgabe ergeben, kann Folgendes hilfreich sein:
mode2 -d /dev/lirc0
Sollte es nun zu einer Ausgabe bei mode2
kommen, muss der lirc-Daemon mit dem Zusatz -d /dev/lirc0
gestartet werden. Das verwendete Gerät lässt sich aber auch in der hardware.conf festlegen.
irw gibt keine Ausgabe bei einer mit irrecord selbst erstellten lircd.conf¶
Wird für die eigene Fernbedienung keine passende Konfiguration mitgeliefert, kann nach obiger Anleitung mit irrecord
eine eigene Konfiguration erstellt werden. Es kann vorkommen, dass irw
mit einer so selbst erzeugten Konfiguration keine Ausgabe erzeugt, obwohl das Einlernen der Fernbedienung mit irrecord
funktioniert hat. Dies kann darauf zurückzuführen sein, dass die durch irrecord
erzeugte Konfiguration fehlerhaft ist und irrecord
in der erzeugten lircd.conf
zusätzlich zum Tastencode noch weitere Informationen hinterlegt. Eine solche Konfiguration sieht dann bspw. so aus:
[...] begin codes KEY_PAUSE 0x04000400000030 0x00000000000000 KEY_1 0x04000400000001 0x00000000000001 KEY_2 0x04000400000002 0x00000000000001 KEY_3 0x04000400000003 0x00000000000001 KEY_4 0x04000400000004 0x00000000000001 KEY_5 0x04000400000005 0x00000000000001 end codes [...]
In obigem Beispiel ist die zweite Hex-Zahl nach dem Tastencode entsprechend der Definition der lircd.conf falsch; eine solche falsche Zeile wird von lircd
ohne Fehler ignoriert. Löscht man die zweite Hex-Zahl (meist 0x0
oder 0x1
) in den Tastencode-Zeilen, funktioniert die Konfiguration meist ohne Probleme.
/dev/lirc existiert nicht¶
Falls das Gerät /dev/lirc nicht existiert, kann es helfen, einen Symlink auf /dev/lirc0 zu legen:
ln -s /dev/lirc0 /dev/lirc
Das löst das Problem allerdings nur temporär. Um langfristig eine Lösung zu haben, Folgendes durchführen:
sudo echo KERNEL="lirc0", SYMLINK="lirc" >> /etc/udev/udev.rules echo lirc_i2c | sudo tee -a /etc/modules
Eigentlich wäre der zweite Schritt nicht notwendig, da das Modul lirc_i2c
vom LIRC-Daemon geladen wird. Allerdings scheint es so zu sein, dass der Symlink erst nach dem Start des LIRC-Daemons angelegt wird. Daher muss das Modul erneut geladen werden.
RAW-Modus¶
Hin und wieder kommt es vor, dass eine Fernbedienung durch irrecord
nicht erkannt wird und zum Dekodieren der Signale der RAW-Modus zum Einsatz kommt. Leider ist diese Art der Dekodierung nicht nur hardwarehungrig, sondern auch äußerst unpräzise, wodurch es nicht selten zu unterschiedlichen Kommandos bei identischem Tastendruck kommt. Momentan ist auch keine erfolgversprechende Lösung bekannt, die über das doppelte Einlesen der Signale hinausgeht, abgesehen von der Neuanschaffung einer entsprechenden Hardware.
USB IR / IgorUSB¶
Neben den seriellen gibt es auch noch USB-Infrarotempfänger, wobei es aber leider häufig zu Problemen kommen kann. So werden USB-IR's von manchen Mainboards (z.B. Intel) erst dann erkannt, wenn man einen USB-Hub dazwischen schaltet.
Reaktionszeit verringern¶
Unter Umständen bemerkt man, dass das Navigieren durch Menü recht träge ist. Die kann an einer nicht zeitnahen Umsetzung schnell aufeinanderfolgender Tastendrücke liegen. Um das Problem in den Griff zu bekommen, muss man in der Datei lircd.conf mit den Parameter gap
und repeat_gap
etwas "spielen". Beispielwerte können aus dem nachfolgenden Codeblock entnommen werden:
gap 100000 repeat_gap 10
irexec / irw "No such file or directory"¶
Auch nach korrekter Installation und Konfiguration kann der Aufruf von irexec / irw fehlschlagen:
irexec
irexec: could not connect to socket irexec: No such file or directory
irw
connect: No such file or directory
Der Aufruf von irw unter Angabe des richtigen Sockets /dev/lircd funktioniert jedoch.
irw /dev/lircd
71 0 KEY_MUTE event4 71 0 KEY_MUTE event4 a8 0 KEY_REWIND event4 a8 0 KEY_REWIND event4 ...
Dem Programm irexec kann das richtige Socket nicht übergeben werden.
Das Problem besteht darin, dass die Programme irw und irexec auf die Datei /var/run/lirc/lircd zugreifen, welche nicht mehr angelegt wird. Der Paket-Maintainer hat das Standard-Socket von /var/run/lirc/lircd nach /dev/lircd verlegt, die Programme irw und irexec jedoch bisher nicht angepasst. Auch das Verzeichnis /var/run/lirc/ existiert dann i.d.R. nicht.
Das Verzeichnis und der Link auf das richtige Socket müssen dann angelegt werden:
sudo mkdir -p /var/run/lirc sudo ln -s /dev/lircd /var/run/lirc/lircd
Diese Lösung ist nicht persistent. Das Verzeichnis und der Link unter /var/run/ können aber bei jedem Systemstart[4] über eine Systemd-Unit angelegt werden.
mkdir -p /var/run/lirc/ && ln -s /dev/lircd /var/run/lirc/lircd
Links¶
intern¶
ir-keytable - Alternative zu LIRC
extern¶
Linux – XBMC aus Bereitschaftsmodus per MCE-Fernbedienung aufwecken 🇩🇪
HTPC – Media Center – Logitech Harmony reagiert träge unter Windows und Linux 🇩🇪
HowTo - Ubuntu – LIRC – XBMC mit PC-Funkfernbedienung X10 steuern 🇩🇪
HowTo - Ubuntu – LIRC Konfiguration mit MCE RC6 IR-Empfänger und einer Logitech Harmony 🇩🇪