[gelöst] [yavdr-ansible] Fernbedienung in Anwendungen nutzen (Firefox, Higan etc. pp.)

  • Ahoi,

    ich habe vor kurzem meinen acht Jahre alten yaVDR von 0.6 auf 0.7 (ansible, focal) geupgraded und bin dank eurer Hilfe auch eigentlich schon relativ weit gekommen.

    Es gibt nur eine Sache die ich nicht verstehen will, da stehe ich echt auf dem Schlauch.


    Wie in dem "alten" yaVDR würde ich z.B. gerne KEY_CLOSE auf meiner hama Fernbedienung (00052451, siehe Anhang) nutzen um Anwendungen wie z.B. Firefox zu schließen.

    Das klappt irgendwie (noch) nicht...


    Mit irw sehe ich zumindest mal das was ankommt:

    Code
    vdr@satis:~$ irw
    ce 0 KEY_CLOSE devinput


    Bei xev scheint jedoch nichts anzukommen außer die Maus-Emulation und die linke Maustaste auf der Fernbedienung.


    Wie schaffe ich es dass die Knöpfe bei xev (und somit bei anderen Anwendungen) ankommen.

    Ich weiß einfach nicht mehr wie ich da "echte" Keyboard Events genieren kann...


    Was übersehe ich hier?

  • Grundsätzlich ist es so, dass eventlircd die Kernel Input Devices für den Hama-Empfänger exklusiv öffnet, so dass kein weiteres Programm die zusätzlich auslesen kann - nur Maus-Events werden durchgereicht und können dann z.B. vom X-Server gesehen werden. Die übrigen Tastendrücke landen auf dem Lirc-Sockel, von dem dann u.a. der VDR, KODI, irexec, das yavdr-frontend usw. lesen können.


    Wenn du eine Anwendung über das desktop-Plugin aus dem VDR-OSD heraus bzw. über das yavdr-frontend gestartet hast, dann ist der einfachste Weg dem Frontend zu sagen, dass es zurückschalten soll - entweder, indem du am Ende der /etc/yavdr-frontend/config.yml festlegst, dass KEY_CLEAR zum VDR-Frontend zurückschalten soll:

    Code
    lirc:
        socket: /run/lirc/lircd
        keymap:
            KEY_POWER2:
                action: poweroff  # set to "yavdr_compat_poweroff" to mimic the behaviour of older yaVDR version
    
            KEY_CLEAR:
                action: switchto
                args:
                    - vdr

    Alternativ kannst du das auch über irexec machen (in der /var/lib/vdr/.lircrc:(

    Code
    begin
        prog = irexec
        button = KEY_CLEAR
        config = frontend-dbus-send switchto vdr
    end

    Über irxevent kann man auch Tastendrücke für den X-Server absetzen: https://www.lirc.org/html/irxevent.html - das müsstest du in der Session aber noch explizit starten.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Mh, ich hab nochmal geschaut wie das bei dem yaVDR 0.6 gelöst war.

    Dort habe ich für den Higan (Emulator) das über folgendes init script gelöst das von dem menuorg-appswitcher aufgerufen wurde:

    Dadurch war die Fernbedienung exklusiv für den aufgerufenen Prozess und hat nicht noch Befehle im Hintergrund an den VDR geschickt.


    Hier würde ich gerne über das frontend-dbus-send switch-to das so ähnlich realisieren. Kann ich da denn den irexec stoppen und den irxexec starten und umgekehrt?

  • Ich habe jetzt mal ein wenig herum experimentiert.

    Händisch mache ich folgendes nach frontend-dbus-send switch-to xterm:

    1. ssh vdr@<host>
    2. killall irexec
    3. export DISPLAY=:0
    4. irxevent .xlircrc

    In der .xlircrc steht folgendes drin:

    Und tatsächlich kommen diese Events dann auch an (z.B. in xev).

    Jetzt würde ich das nur gerne noch automatisieren, d.h. sobald der Wechsel in eine Applikation geschafft wurde, irexec killen und irxevent starten und sobald diese beendet wurde wieder irexec starten und irxevent killen.


    Wie kann ich das am Besten realisieren?


    Edit: Ich vermute mal das müsste ich irgendwie in /usr/lib/pyhton3/dist-packages/yavdr-frontend/yavdrfrontend.py einbauen, oder? Ich verstehe einfach nicht was genau irexec /home/vdr/.lircrc aufruft...

  • Ich bastel da jetzt gerade an einer Lösung die mittels eines user-lokalen systemd Dienstes den Applikationsswitch vornimmt und dann irxevent vor dem Applikationsstart startet. Dazu habe ich folgenden Dienst irxevent.service:

    Code
    [Unit]
    Description=LIRC X event command handler
    Conflicts=irexec.service
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/irxevent %h/.xlircrc


    Der Dienst vdr-switch-app.service um den Wechsel in die Applikation zu triggern um das Frontend zu deaktivieren hat folgenden Code:

    Code
    [Unit]
    Description=Helper to switch from VDR to application
    Requires=irxevent.service
    
    [Service]
    Type=oneshot
    ExecStartPre=-frontend-dbus-send stop
    ExecStart=vdr-switch-app
    ExecStartPost=-frontend-dbus-send start


    Dabei ist vdr-switch-app ein Script das zwei Modi hat:

    1. vdr-switch-app <commandline>
      Schreibt die auszuführende Kommandozeile in eine temporäre Datei und starten den vdr-switch-app Dienst
    2. vdr-switch-app
      Liest die auszuführende Kommandozeile aus der temporären Datei und führt sie aus


    Was jetzt noch fehlt ist irexec.service nach Beenden des Dienstes wieder zu starten.


    Das ist jedoch nicht mein Hauptproblem.

    Womit ich jetzt noch kämpfe ist, dass das frontend ja eigentlich nur detached ist.

    D.h. jeder Event auf der Fernbedienung führt zu:

    Code
    DEBUG:yaVDRFrontend:we have user activity: attach frontend!


    Im Prinzip will ich hier ja dasselbe was frontend-dbus-send switchto macht, nur dass ich eben eine beliebige Kommandozeile übergeben will ohne dass ich da jetzt noch .desktop Dateien irgendwo hinkippen muss.


    Wie kann ich hier verhindern dass die Fernbedienung das re-attachen des Frontends auslöst?

  • Also, nachdem ich endlich verstanden habe was sich konkret zwischen yaVDR 0.6 und 0.7 (ansible) geändert habe, habe ich es nun auch hinbekommen das System so umzubauen dass es das tut was ich eigentlich will. In der 0.6er Installation wurde beim Applikationswechseln der eventlircd ausgeschaltet. Das ist auch notwendig, da sonst - wie oben beschrieben - der vdr bei dem Tastendruck auf der Fernbedienung meint er müsste das Frontend wieder attachen. Das will ich aber nicht, ich will ja die Keycodes die die Ferbedienung abfackelt direkt abgreifen.


    Daher habe ich folgendes geändert:


    1. Dem vdr user die Rechte gegeben den eventlircd Dienst zu starten und zu stoppen via /etc/sudoers.d/yavdr-eventlircd

    Code
    vdr ALL=(ALL) NOPASSWD: /bin/systemctl start eventlircd.service
    vdr ALL=(ALL) NOPASSWD: /bin/systemctl stop eventlircd.service


    2. Ein Shellscript vdr-switch-app nach /usr/bin gepackt:


    3. Den vdr user-lokalen Dienst vdr-switch-app@.service in /home/vdr/.config/system/user/ hinzugefügt:


    4. Die xorg-ignore-eventlircd.conf löschen damit die Key-Events der Fernbedienung auch bei X Applikationen ankommt.


    Dann kann ich nun im menuorg.xml hinschreiben:

    Code
    <command name="Net" execute="vdr-switch-app firefox --allow-downgrade -P Netflix" />

    und meine Fernbedienung funktioniert dann im Netflix Firefox Profil so wie früher. Die Hama schickt ja (für mich) "sinnige" Kommandos.



    Kann sein dass ich noch die Fehlerbehandlung überarbeiten muss. Habe noch nicht konkret getestet was im Fehlerfall passiert.

    Was meint ihr? Overkill? Quatsch? Geht das doch irgendwie besser mit frontend-dbus-send?

    Edited 2 times, last by Gsus: Aus irgendeinem Grund stirbt nun irexec wenn eventlircd tot ist. Daher hier nun manueller Start/Stop vom vdr-lokalen irexec Service. ().

  • Also für mich funktioniert das jetzt. Habe da noch ein bisschen weiter gebastelt und ein paar der Keys der Fenbedienung via udev umgemapped (https://yulistic.gitlab.io/201…eymapping-with-udev-hwdb/). Dazu habe ich die Datei /etc/udev/hwdb.d/90-hama-mce.hwdb angelegt:

    Dadurch kann man auch einige Einträge unter /etc/eventlircd/hama-mce.evmap weglassen. Da geht bestimmt auch noch mehr, aber für meine Zwecke DOSBox, ZSNES (higan ist leider irgendwie defekt), Firefox für Streaming Dienste klappt das perfekt.



    Habe hier noch die Scripte angehängt mit denen ich den Wechsel zu einer Applikation bzw. wie beim alten yaVDR 0.6 einfach nur eine Applikation parallel zum VDR starte (ich nutze gern dvbcut oder handbrake während der VDR läuft).


    Im Archiv sind:

    • vdr-start-app@.service (nach /home/vdr/.config/systemd/user)
    • vdr-switch-app@.service(nach /home/vdr/.config/systemd/user)
    • vdr-app (nach /usr/bin)


    Dabei ist vdr-app ein Bash-Script mit folgenden Modi (sorry, mit Python werde ich nicht warm):

    • start
      Started eine Applikation parallel zum vdr
    • switch
      Detached das VDR Frontend, stoppt eventlircd, irexec und wechselt zur Applikation.
      Sobald die Applikation beendet wird (egal welcher Fehlercode) wird eventlircd und irexec wieder gestartet und das VDR Frontend wieder attached.


    Beispiel Aufruf:

    vdr-app switch dosbox -conf .config/game.conf



    Ah fast vergessen, damit das journal nicht ständig mit Meldungen darüber dass der eventlircd gestorben ist und er jetzt alle drei Sekunden versuchen wird sich wieder zu verbinden zugespammt wird empfiehlt es sich das Log Level des VDRs runterzudrehen (siehe RE: [gelöst] [yavdr-ansible] vdr log deaktivieren)



    Damit das funktioniert müssen die Änderungen aus Punkt 1. und 4. von RE: [yavdr-ansible] Fernbedienung in Anwendungen nutzen (Firefox, Higan etc. pp.) übernommen werden.



    Vielleicht hilft es ja jemandem. Ich bin auf jeden Fall mit der Funktionalität zufrieden.

  • Gsus

    Changed the title of the thread from “[yavdr-ansible] Fernbedienung in Anwendungen nutzen (Firefox, Higan etc. pp.)” to “[gelöst] [yavdr-ansible] Fernbedienung in Anwendungen nutzen (Firefox, Higan etc. pp.)”.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!