Probleme im Badezimmer

  Ralf Hersel   Lesezeit: 4 Minuten  🗪 2 Kommentare Auf Mastodon ansehen

Wer mit Pipewire Musik auf einem headless-System abspielen möchte, hat ein Problem. Lest hier, wie ihr dennoch unter der Dusche mitsingen könnt.

probleme im badezimmer

Es gibt Leute, die es morgens im Badezimmer gerne ruhig haben; andere singen unter der Dusche oder hören Musik beim Zähneputzen. Ich gehöre zur letzten Gruppe. Deshalb habe ich einen alten Raspberry Pi 3 in ein Badezimmerradio umfunktioniert. Der Raspi steht im Spiegelschrank und ist über den Klinkenanschluss mit einem Lautsprecher verbunden, der auf dem Spiegelschrank steht. Wenn ich morgens ins Bad gehe, schalte ich den Lautsprecher ein und geniesse die Musik zum Wachwerden.

Das Projekt Badezimmerradio habe ich in diesem und diesem Artikel im Detail beschrieben. Dort lest ihr auch, wie ich das technisch gemacht habe.

Trixie zickt

Nun, eigentlich zickt nicht Trixie (Debian 13), sondern Pipewire. Das ist die Ablösung von Pulseaudio und JACK, um endlich einen zuverlässigeren Audio-Stack unter Linux zu bekommen. Doch von Anfang an: Auf meinem Raspi 3 lief noch RaspberryOS basierend auf Debian Bullseye. Als Trixie erschien, habe ich ein Upgrade von Bullseye auf Bookworm auf Trixie versucht, was nicht funktioniert hat. Deshalb habe ich RaspberryOS in der aktuellen Version mit Trixie komplett neu installiert. Bei Trixie ist Pipewire der Standard-Multimedia-Server (vielleicht war es das schon bei Bookworm; weiss ich nicht und ist auch egal).

Beim Badradio startet ein Cronjob zu definierten Zeiten ein Shell-Skript, welches MPV zum Abspielen eines Internet-Radiosenders verwendet. Nach 2 Stunden terminiert sich das Shell-Skript und die Musikwiedergabe endet.

Das Problem

Nach der Neuinstallation des Betriebssystems habe ich den Cronjob wieder eingerichtet und das Skript drauf kopiert. Da der Raspi headless ist, bediene ich ihn über eine SSH-Verbindung von meinem Notebook aus. Dann habe ich getestet, ob das Radio spielt, indem ich das Skript von Hand gestartet habe. Es spielte und so sieht das aus:

Einziger Unterschied: Wo jetzt [alsa] steht, stand [pipewire]. Damit habe ich die Lösung schon fast verraten.

Leider benötigt Pipewire eine interaktive User-Session. Eine solche hat man, wenn man sich per SSH am Raspi anmeldet. Das ist nicht der Fall, wenn niemand angemeldet ist und Cron das Skript startet. Dann steht Pipewire nicht zur Verfügung und der Lautsprecher bleibt stumm.

Lösungsversuche

Im Internet habe ich viele Ideen gefunden, wie man das Problem lösen kann. Insbesondere die Leute im HELP-Raum der GNU/Linux.ch-Community haben immer wieder neue Vorschläge gegeben – herzlichen Dank dafür. Es führt zu weit, wenn ich hier jeden Lösungsversuch im Detail erkläre; daher nur eine Liste:

  • Pipewire durch Pulseaudio ersetzten
  • Pipewire deinstallieren und auf ALSA hoffen
  • Lingering (loginctl enable-linger username)
  • Autossh auf localhost
  • Keeping SSH Session Alive
  • Screen
  • Tmux
  • nohup
  • disown
  • setsid

In den Quellen findet ihr Beschreibungen, was es mit den Versuchen auf sich hat. Um es vorwegzunehmen: Bis auf einen führten keine dieser Versuche zum Erfolg. Kennt ihr Ockhams Rasiermesser? Vereinfacht besagt dieses Prinzip, dass die einfachste Theorie häufig die beste ist. Ihr kennt das aus der Pizzeria, wenn ihr euch die Speisekarte anschaut. Meistens ist die erste Auswahl, die beste; minutenlanges Studieren führt in der Regel nicht zu einem besseren Genuss.

Die Lösung

Einer der ersten Lösungsvorschläge, die ich im HELP-Raum erhalten habe, stammt von elfchen. Sein Rat war, Pipewire zu deinstallieren, um ALSA den Job machen zu lassen. Ich war skeptisch, weil Pipewire und Wireplumber tief ins Betriebssystem integriert sind. Das Internet verrät einem, dass diese Deinstallation auch die grafische Benutzeroberfläche mit in den Abgrund reisst. Das könnte mir egal sein, weil der Raspi headless betrieben wird. Dennoch habe ich mich zuerst auf Anpassungen an der Konfiguration konzentriert, ohne das halbe Betriebssystem einzureissen. Wie gesagt, führten diese Versuche nicht zum Erfolg.

Dann bin ich über meinen Schatten gesprungen. Zuerst habe ich diese Befehle ausgeführt, um Pipewire durch Pulseaudio zu ersetzen:

# Remove PipeWire configurations
rm -rf ~/.config/pipewire/
sudo rm -rf /etc/pipewire/

# Remove PulseAudio configurations
rm -rf ~/.config/pulse/
sudo rm -rf /etc/pulse/

# Remove Bluetooth configurations
sudo rm -rf /etc/bluetooth/

# Install PulseAudio
sudo apt install pulseaudio

# Remove Bluez
sudo apt purge bluez

# Install PulseAudio Bluetooth module
sudo apt install pulseaudio-module-bluetooth

# Disable PipeWire services
systemctl --user stop pipewire
systemctl --user stop pipewire.socket
systemctl --user stop wireplumber
systemctl --user disable pipewire
systemctl --user disable pipewire.socket
systemctl --user disable wireplumber
sudo systemctl --global disable pipewire
sudo systemctl --global disable pipewire.socket
sudo systemctl --global disable wireplumber

# Enable PulseAudio service
systemctl --user enable pulseaudio
sudo systemctl --global enable pulseaudio

# Reboot
sudo reboot

Danach funktionierte die Audio-Wiedergabe über MPV immer noch. Allerdings wurde trotz der oben gezeigten Befehle, Pipewire weiterhin für die Wiedergabe verwendet. Dann hatte ich es satt und habe die erste Pizza auf der Speisekarte bestellt:

sudo apt purge pulseaudio
sudo apt purge pipewire
sudo apt autoremove
sudo /etc/init.d/alsa-utils reset
sudo reboot

Überraschenderweise konnte ich danach über die SSH-Verbindung das Skript starten und MPV spielte über ALSA (siehe erster Screenshot). Doch die entscheidende Frage stand noch im Raum: Wird die Musik auch dann spielen, wenn kein User angemeldet ist und das Skript vom Cronjob gestartet wird?

Ihr ahnt es. Ja, alles funktionierte wieder wie gewünscht.

Herzlichen Dank an unsere Community für die Unterstützung!

Titelbild: https://pixabay.com/photos/faucet-shower-filter-shower-hand-5972471/ (modifiziert)

Quellen:

https://github.com/Spider2742/Replace-pipewire-with-pulseaudio-and-vise-versa/blob/main/pipewire-to-pulseaudio.sh

https://unix.stackexchange.com/questions/462845/how-to-apply-lingering-immediately#462867

https://www.baeldung.com/linux/ssh-keep-alive

https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/

https://de.wikipedia.org/wiki/Ockhams_Rasiermesser

Tags

Trixie, PipeWire, Headless, Radio, Badezimmer, Badradio

The_Raven
Geschrieben von The_Raven am 23. Oktober 2025 um 09:48

Ich verwende ebenfalls Pi's zum abspielen von Musik, betreibe sie jedoch mit Volumio und Verstärker-HAT (HiFi-Berry und DigiAMP, es geht aber natürlich vermutlich auch mit dem Klinken-Ausgang). Der Vorteil ist das es OOTB funktioniert. Zusätzlich hat man noch ein schickes WebUI. Man kann es per Script steuern und da es sich um einen Pi handelt kann man Sensoren anschliessen und "lustige" Dinge damit machen. Man kann z.B. einen Magnetschalter anbringen der beim öffnen einer Tür oder eines Fensters einen Ton abspielt (Türglocke). Oder anstelle eines Magnetschalters kann man auch einen Bewegungssensor anschliessen. Optional kann man auch eine eMail auslösen und schon hat man eine simple Alarmanlage. Die Möglichkeiten sind fast unbegrenzt (über ssh geht das auch auf andere Geräte). In der Küche habe ich z.B. einen Knopf wo ich drücken kann damit im Kinderzimmer "Essen ist fertig" abgespielt wird. So muss ich meine Stimme nicht erheben wenn das essen fertig ist. 😂

Henning
Geschrieben von Henning am 23. Oktober 2025 um 11:20

Das Aktivieren des "lingering" für den jeweiligen Benutzer ist bei weitem die einfachste Lösung und sollte meiner Einschätzung nach auch helfen. Da die Lösung ja auch im Artikel gelistet ist, würde mich mal interessieren, warum sie nicht zum Erfolg geführt hat. Grundsätzlich ist die direkte Nutzung von ALSA natürlich immer am unkompliziertesten, aber in den meisten Fällen möchte ich Pipewire nicht mehr missen, vor allem wegen dessen Remote-Funktionen und der Kompatibilität zu Pulseaudio- und Jack-Clients. Im Headless- und Multi-User-Betrieb gibt es aber zugegebenermaßen einige Klippen zu umschiffen. Die meisten davon lassen sich aber weitgehend aus dem Weg räumen, indem man Pipewire unter einem Account mit aktiviertem Lingering laufen lässt, die TCP-Funktionalität von Pipewire aktiviert und für andere Accounts, die z. B. via Pulseaudio-Protokoll Audio ausgeben sollen, die Umgebungsvariable PULSE_SERVER=localhost setzt. Auf die Weise nutzen andere Accounts die laufende Pipewire-Instanz mit, statt zu versuchen, eine eigene zu starten. Das im Artikel beschriebene Problem hätte sich aber wie gesagt meiner Einschätzung nach bereits durch enable-linger lösen lassen sollen, auch komplett ohne graphischen Desktop.