Cover Image

Da ich immer mehr Remote-Meetings habe in denen ich präsentieren muss, habe ich schon länger mit dem Gedanken gespielt hier ein wenig mehr zu optimieren und zu automatisieren. Ideen sind u.a. einige Einstellungen in der Software OBS schneller vorzunehmen oder in Zoom automatisch ein paar Einstellungen vorzunehmen. Auch das automatische arrangieren von Fenstern ist immer ein Thema, wenn man etwas präsentiert.

Eine nette Hardware die ich immer im Auge hatte, war ein Stream Deck.

Was ist Stream Deck

Stream Deck (nicht mit Steamdeck verwechseln!) ist sowas wie eine externe Tastatur bei der die Tasten dynamisch bespielt werden werden können. Jede Taste besteht aus einem Mini-Display, was per Software angesprochen werden kann. Ebenso kann auf Tastendruck reagiert werden.

Die offizielle Software von Stream Deck ist super Umfangreich und unterstützt sehr viele Abläufe und kommt bereits mit Schnittstellen für diverse Dinge. Da Stream Deck von professionellen Streamern genutzt wird, gibt es schon Schnittstellen zu allen bekannten Streaming Plattformen.

Wenn etwas nicht direkt geht, kann man es über Erweiterungen oft aus einem Marktplatz nachinstallieren.

Leider steht die offizielle Software aber nur für Windows und MacOS zur Verfügung. Daher schaut man als Linux mal wieder etwas aus der Röhre.

Zum Glück haben es aber finde Entwickler es zumindest geschafft, den Stream Deck anzusteuern, sodass man auch als Linux Benutzer etwas damit anfangen kann.

Also habe ich dem ganzen mal eine Chance gegeben und mir einen Stream Deck MK.2 zugelegt.

Stream Deck unboxed

Stream Deck unter Linux

Das Herzstück der Anbindung ist die Python Elgato Stream Deck Library. Damit lassen sich einfach Knöpfe ansteuern. Auch auf Tastendruck kann reagiert werden.

Für alle die nur konfigurieren aber nicht programmieren möchten, gibt es unter anderem streamdeck-ui.

Damit lassen sich die Knöpfe sehr leicht in einer grafischen Oberfläche konfigurieren.

streamdeck-ui

Wichtig ist, dass ihr für den Stream Deck ein paar udev-rules anlegt. Für meinen MK.2 habe ich die Datei /etc/udev/rules.d/70-streamdeck.rules mit folgendem Inhalt angelegt:

SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0060", TAG+="uaccess"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0063", TAG+="uaccess"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="006c", TAG+="uaccess"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="006d", TAG+="uaccess"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0080", TAG+="uaccess"

Danach muss der Stream Deck per USB angeschlossen werden oder falls schon angeschlossen, nochmal ab und wieder angesteckt werden. Danach sollte streamdeck-ui das Gerät erkennen.

D-BUS Befehle per Tastendruck

Was ich jetzt gemacht habe ist sehr einfach. Ein Anwendungsfall ist bei mir, dass ich gerne in einem Zoom Meeting (oder auch anderen Meetings) das Mikro aus- und einschalten möchte.

Dazu habe ich mir überlegt, dass es gut wäre ein Script zu haben, was das Mikro “toggelt”. Das soll generell in meinem KDE passieren als auch im geöffneten Zoom Fenster.

Das Script sieht jetzt so aus:

#!/bin/bash

# zoom
xdotool search --name '^Zoom Meeting.*$' windowactivate --sync key alt+a

# MS Teams
xdotool search --name '.*Microsoft Teams.*$' windowactivate --sync key ctrl+shift+m

# general microphone
qdbus org.kde.kglobalaccel /component/kmix invokeShortcut "mic_mute"

Technisch passiert hier folgendes. Das Programm xdotool (funktioniert nicht mit Wayland) ermittelt das Fenster indem das Zoom Meeting läuft und simuliert einen “alt+a” Tastendruck. So als ob man das Fenster aktiviert hätte und selbst die Taste drückt. Das ist in meinem Zoom Client das Tastaturkürzel um das Mikro zu “muten”.

Über das Programm qdbus können direkt Befehle über D-Bus abgeschickt werden.

D-Bus

D-Bus (von englisch Desktop-Bus) ist eine freie Programmbibliothek zur Interprozesskommunikation.
https://de.wikipedia.org/wiki/D-Bus

Hier schicke ich den Befehl “mic_mute” an die Applikation kmixer die dann das Mikrofon global ausschaltet.

Eigentlich würde der zweite Befehl reichen, aber ich möchte das gerne in meinem Zoom Client visuell sehen, dass mein Mikrofon ausgeschaltet ist. Leider gibt es noch keine Unterstützung in streamdeck-ui, dass man die Icons einzelner Knöpfe dynamisch austauschen kann um den Zustand auch auf dem Stream Deck direkt anzuzeigen. Das funktioniert unter Windows und MacOS allerdings. Entsprechende Ideen für die Erweiterung der Open Source Software existieren hier aber bereits.

Das oben aufgeführte Script habe ich dann einfach auf eine Aktion eines Knopfes gelegt.

Profil der Session im Programm Konsole ändern

Für Präsentationen ist es oft notwendig die Schriften in meinem Terminal etwas größer zu stellen, damit jeder gut lesen kann. Dazu habe ich mir im Programm Konsole ein Profil “Präsentation” angelegt.

Da stellt sich jetzt die Frage ob es möglich ist, so eine Profiländerung direkt auf einen Knopf zu legen. Spoiler… Ja, es ist möglich. Und zwar so.

Über den qdbusviewer habe ich mir angeschaut, welche D-Bus Methoden das Programm Konsole bereitstellt. Und siehe da, es gibt eine setProfile Methode auf einer Session. Damit lassen sich auch Befehle testen.

qdbusviewer mit Befehl setProfile

Wenn man den Befehl ausführt, wird dieser aber nur auf einer Session ausgeführt. Wenn ich in Konsole aber mehrere Tabs offen habe, dann sind dies mehrere Sessions. Also musste ich noch Infos über die Sessions ermitteln. Zum Glück geht auch das über die Methode Introspect auf dem Session Objekt. Diese liefert das Ergebnis als XML Dokument zurück. Damit kann man dann je Session einmal die setProfile Methode ausführen.

Jetzt muss man nur noch dynamisch die Fenster-ID des geöffneten Konsole Programm ermitteln und das XML über xq auswerten.

Herausbekommen ist nun dieses Bash Skript:

#!/bin/bash

if [ -z "$1 ] || [ -z "$2 ]; then
    echo "usage $0 <method> <arguments>"
    exit 1;
fi

if ! command -v qdbus &> /dev/null; then
    echo "qdbus command was not found"
    exit 1
fi

if ! command -v xq &> /dev/null; then
    echo "xq command was not found"
    exit 1
fi

qdbus org.kde.konsole-$(pidof -s konsole) /Sessions Introspect | \
        xq -r '.node.node[]."@name"' | \
        xargs -i qdbus org.kde.konsole-$(pidof -s konsole) /Sessions/{} $1 $2

In der Konfiguration sieht das dann so aus:

streamdeck-ui mit Konsole Profile

Jede Änderung in der UI wird sofort auf die Hardware übertragen.

Stream Deck mit konfigurierten Knöpfen

Ich hoffe ihr habt jetzt auch neue Ideen bekommen.

Update 11.03.2022

  • Mikrofon-Beispiel wurde für MS Teams ergänzt.