![Universalfernbedienung (Raspberry Pi) Universalfernbedienung (Raspberry Pi)](https://www.spech.de/2015/04/universalfernbedienung-raspberry-pi/foto_2_0_hu8605003620386575764.jpg)
Universalfernbedienung (Raspberry Pi)
27.04.2015, 02.01.2020 - Sebastian Pech - ~6 Minuten
In meinem letzten Eintrag zum Thema Universalfernbedienung wurde das Thema mit dem Arduino umgesetzt. Eine Einbindung in Fhem zur Haussteuerung wird dadurch erschwert, dass eine Kommunikation zwischen den Geräten stattfinden muss. Anstelle eines umfangreichen Protokolls für die Datenkommunikation wird die Universalfernbedienung direkt mit dem Raspberry Pi umgesetzt. Im Gegensatz zum Arduino werden die GPIO Ports leider nur mit 3,3V betrieben anstelle von 5V.
Hardware
Die Hardware wird ähnlich wie bei dem Arduino direkt an die GPIO Ports angeschlossen. Hierbei ist die unterschiedliche Belegung der Ports bei den Raspberry Pi Modelle zu beachten. In diesem Artikel ist der Anschluss GPIO PIN 22 für den IR Empfänger und der GPIO PIN 23 für den IR Sender vorgesehen.
LIRC
Anstelle einer kleinen Bibliothek für die IR Erkennung und das Senden wird LIRC eingesetzt. „LIRC ist die Abkürzung für Linux Infrared Remote Control. Es handelt sich dabei um ein Programm für Linux, mit dessen Hilfe man Befehle von IR-Fernbedienungen in Programmbefehle umsetzen kann. Nötig ist dafür lediglich ein Infrarot-Empfänger. […] Um die Signale von Fernbedienungen korrekt zu decodieren, benötigt man eine Konfigurationsdatei, die auf die jeweilige Fernbedienung abgestimmt ist. Man kann diese entweder selbst erzeugen, oder eine passende Datei aus dem Internet herunterladen.“ (Quelle: Wikipedia )
Zur Installation und Einrichtung auf dem Raspberry Pi gibt es einen interessanten Artikel der für die folgenden Aufrufe als Basis dient. Die Installation von LIRC erfolgt dabei einfach mittels apt-get.
$ sudo apt-get install lirc
Um die benötigten Module per Hand zu laden und diese zu testen gibt es den Befehl modprobe. Bei dem lirc_rpi ist die korrekte Belegung der GPIO Ports zu beachten!
$ sudo modprobe lirc_dev
$ sudo modprobe lirc_rpi gpio_in_pin=22 gpio_out_pin=23
UPDATE: 27.04.2015: Ab sofort wird das Modul nicht mehr über /etc/modules gelanden sondern über /boot/config.txt
$ sudo vi /boot/config.txt
dtoverlay=lirc-rpi,gpio_out_pin=23,gpio_in_pin=22
Damit die Module beim Start geladen werden, müssen diese in die modules Datei eingetragen werden.
$ sudo vi /etc/modules
lirc_dev
lirc_rpi gpio_in_pin=22 gpio_out_pin=23
Das lirc Device kann mittels ls im dev Verzeichnis ermittelt werden.
$ ls -l /dev/lir*
crw-rw---T 1 root video 248, 0 Jan 5 12:16 /dev/lirc0
In der Config Datei von LIRC müssen das Device und die Module eingetragen werden.
$ sudo vi /etc/lirc/hardware.conf
# -u --uinput generate Linux input events
LIRCD_ARGS="--uinput"
DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"
Neustarten des Daemon.
$ sudo /etc/init.d/lirc restart
Empfänger testen
Der Empfänger kann auf seine Grundlegende Funktionalität geprüft werden indem der LIRC Daemon gestommt wird und mittels mode2 die RAW Ausgabe von dem Device angeschaut wird. Beim Drücken von beliebigen Tasten auf einer IR Fernbedienung sollten abwechselnd space und pule Einträge erscheinen.
$ sudo /etc/init.d/lirc stop
$ mode2 -d /dev/lirc0
space 1622
pulse 667
space 1573
pulse 675
Sender testen
Die initiale lircd.conf ist leer. Es können entweder bestehende Konfigurationsdateien genutzt werden, sofern es welche für die Fernbedienung gibt, oder eigene aufgenommen werden.
$ cat /etc/lirc/lircd.conf
Bestehende Konfigurationsdatei
In dem Sourceforce Remote Projekt sind viele Fernbedienungen bereits erfasst. Außerdem liefert LIRC eigene Dateien mit.
$ ls /usr/share/lirc/remotes/
Bei der YAMAHA RAX9 Fernbedienung gibt es bereits eine Datei in dem Projekt.
$ mkdir lirc
$ cd lirc
$ wget http://lirc.sourceforge.net/remotes/yamaha/RAX9
$ sudo cp RAX9 /etc/lirc/lircd.conf
Mit dem Programm irw können die Eingaben der Fernbedienung gelesen werden.
$ irw
000000005ea158a7 03 vol+ rax9
000000005ea1e817 00 aux rax9
Sollte dort keine Ausgabe erscheinen kann der Daemon testweise im Vordergrund gestartet werden. Eventuell werden hier Fehler oder Warnungen angezeigt.
$ sudo /etc/init.d/lirc stop
$ sudo lircd --nodaemon -H devinput
Das Senden erfolgt mittels irsend.
$ irsend SEND_ONCE rax9 aux
Eigene Konfigurationsdatei erstellen
Der Daemon wird gestoppt und mit den Programm irrecord wird eine eigene Datei pro Fernbedienung aufgenommen.
$ sudo /etc/init.d/lirc stop
Für die SAMSUNG – AA59-00743A Fernbedienung wäre ein möglicher Aufruf wie folgt.
$ sudo irrecord -H default -d /dev/lirc0 AA59-00743A
Das Programm führt den Benutzer durch den Prozess der Aufnahme. Die Liste der Keycodes hilft bei der korrekt Zuordnung. Nach dem Aufnehmen wird die generierte Datei als neue /etc/lirc/lircd.conf kopiert und der Daemon neugestartet. Mittels irw können wie oben beschrieben die gedrückten Tasten ermittelt werden.
$ sudo cp AA59-00743A.conf /etc/lirc/lircd.conf
$ sudo /etc/init.d/lirc restart
$ irw
00000000e0e040bf 00 KEY_POWER Samsung_AA59-00743A
$ irsend SEND_ONCE Samsung_AA59-00743A KEY_POWER
Das gleiche wird für alle anderen Fernbedienung durchgeführt (Hier die LG – AKB73615701).
sudo irrecord -H default -d /dev/lirc0 AKB73615701
Am Ende werden alle Konfigurationsdateien in einer Datei zusammengefasst und als neue lircd.conf genutzt.
$ cat *.conf > lircd.conf
$ sudo cp lircd.conf /etc/lirc/lircd.conf
oder
cat AKB73615701.conf AA59-00743A.conf RAX9 > lircd.conf
sudo cp lircd.conf /etc/lirc/lircd.conf
FHEM Einbindung
Mit dem Modul Remotcontrol kann ein Floorplan erstellt werden. Auf dem Floorplan werden alle Tasten hinterlegt. Die Samsung Fernbedienung könnte wie folgt definiert werden.
define RC_TV remotecontrol
attr RC_TV rc_iconpath icons/remotecontrol
attr RC_TV rc_iconprefix black_btn_
attr RC_TV room 1.0_Wohnzimmer
attr RC_TV row00 KEY_POWER:POWEROFF,:blank,KEY_SELECT:SOURCE
attr RC_TV row02 :blank,:blank,:blank
attr RC_TV row03 KEY_1:1,KEY_2:2,KEY_3:3
attr RC_TV row04 KEY_4:4,KEY_5:5,KEY_6:6
attr RC_TV row05 KEY_7:7,KEY_8:8,KEY_9:9
attr RC_TV row06 :blank,KEY_0:0,KEY_REWIND:PRECH
attr RC_TV row07 :blank,:blank,:blank
attr RC_TV row08 KEY_VOLUMEUP:UP,KEY_MUTE:MUTE,KEY_CHANNELUP:CHUP
attr RC_TV row09 KEY_VOLUMEDOWN:DOWN,:blank,KEY_CHANNELDOWN:CHDOWN
attr RC_TV row10 KEY_MENU:MENU,:blank,KEY_PROGRAM:GUIDE
attr RC_TV row11 :blank,:blank,:blank
attr RC_TV row12 :blank,KEY_UP:UP,KEY_INFO:INFO
attr RC_TV row13 KEY_LEFT:LEFT,KEY_ENTER:ENTER,KEY_RIGHT:RIGHT
attr RC_TV row14 :blank,KEY_DOWN:DOWN,KEY_EXIT:EXIT
define NRC_TV notify RC_TV {system("irsend SEND_ONCE Samsung_AA59-00743A $EVENT")}
Die Werte rc_iconpath und rc_iconprefix definieren den Pfad für die Bilder. Mittels rowXX werden die Zeilen mit den Buttons definiert. Jeder Button wird dabei hinterlegt mittels EVENT:IMAGE. Das notify behandelt das anklicken der Buttons und sendet den EVENT an irsend.
Beispiele der generierten Dateien
# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.9.0-pre1(default) on Sun Jan 5 13:37:55 2014
#
# contributed by
#
# brand: Samsung_AA59-00743A
# model no. of remote control:
# devices being controlled by this remote:
#
begin remote
name Samsung_AA59-00743A
bits 16
flags SPACE_ENC|CONST_LENGTH
eps 30
aeps 100
header 4532 4449
one 595 1635
zero 595 520
ptrail 597
pre_data_bits 16
pre_data 0xE0E0
gap 107492
toggle_bit_mask 0x0
begin codes
KEY_NEXT 0x12ED
KEY_POWER 0x40BF
KEY_1 0x20DF
KEY_2 0xA05F
KEY_3 0x609F
KEY_4 0x10EF
KEY_5 0x906F
KEY_6 0x50AF
KEY_7 0x30CF
KEY_8 0xB04F
KEY_9 0x708F
KEY_0 0x8877
KEY_SELECT 0x807F
KEY_VOLUMEDOWN 0xD02F
KEY_VOLUMEUP 0xE01F
KEY_CHANNELDOWN 0x08F7
KEY_CHANNELUP 0x48B7
KEY_MENU 0x58A7
KEY_PROGRAM 0xF20D
KEY_INFO 0xF807
KEY_ENTER 0x16E9
KEY_EXIT 0xB44B
KEY_REWIND 0x1AE5
KEY_MUTE 0xF00F
KEY_LEFT 0xA659
KEY_RIGHT 0x46B9
KEY_UP 0x06F9
KEY_DOWN 0x8679
end codes
end remote
VORLÄUFIGE LG Datei! (Keys fehlen!)
# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.9.0-pre1(default) on Sun Jan 5 14:24:26 2014
#
# contributed by
# Sebastian Pech - www.spech.de
# brand: LG
# model no. of remote control: AKB73615701
# devices being controlled by this remote:
#
begin remote
name LG_AKB73615701
bits 16
flags SPACE_ENC|CONST_LENGTH|REPEAT_HEADER
eps 30
aeps 100
header 4525 4429
one 605 1625
zero 605 509
ptrail 604
repeat 600 511
pre_data_bits 16
pre_data 0xB4B4
gap 107515
toggle_bit_mask 0x0
begin codes
KEY_POWER 0x0CF3
KEY_1 0xDC23
KEY_FASTFORWARD 0x2CD3
KEY_FORWARD 0xCC33
KEY_REWIND 0xAC53
KEY_PREVIOUS 0x4CB3
KEY_NEXT 0xCC33
KEY_TITLE 0x52AD
KEY_MENU 0x5CA3
KEY_HOME 0xE619
KEY_UP 0xE21D
KEY_DOWN 0x12ED
KEY_LEFT 0x9A65
KEY_RIGHT 0x5AA5
KEY_ENTER 0x1AE5
KEY_BACK 0xA25D
KEY_SUBTITLE 0x0AF5
KEY_TITLE 0xD22D
end codes
end remote
Probleme
Gibt es in der Zeile 1 der lircd.conf den Eintrag #UNCONFIGURED muss dieser gelöscht werden. Andernfalls erscheint die folgende Meldung beim Start.
$ sudo /etc/init.d/lirc restart
[ ok ] Reconfigure LIRC or manually replace /etc/lirc/lircd.conf to enable..