Universalfernbedienung (Raspberry Pi)

Lesedauer ~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..