Leider scheint es Probleme mit den aktuellen Treibern zu geben.
ich habe gestern versucht mein System zu aktualisieren.
Nach der Aktualisierung mit den Treibern nach Version 250816.183236 und den folgenden, blockiert der Sundtek-Treiber den Start / Neustart und das Herunterfahren.
Das gilt sowohl mit und ohne dem DVB-S/S2 Stick am Rechner, der Computer friert förmlich ein, ohne Fehlermeldung.
Ich habe durch ein downgradet auf Version 250816.183236 vorerst mein Problem behoben, wollte es jedoch an den Support weitergeben.
Zu meinem System:
Frisch aufgesetzt mit Linux Mint 22.3, Kernel 6.17.0.19-generic.
- Tvheadend 4.3-2374~g26ec161fb.
- Kodi 21.3 (21.3.0), Tvheadend HTSP Client Version 21.2.6
SkyTV Ultimate 6 2016/Q1 DVB-S/S2
Gute Nachrichten zur Fernsteuerung:
Fast Jeder kennt das Leiden mit lirc Kodi... Die Konfiguration ist extrem frustrierend.
Weniger ist mehr, dachte ich mir.
Ich hatte es einfach Satt, ständig in den verschiedenen Konfigurationsdateien zu editieren, ein Update später und alles ist wider dahin.
Meine Lösung dazu, ein kleines in python geschriebenes Script.
# ---------------------------- ir-control.py -------------------------------------------
#!/usr/bin/env python3
import evdev, time, pyautogui, sys, subprocess, configparser, os
import tkinter as tk
from tkinter import ttk
import threading
# KEYBOARD_KEYS unter Linux
# The following are the valid strings to pass to the press(), keyDown(), keyUp(), and hotkey() functions:
# ['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
# ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
# '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`',
# 'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
# 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
# 'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
# 'browserback', 'browserfavorites', 'browserforward', 'browserhome',
# 'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
# 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
# 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
# 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
# 'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
# 'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
# 'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
# 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
# 'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
# 'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
# 'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
# 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
# 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
# 'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen',
# 'command', 'option', 'optionleft', 'optionright'
# Dynamischer Pfad zur Konfig
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
CONFIG_PATH = os.path.join(BASE_DIR, "keymap.cfg")
def load_cfg():
config = configparser.ConfigParser()
if os.path.exists(CONFIG_PATH):
config.read(CONFIG_PATH)
dev = config.get('Device', 'name', fallback="Sundtek Remote Control")
maps = dict(config.items('Mappings'))
return dev, maps
return "Sundtek Remote Control", {}
class IRGui:
def __init__(self, root):
self.root = root
self.root.title("IR-Control Manager")
self.root.geometry("850x600")
self.dev_name, self.maps = load_cfg()
self.listening = False
header = ttk.LabelFrame(root, text=" Automatische Hardware Auswahl Bedingung: [sudo usermod -aG input $USER] ")
header.pack(fill="x", padx=10, pady=5)
self.dev_var = tk.StringVar(value=self.dev_name)
self.cb_dev = ttk.Combobox(header, textvariable=self.dev_var, state="readonly")
self.cb_dev.pack(side="left", padx=5, pady=5, expand=True, fill="x")
self.btn_listen = ttk.Button(header, text="Code einlesen (Record)", command=self.toggle_listen)
self.btn_listen.pack(side="right", padx=5)
self.tree = ttk.Treeview(root, columns=("Code", "Action"), show="headings")
self.tree.heading("Code", text="IR-Code")
self.tree.heading("Action", text="Aktion (hk:Hotkey | sp:Script | sleep:Pause)")
self.tree.column("Code", width=80, stretch=False)
self.tree.column("Action", width=650, stretch=True)
self.tree.pack(fill="both", expand=True, padx=15, pady=5)
self.tree.bind("<<TreeviewSelect>>", self.on_select)
self.update_table()
input_f = ttk.LabelFrame(root, text=" IR-Code Befehl bearbeiten ")
input_f.pack(fill="x", padx=10, pady=5)
self.in_code = ttk.Entry(input_f, width=12)
self.in_code.grid(row=0, column=0, padx=5, pady=5)
self.in_act = ttk.Entry(input_f, width=76)
self.in_act.grid(row=0, column=1, padx=5, pady=5)
ttk.Button(input_f, text="Hinzufügen", command=self.add).grid(row=0, column=2, padx=5)
ttk.Label(input_f, text=" Format: hk:ctrl,c | sp:/pfad/script.sh | sleep:2", foreground="gray").grid(row=1, column=1, sticky="w")
btns = ttk.Frame(root)
btns.pack(fill="x", padx=10, pady=10)
ttk.Button(btns, text="Löschen", command=self.delete).pack(side="left")
ttk.Button(btns, text="Speichern & Beenden", command=self.save).pack(side="right")
# Startet Hardware-Erkennung direkt
self.refresh_devices()
def refresh_devices(self):
try:
# Liste alle verfügbaren Gerätenamen auf
devices = [evdev.InputDevice(p).name for p in evdev.list_devices()]
self.cb_dev['values'] = devices
# Wähle das gespeicherte Gerät aus, falls es angeschlossen ist
if self.dev_name in devices:
self.cb_dev.set(self.dev_name)
elif devices:
self.cb_dev.current(0)
except:
pass
def on_select(self, event):
sel = self.tree.selection()
if sel:
item = self.tree.item(sel[0])['values']
self.fill_fields(item[0], item[1])
def toggle_listen(self):
if not self.listening:
self.listening = True
self.btn_listen.config(text="Taste auf FB drücken...")
threading.Thread(target=self.listen_for_code, daemon=True).start()
def listen_for_code(self):
try:
devices = [evdev.InputDevice(p) for p in evdev.list_devices()]
d = next((d for d in devices if d.name == self.dev_var.get()), None)
if d:
for event in d.read_loop():
if event.type == evdev.ecodes.EV_KEY and event.value == 1:
code_str = str(event.code)
existing_act = self.maps.get(code_str, "")
self.root.after(0, lambda c=code_str, a=existing_act: self.fill_fields(c, a))
break
except: pass
self.listening = False
self.root.after(0, lambda: self.btn_listen.config(text="Code einlesen (Record)"))
def fill_fields(self, code, action):
self.in_code.delete(0, tk.END)
self.in_code.insert(0, code)
self.in_act.delete(0, tk.END)
self.in_act.insert(0, action)
def update_table(self):
for i in self.tree.get_children(): self.tree.delete(i)
sorted_keys = sorted(self.maps.keys(), key=lambda x: int(x) if x.isdigit() else 0)
for k in sorted_keys:
self.tree.insert("", "end", values=(k, self.maps[k]))
def add(self):
if self.in_code.get() and self.in_act.get():
self.maps[self.in_code.get()] = self.in_act.get()
self.update_table()
def delete(self):
sel = self.tree.selection()
if sel:
key = str(self.tree.item(sel)['values'][0])
if key in self.maps: del self.maps[key]
self.update_table()
def save(self):
cfg = configparser.ConfigParser()
cfg['Device'] = {'name': self.dev_var.get()}
cfg.add_section('Mappings')
sorted_keys = sorted(self.maps.keys(), key=lambda x: int(x) if x.isdigit() else 0)
for k in sorted_keys:
cfg.set('Mappings', k, self.maps[k])
with open(CONFIG_PATH, 'w') as f:
cfg.write(f)
self.root.destroy()
def run_service():
dev_name, maps = load_cfg()
try:
devices = [evdev.InputDevice(p) for p in evdev.list_devices()]
found_dev = next((d for d in devices if d.name == dev_name), None)
if not found_dev: return
for event in found_dev.read_loop():
if event.type == evdev.ecodes.EV_KEY and event.value == 1:
action = maps.get(str(event.code))
if action:
for step in action.split('|'):
parts = step.strip().split(':', 1)
if len(parts) < 2: continue
m, c = parts[0].strip(), parts[1].strip()
if m == "hk": pyautogui.hotkey(*[k.strip() for k in c.split(',')])
elif m == "sp": subprocess.Popen(c, shell=True)
elif m == "sleep":
try: time.sleep(float(c))
except: pass
except: pass
if __name__ == "__main__":
if "-c" in sys.argv:
root = tk.Tk()
IRGui(root)
root.mainloop()
else:
run_service()
# ------------------------------------------------------------------------
In Kodi muss dann nur noch die Default keyboard.xml in [/userdata/keymaps/keyboard.xml] kopiert werden und gut ist’s.
https://github.com/xbmc/xbmc/blob/master/system/keymaps/keyboard.xmlIm Zuge des Upgrade habe ich KODI auf flatpak immigriert, das bleibt leider nicht folgenlos.
Die Pflege ist zwar einfacher, jedoch ändert sich die Ordner Struktur, der Programmeinstellungen.
Kurz... die keyboard.xml fehlte in meinem flatpak KODI.
Nach ein paar frustrierender Tage und Nächten...
Ist mir der simple Fehler endlich aufgefallen.
In flatpak Kodi muss die Default keyboard.xml, jetzt für meinem Fall, unter [~/tv.kodi.Kodi/data/userdata/keymaps] abgelegt werden und es funktioniert wider.
Da mein Python Script, geboren aus der Not, etwas umständlich anzupassen war, habe ich gleich Nägel mit Köpfen gemacht.
Das o.g. neu Script liegt jetzt bei mir in [/etc/ir-control/ir-control.py]
Mit dem Befehl:
[python3 /etc/ir-control/ir-control.py -c]
Startet ein kleines GUI, mit welchem sich die Tasten der Fernbedienung anpassen lassen.
Die Konfiguration wird jetzt nicht mehr im Programm mühsam gepflegt, sie landet jetzt in einer eigenen [/etc/ir-control/keymap.cfg] .
Beispiel:
# --------------Beispiel für die damit erstellte keymap.cfg-----------------------------------------
[Device]
name = Sundtek Remote Control
[Mappings]
1 = hk:escape
17 = hk:w
18 = hk:e
21 = hk:y
22 = hk:u
57 = hk:space
62 = hk:f4
104 = hk:pageup
109 = hk:pagedown
116 = sp:shutdown -h now
142 = sp:firefox
# ------------------------------------------------------
Über Startprogramme, mit dem Befehl:
[python3 /etc/ir-control/ir-control.py]
Startet mein Script wie gewohnt und verrichtet sein Werk im Hintergrund.
Die Fernsteuerung muss zuvor auf das richtige Layout Mapping gestellt werden.
In meinem Fall:
[/opt/bin/mediaclient --updaterc=3 /dev/mediainput0]
------------------------------ 01.04.2026 ----------------------------------------------------------------------------
Kleiner Nachtrag zum aktuellen Treiber und DVB-S2 Stick Version 6 sowie Version 8 :
Seit ein paar Jahren, hat sich einiges bei Linux verändert.
Linux Tools wie ir-keytable verwenden eine andere Konfig Datei als vor ein paar Jahren.
Das alte Datei-Formate funktionieren schon lange nicht mehr.
Das neue Format, bei Linux Mint 22.3:
/etc/rc_keymaps/lg.toml
# Generated with gen_keytables.pl from drivers/media/rc/keymaps/rc-rc6-mce.c
[[protocols]]
name = "NEC"
protocol = "NEC" # <-- Schaltet auf NEC
variant = "NEC"
[protocols.scancodes]
0x101071 = "KEY_DELETE"
0x101060 = "KEY_ENTER"
0x10101f = "KEY_MUTE"
0x101077 = "KEY_INFO"
0x101017 = "KEY_VOLUMEUP"
0x101016 = "KEY_VOLUMEDOWN"
0x101013 = "KEY_CHANNELUP"
0x101012 = "KEY_CHANNELDOWN"
0x101015 = "KEY_RECORD"
0x10104e = "KEY_UP"
0x101004 = "KEY_DOWN"
0x101006 = "KEY_LEFT"
0x101007 = "KEY_RIGHT"
0x101005 = "KEY_ENTER" # "KEY_OK"
0x10104d = "KEY_EPG"
0x101040 = "KEY_MODE"
0x101003 = "KEY_PVR"
0x10103a = "KEY_SUBTITLE"
0x10101e = "KEY_POWER2"
0x1010c2 = "KEY_EXIT"
0x101009 = "KEY_PLAYER"
Das alte Format analog dazu, für mediaclient von mir angepasst
/etc/rc_keymaps/lg.conf
0x101071 KEY_DELETE
0x101060 KEY_ENTER
0x10101f KEY_MUTE
0x101077 KEY_INFO
0x101017 KEY_VOLUMEUP
0x101016 KEY_VOLUMEDOWN
0x101013 KEY_CHANNELUP
0x101012 KEY_CHANNELDOWN
0x101015 KEY_RECORD
0x10104e KEY_UP
0x101004 KEY_DOWN
0x101006 KEY_LEFT
0x101007 KEY_RIGHT
0x101005 KEY_ENTER # "KEY_OK"
0x10104d KEY_EPG
0x101040 KEY_MODE
0x101003 KEY_PVR
0x10103a KEY_SUBTITLE
0x10101e KEY_POWER2
0x1010c2 KEY_EXIT
0x101009 KEY_PLAYER
linux@linux-N7x0WU:~$ /opt/bin/mediaclient --setrcmap=/etc/rc_keymaps/lg.conf
Loading new keymap:
0x1071 KEY_DELETE (0x6f)
0x1060 KEY_ENTER (0x1c)
0x101f KEY_MUTE (0x71)
0x1077 KEY_INFO (0x166)
0x1017 KEY_VOLUMEUP (0x73)
0x1016 KEY_VOLUMEDOWN (0x72)
0x1013 KEY_CHANNELUP (0x192)
0x1012 KEY_CHANNELDOWN (0x193)
0x1015 KEY_RECORD (0xa7)
0x104e KEY_UP (0x67)
0x1004 KEY_DOWN (0x6c)
0x1006 KEY_LEFT (0x69)
0x1007 KEY_RIGHT (0x6a)
0x1005 KEY_ENTER (0x1c)
0x104d KEY_EPG (0x16d)
0x1040 KEY_MODE (0x175)
0x1003 KEY_PVR (0x16e)
0x103a KEY_SUBTITLE (0x172)
0x101e KEY_POWER2 (0x164)
0x10c2 KEY_EXIT (0xae)
0x1009 KEY_PLAYER (0x183)
linux@linux-N7x0WU:~$
Der "neue" DVB-S2 Stick Version 8 (ca.2018) kann die key's nicht laden.
linux@linux-N7x0WU:~$ /opt/bin/mediaclient --dumprcmap
linux@linux-N7x0WU:~$
Der alte DVB-S2 Stick Version 6 konnte das alles noch.
Jedoch wird der Scan codes auf nur 4 Byte limitiert, in den Stick geschrieben.
Neue IR Fernbedienungen mit IR-NEC Protokoll, wie z.B LG AKB36086203 haben jedoch einen 6 Byte Scancode
und lassen sich daher zur Zeit nicht anlernen.
linux@linux-N7x0WU:~$ /opt/bin/mediaclient --dumprcmap
0x1003 KEY_PVR
0x1004 KEY_DOWN
0x1005 KEY_ENTER
0x1006 KEY_LEFT
0x1007 KEY_RIGHT
0x1009 KEY_PLAYER
0x1012 KEY_CHANNELDOWN
0x1013 KEY_CHANNELUP
0x1015 KEY_RECORD
0x1016 KEY_VOLUMEDOWN
0x1017 KEY_VOLUMEUP
0x101e KEY_POWER2
0x101f KEY_MUTE
0x103a KEY_SUBTITLE
0x1040 KEY_MODE
0x104d KEY_EPG
0x104e KEY_UP
0x1060 KEY_ENTER
0x1071 KEY_DELETE
0x1077 KEY_INFO
0x10c2 KEY_EXIT
linux@linux-N7x0WU:~$
MSC SCAN mediaclient RC-Key
0x101003 KEY_PVR 0x1003 KEY_PVR
Das Umschalten auf ein alternatives IR Protokoll,
wie zum Beispiel auf RC6, funktioniert bei beiden Stick nicht (Version 6 als auch Version

linux@linux-N7x0WU:~$ /opt/bin/mediaclient -s 2
Using device: /dev/mediainput0
Setting RC ID: 2
invalid value: 2
linux@linux-N7x0WU:~$
linux@linux-N7x0WU:~$ /opt/bin/mediaclient -l
Using device: /dev/mediainput0
supported remote control protocols:
id protocol name
linux@linux-N7x0WU:~$
Da meine Alte Fernbedienung in die Jahre gekommen ist, wollte ich eine alternative
Fernbedienung anlernen.
Die Limitierung ist momentan der alte DVB-S2 Stick Version 6.
Damit kann ich zumindest Fernbedienungen mit NEC und 4 Byte Scancode verwenden.
Der "Neue" DVB-S2 Stick Version 8, kann das zur Zeit überhaupt nicht.
Selbst der aktuelle Treiber bietet dabei keine Verbesserung.
Fazit:
Eine "ir-keytable" Unterstützung in den Treiber zu integrieren, würde die Systempfelge sehr erleichtern.
mit /etc/rc_maps.cfg aus ir-kytable kann man so dem System, dass RC keymap überlassen.
Zum Beispiel [/etc/rc_keymaps/lg.toml]
IR Protokoll und Keymaps werden dabei automatisch vom System übergeben und man kann sogar ein paar dutzend Konfigurationen in der
[/etc/rc_maps.cfg] hinterlegen, wer's braucht.
Lach Lach Lach
Nun Ja, alles nicht so einfach.
Aber die Treiber Pflege würde das sicher auch entlasten und entschlacken.
Meine Notlösung bisher:
Ich habe einen alten TrekStor DVB-T1 Stick an den Rechner gesteckt, der hat einen IR Eingang welcher mit ir-keytable läuft.
Das umschifft mein Problem vorerst.
-------------------------- 04.04.2026----------------------------------------
So,
ich bin jetzt ein Stück weiter.
Die Ir-keytable unterstützt in der aktuellen Version nur noch IR Empfänger, welche unter /sys/class/rc stehen, Beispiel als rc0 aufgeführt. Der Aufruf mit --device [/dev/input/event* device] ist entfernt worden, somit kann der IR Eingang des Sundtek TV-Stick nicht mehr eingebunden werden.
Das Umschalten auf ein alternatives IR Protokoll [NEC 0], [RC5 1], [RC6_MODE0 2], [RC6_MODE6A 3],
funktioniert bei beiden Stick (sowohl bei der Version 6 als auch bei Version

nicht.
sundtek.conf
ir_protocol=RC5
Eine neue Keymap kann man bei beiden Stick laden, mit der Limitierung auf das ir_rotocol=NEC, was fix ist.
Dabei wird auch NECX erkannt.
sundtek.conf
rcmap=/etc/rc_keymaps/skymaster.conf
Das Format für die Konfigurationsdatei ist etwas speziell und weicht vom üblichen ab.
Taste 1 auf der Fernbedienung (Scancode = 0x7f03) entspricht 0x03, Zuordnung Mapping entsprechend KEY_1
Taste 1 auf der Fernbedienung (Scancode = 0x7f02) entspricht 0x02, Zuordnung Mapping entsprechend KEY_2
Beispiel der skymaster.conf :
0x0e KEY_0
0x03 KEY_1
0x02 KEY_2
0x01 KEY_3
0x07 KEY_4
0x06 KEY_5
0x05 KEY_6
0x0b KEY_7
0x0a KEY_8
0x09 KEY_9
0x12 KEY_MUTE
0x19 KEY_INFO
0x44 KEY_VOLUMEUP
0x51 KEY_VOLUMEDOWN
0x48 KEY_CHANNELUP
0x52 KEY_CHANNELDOWN
0x04 KEY_PLAY
0x14 KEY_RECORD
0x1a KEY_UP
0x1b KEY_DOWN
0x11 KEY_LEFT
0x0d KEY_RIGHT
0x08 KEY_ENTER
0x17 KEY_EXIT
0x45 KEY_EPG
0x1c KEY_MODE
0x1e KEY_TV
0x42 KEY_VIDEO
0x40 KEY_TITLE
0x41 KEY_SUBTITLE
0x0f KEY_RED
0x49 KEY_GREEN
0x16 KEY_YELLOW
0x10 KEY_BLUE
0x00 KEY_POWER2
0x15 KEY_PLAYPAUSE
Viel Fleißarbeit und man muss die Scancode der Tasten kennen oder mit ir-keytable -c -p all -t auslesen können.
Ohne einen zweiten Stick, der von ir-keytable unterstützt wird, absolut hoffnungslos.
Resümee :
Ist mit [mediaclient --setrcmap=/etc/rc_keymaps/skymaster.conf] oder über sundtek.conf, die neue Keymap in den Stick geladen, funktioniert es auch… meistens jedenfalls.
Ich habe eine Fernsteuerung, da geht es nicht.
22918.149385: Linux-Infrarotfernbedienungsprotokoll(necx): Scancode = 0x101013
22918.149401: Ereignistyp EV_MSC(0x04): Scancode = 0x101013
22918.149401: Ereignistyp EV_SYN(0x00).
Der neue DVB-S2 Stick Version 8 hat noch einen BUG.
Mit [mediaclient --dumprcmap] lassen sich die Änderungen nicht auslesen. Sie werden jedoch übernommen.
Fazit:
ja, man kann auch eine andere Fernbedienung verwenden. Aber leider läuft die IR Schnittstelle des DVB-S2 Stick nicht über Ir-keytable, schade eigentlich. Sind die Tasten erst einmal richtig verschränkt, so kann man über mein kleines python Script, so ziemlich jede Taste emulieren oder sogar Programme aufrufen.
Was bleibt noch zu erledigen:
- Der Bug mit ir_protocol= [NEC 0], [RC5 1], [RC6_MODE0 2], [RC6_MODE6A 3], sollte behoben werden,
so dass man auch RC-5 und RC-6 Fernbedienungen einsetzen kann.
- Der Bug mit mediaclient--dumprcmap, beim DVB-S2 Stick Version 8, sollte behoben werden.
- Das Datei Format von setrcmap könnte angepasst werden, so das man den Scancode direkt übernimmt, nicht nur die letzten 2 Stellen.
Beispiel: 0x7f03 KEY_1
- Wenn man dann auch wieder Ir-keytable verwenden könnte, das wäre einfach genial bei der Systempflege.
Dazu muss sich die IR Schnittstelle jedoch bei /sys/class/rc eintragen, denn der Parameter --device [/dev/input/event* device] steht
nicht mehr zur Verfügung.
Viel Spaß beim Nach-Basteln,
ich hoffe mein Beitrag war hilfreich für andere User.
Alle Angaben in meinem Beitrag sind jedoch ohne Gewähr und Anspruch auf Vollständigkeit. ...