PVA: Clusterplugin für Carola

Ihr habt es wahrscheinlich schon immer gewusst: Computer wollen die Welt erobern 😉 Die Welteroberungspläne von Carola sind da eher bescheiden, sie will nur Eure Wohnung kontrollieren 😀

PVA: Clusterplugin für Carola

Am Dienstagabend war es soweit, das neue Clusterplugin für Carola hatte Premiere bei Linux am Dienstag. Natürlich ist Carola eine von den netten und will euch nur besser dienen und da kam Ihr die Idee, sich doch auf alle brauchbaren Geräte im Heimnetz auszudehnen. Dafür brauchen wir Pipewire, denn das macht es möglich, den Lautsprecher und das Mikro eines anderen Linuxcomputers zu benutzen.

Wir brauchen Pipewiretunnel

Damit Ihr versteht was Carola hinter den Kulissen macht, werden wir das in Handarbeit durchgehen.

Zuerst brauchen wir einen TCP-Server. Dazu loggt man sich z.b. per SSH auf dem Clienten in die Desktopsession ein. Diese ist zwangsweise notwendig, weil ohne eine Desktopsession gibt es keinen Pipewireservice. Der Desktop muß nicht offen sein, der Screensafer kann ruhig an sein.

DEV=wlp2s0
IP=$(ip -h -f inet a show dev $DEV | grep inet | awk ‚{print $2;}‘ | sed -e „s/\/.*$//“|head -n 1)
pactl load-module module-native-protocol-tcp port=4656 listen=$IP
pactl load-module module-native-protocol-tcp port=4657 listen=$IP

Die Anweisungen oben extrahieren die IPv4 Adresse des PCs, solange das Device stimmt. Aber da Ihr die IP kennt, weil Ihr sonst nicht auf den Computer einloggen könntet, kann man sich eine automatische Ermittlung auch schenken. Vielleicht möchte ja jemand das beim Desktopstart automatisch machen, dann wäre es ganz hilfreich. In jedem Fall muß es eine extern erreichbare IP sein und es darf keine Firewall im Weg sein.

Wir brauchen zwei Tunnelports, einen für den Lautsprecher (4656) und einen für das Mikrofon(4657). In der neuesten Pluginversion kann man die Ports frei wählen, was es am Ende erlaubt, daß mehrere Instanzen von Carola auf verschiedenen PCs laufen können. Bevor jetzt jemand feuchte Träume bekommt, daß alle Clienten auch eine Kontrollinstanz sein können, davon würde ich dringend abraten, weil so ein Kreislauf nur zu totalen Fails führen wird.

Wofür ist es dann gedacht?

Wenn Ihr z.b. einen Heimautomatisierungsserver habt, der sich ganz speziell nur um Fenster, Türen, Steckdosen usw. kümmern soll, dann möchte man dem ja vielleicht auch von überall aus Anweisungen geben können. Das Mediacenter kann sich auf Video und Ton spezialisieren und der Rechner mit der KI-GPU auf was auch immer der tun soll 🙂 Solange jede Kontrollinstanz auf andere Keywords reagiert, ist das völlig unproblematisch, solange keine der erzeugten Antworten Triggerworte für andere Instanzen enthalten. Ihr seid gewarnt worden!

Als nächstes erstellen wir den Tunnel:

pactl load-module module-tunnel-sink server=tcp:192.168.0.109:4656 source_name=Küche
pactl load-module module-tunnel-source server=tcp:192.168.0.109:4657 source_name=Küche

Und schon ist Euer Tunnel fertig.

Kleiner Tip: auf beiden Seiten des Tunnels muß Wireplumber als Pipewire-Sessionmanager laufen, sonst funktioniert es nicht. Das wurde auf schmerzliche Weise klar, daß es mit dem Pinephone genau deswegen nicht ging. Das Paket „pipewire-pulse“ wäre auch hilfreich.

Und wie spielt man da jetzt Musik ein?

Damit durch den Tunnel Musik gesendet wird, können wir den Tunnel entweder im Pulseaudio-Lautstärkeregler als Ziel der Musikapp auswählen, oder wir verdrahten das auch in der Konsole. Eure Entscheidung!

pw-link qmmp:output_FL „Tunnel to tcp:192.168.0.109:4656/:playback_FL“
pw-link qmmp:output_FR „Tunnel to tcp:192.168.0.109:4656/:playback_FR“

Im Beispiel ist das jetzt für QMMP. Gleicher Befehl mit -d Option entfernt den Link wieder.  Das war es, wenn man das per Hand machen will. Noch einige hilfreiche Befehle:

pactl list short modules
pactl list short sinks
pactl list short sources
pactl unload-module ID

wobei die ID für das Unload bei der Liste als erste Spalte angezeigt wird.

Was macht Carola jetzt alles automatisch?

Da es ja um einen Cluster geht, gehen wir mal davon aus, daß es mehrere Geräte gibt und die nicht immer erreichbar sind. Carola detektiert also automatisch, ob ein Client erreichbar ist, ob der schon im Live-Clustersetup drin ist oder ob der nicht mehr erreichbar ist. Entsprechend dem Ergebnisses wirft sie alle toten Clienten raus und nimmt sie wieder auf, wenn sie wieder da sind. Wegen Update rebooten ist also absolut kein Problem 😉

Sollte Carola selbst neugestartet werden, detektiert sie den Ist-Zustand und hat danach wieder die volle Kontrolle. Die Tunnel brechen also nicht zusammen, wenn man den Assistenten neustartet.

Damit der Ton wirklich an alle Clienten rausgeht und man nicht jede einzelne App immer direkt verdrahten muß, wo Carola ja auch gar nicht weiß, welche überhaupt in die Clusternodes sollen, gibt es zwei „öffentliche“ Sinks: ALLTUNNEL und ALLMICS. Ist denke ich, selbsterklärend. Die Tunnel werden also nicht mit der App, sondern mit ALL* verbunden und die App gibt dann den Ton auf diese Node aus.

Das sieht dann so aus:

jede menge Verbindungen zwischen den Sinks und Sources

Oben das lokale Mikrofon, die Tunnelmikros und das Sammelsink ALLMICS, unten dann das entsprechende Lautsprechersetup. QMMP gibt hier den Ton erst an EASYEFFECTS aus, das leitet den dann an ALLTUNNEL weiter (Links im Bild). Das gesamte Bild paßt leider nicht in den Artikel, dafür ist es zu breit aufgestellt.

Ihr könnt Euch jetzt sicher denken, daß das mit beliebig vielen Tunneln funktioniert. Ich hatte heute mal den Lautsprecher meiner Eltern über einen SSH Tunnel + Pipewiretunnel angebunden und der Ton kam problemlos dort an.

Es kann aber zum Stottereffekt kommen. Das Pinephone leidet auch dadrunter. Was es genau auslöst, kann nur vermutet werden. Pipewire berichtet dann von einem Bufferunderrun, also das nicht genug Daten in den Tunnel geschoben werden konnten, was bedeutet würde, daß das Netz oder das Pine zu lahm waren. I.d.R. regelt sich das aber nach 1-2 Minuten wieder ein. Gerade jetzt habe ich ein Tablet und ein Pinephone drin (sieht man oben) und die laufen beide perfekt.

Ein Wort zu Latenzen

Ihr habt ein Netzwerk zwischen Eurem PC und dem Lautsprecher im Gerät, das geht nicht latenzfrei an der Musik vorbei. Da es sich aber um ein Multi-Room-Setup handelt, wo jedes Gerät in einem eigenen Zimmer steht, ist das nicht dramatisch, da es sich bei Gigabit nur um Millisekunden handelt. Man kann es aber deutlich wahrnehmen, da wir im Gehör nur maximal 4ms ausgleichen können. Also stellt die Geräte einfach nicht nebeneinander, dann ist alles gut 🙂

Dank Pipewires Geschwindigkeitsvorteil gegenüber Pulseaudio, sind es nur wenig mehr als 4 ms. Beim Wandern durch die Wohnung wird es nicht negativ auffallen.

Was kann man als nächstes erwarten kann

Der nächste Schritt wird dann sein, daß auf Geräte die das unterstützen, ein Videostream gesendet werden kann. Da wäre es natürlich natürlich extrem hilfreich wenn man auch einen Bildschirm dran hätte, der nicht nur die Sperrseite anzeigt.

Auch Apps auf den Endgeräten zu starten, sollte kein Problem darstellen. Mir schwebt da z.b. Netflix vor, was sich ja anbietet. Wenn das Netflixplugin dann z.b. die Anweisung „Carola spiele Netflix Enterprise in der Küche“ bekommt, könnte das den nötigen Befehl an den Cluster übergeben, der das dann an den richtigen Clienten sendet.

Möglich wäre auch, das man ein RTMP Streaming vom PC zum Clienten macht, mit MPV am Ende ist das selbst auf einem Pine 2G kein Problem, wenn die Netzwerkanbindung mitspielt.

Source: PVA@Github
Repo:  https://github.com/Cyborgscode/Personal-Voice-Assistent#how-to-install

Netflix Plugin für Carola

Die Spatzen pfeifen es vermutlich schon von den Dächern, ich habe mir einen lang gehegten Traum soweit das ging erfüllt: Netflix mit Carola steuern 😀

Netflix Plugin für Carola

Es war richtig cool als Carola die eigenen Videos managen konnte, aber jetzt kann man auch Netflix basismäßig  ansteuern.Das ganze ist zwar noch ein bisschen Beta, weil die Sprachkommandos noch ein bisschen ausgefeilt werden müssen, so daß man eine Menge von sinnvollen Sätzen sagen kann ums an Ziel zu kommen, aber es geht schon ganz braucht.

Ihr könnt Euch sicher vorstellen, daß man dazu einen Browser braucht. Ich habe wie viele von euch Firefox genommen, weil der mit dem Kioskmodus genau die richtige Funktion für das satte Netflixerlebnis hat. Natürlich geht es auch im Windowmodus, aber das ist nicht die beste Wahl, weil das Plugin mit dem Wechsel zwischen Vollbild und Fenster klar kommen muß, was nicht ganz einfach ist. Es gibt auch so schon einige Hindernisse an denen das ganze „scheitert“, da müssen wir uns nicht noch mehr Ärger ins Haus holen.

Für alle Fälle gibt es im Repo auch eine Config für den Fenstermodus. Der hängt aber stark von den eingeblendeten Elementen von Firefox ab und erfordert daher sehr viel Arbeit von Euch. Ich empfehle den Kiosk zu benutzen.

Wir brauchen

Ein paar Tools brauchen wir und wenn Ihr kein X habt, sondern Wayland, braucht Ihr eh eine Alternative zum xdotool. Also: xdotool, wmctrl und sed sind Pflicht und ein eigenes Netflix Profil im Firefox macht alles sehr viel einfacher 😉 Fangen wir damit an

Terminal aufmachen
firefox –profilemanager
Neues Profil erzeugen: Netflix
mit dem Profil starten
das NetFlix 1080p Plugin installieren
das Widevine Plugin installieren
Netflix als Startseite setzen
und raus

Jetzt habt Ihr ein Problem: Firefox hat Netflix jetzt als Default Profile gespeichert. Ergo müßt Ihr jetzt wieder den firefox –profilemanager starten und das beheben! Ansonsten ist jeder Firefoxstart ein Alptraum 😉

Nehmen wir an Ihr habt das geschafft, dann braucht Ihr die Konfiguration:

app:“netflix“,“xdotool mousemove 960 540x:x/usr/bin/firefox -P netflix –kiosk –new-instance“

# you need wmctrl, grep, sed and xdotool installed to make this work.

command:“netflix|home“,“NETFLIXHOME“,““
command:“netflix|vorspulen“,“NETFLIXFORWARD“,““
command:“netflix|zurückspulen“,“NETFLIXBACKWARDS“,““
command:“netflix|meine|liste“,“NETFLIXMYLIST“,““
command:“netflix|suche“,“NETFLIXSEARCH“,““
command:“netflix|spiele“,“NETFLIXSEARCH“,““
command:“netflix|ich|will|sehen“,“NETFLIXSEARCH“,““
command:“netflix|zurück“,“NETFLIXRETURN“,““
command:“netflix|pause“,“NETFLIXPAUSE“,““
command:“netflix|abspielen“,“NETFLIXPAUSE“,““
command:“netflix|überspringen“,“NETFLIXSKIPINTRO“,““
command:“netflix|vollbild|an“,“NETFLIXFULLSCREEN“,““
command:“netflix|vollbild|aus“,“NETFLIXFULLSCREEN“,““

# WARNING: THESE VALUES NEED TO BE ADJUSTED TO YOUR PRIVATE BROWSER IN USE!!!
# FULLSCREEN KIOSK MODE

netflix:“offset“,“0″
netflix:“pos_fullscreen_on“,“1873,1020″
netflix:“pos_fullscreen_off“,“1873,1020″
netflix:“pos_mylist“,“560,36″
netflix:“pos_search“,“1728,36″
netflix:“pos_back“,“50,50″
netflix:“pos_play“,“30,1023″
netflix:“pos_backwards“,“116,1023″
netflix:“pos_forward“,“210,1023″
netflix:“pos_start“,“232,36″
netflix:“pos_firstentry“,“170,270″
netflix:“pos_miniplay“,“170,270″
netflix:“pos_emptyspace“,“1222,36″
netflix:“pos_skipintro“,“1764,915″

# PVA Kommandos zur Mauskontrolle

netflix:“windowactivate“,“/usr/share/pva/plugins/files/activatewindow.sh“
netflix:“mousemove“,“/usr/bin/xdotoolx:xmousemovex:xXXXx:xYYY“
netflix:“clickLMB“,“/usr/bin/xdotoolx:xclickx:x1″
netflix:“linefeed“,“/usr/bin/xdotoolx:xkeyx:xLinefeed“
netflix:“escape“,“/usr/bin/xdotoolx:xkeyx:xEscape“
netflix:“type“,“/usr/bin/xdotoolx:xtypex:x<TERM1>“
netflix:“pageup“,“/usr/bin/xdotoolx:xkeyx:xPage_Up“
netflix:“pagedown“,“/usr/bin/xdotoolx:xkeyx:xPage_Down“

Die grün markierten Anweisungen braucht Ihr nicht anpassen, aber die Positionsdaten könnten, je nach Schriftart und Vergrößerungsfaktor im Browser anzupassen sein. Meine gehen von 100% Zoom aus. Wenn Ihr einen 1920×1080 FullHD Monitor habt, dürfte das so passen. Ist Euer Display größer, multipliziert die Werte einfach mit dem richtigen Faktor.

Für alle, die das mit Mathe im Kopf nicht so haben, hier eine Linuxstyle Lösung:

watch -n 0.5 „xdotool getmouselocation“

Einfach in einem eigenen Fenster im Vordergrund laufen lassen, Problem gelöst 😉

Jetzt schiebt Ihr noch das Plugin, das Fensteraktivierungs-Script in den Pluginordner, aktualisiert im Server Ordner die PVA Hauptklasse und startet PVA neu : Fertig. Kompilieren aller Komponenten nicht vergessen. Das sieht dann so aus:
(dieser Abschnitt wurde aktualisiert, da sich ein Fehler eingeschlichen hatte)

$ ls -ls /usr/share/pva/plugins/files/
insgesamt 68
4 -rwxr-xr-x. 1 root root 112 9. Mär 13:00 activatewindow.sh
8 -rw-r–r–. 1 root root 4828 9. Mär 13:14 DiskFree.class
8 -rw-r–r–. 1 root root 4484 9. Mär 13:14 LoadTask.class
8 -rw-r–r–. 1 root root 7607 9. Mär 13:14 Netflix.class
4 -rw-r–r–. 1 root root 1891 9. Mär 13:14 ‚Netflix$Position.class‘
4 -rw-r–r–. 1 root root 3474 9. Mär 13:14 SpeechGuard.class

Achtet auf die Zugriffsrechte des Scripts und alles wird gut.

Carola netflix home
Carola netflix vorspulen
Carola netflix zurückspulen
Carola netflix meine liste
Carola netflix suche
Carola netflix spiele
Carola netflix zurück
Carola netflix pause
Carola netflix abspielen
Carola netflix überspringen
Carola netflix vollbild an
Carola netflix vollbild aus

Die blauen sind Synonyme weil die Netflixbuttons nur einmal vorhanden sind. Ihr könnt also mit „Pause“ auch wieder das Video starten. Vor- und Zurückspulen ist nur drin, weil die Buttons da waren, nicht weil 10 Sekunden besonders hilfreich wären 😉 „Überspringen“ bezieht sich auf die Intro bei Serien. Wenn Ihr das Timing vergeigt, hält das Video an, weil die Netflix UI das so vorsieht 🙂

Einige Befehle sind nur dann wirksam, wenn ein Video läuft. Damit Carola das weiß, muß sie es selbst gestartet haben. Damit sie weiß, daß das Playback zu ende ist, muß sie es beenden. Also gewöhnt Euch schonmal an diese Ansagen:

Carola Netflix zurück
Carola Netflix suche <hier Film einsetzen>

Falls das Steuermodul mal nicht mehr mitkommt mit Euren manuellen Klicks, einfach Carola neu starten 😉

Update:

Ich hatte gestern abend leider vergessen Euch mitzuteilen, daß PVA.java auch aktualisiert werden muß. Das wurde oben geändert.

Linux am Dienstag: Programm für den 5.4.2022

Um Volker Pispers zu zitieren: „Ist schon wieder Dienstag?“

Linux am Dienstag: Programm für den 5.4.2022

Ja, ist es und diesmal haben wir ab 19 Uhr u.a. im Programm:

  • Sicherheit – 800 NPM Pakete von Cyberkriminellen erstellt.
  • Kernel – Neue Root Lücke im NetFilter
  • Lapsus$ – .. der Urlaub ist beendet
  • Vortrag – gehackte EMailkonten monetarisieren
  • Java – Neue RCE Lücke – Spring4Shell

Gerüchteweise gibt es auch noch eine Vorführung mit dem Stichwort „Handschrift“, aber was das sein mag… hmm, wir werden sehen 😉

Wie jede Woche per Videokonferenz auf https://meet.cloud-foo.de/Linux .

Kleine Anmerkung: Die bisherigen Vorträge findet man jetzt unter https://linux-am-dienstag.de/archiv/ .