Idee des Internetradios
Ich bin stolzer Eigentümer einer JBL Bluetooth-Soundbar Charge2+ (oder auch nur JBL Soundbar oder Soundbar) und baue daraus ein Internetradio mit Raspberry Pi. Selbstverständlich ist es möglich, diese Soundbar mit einem MP3-Stream von einem Smartphone aus anzusteuern, dies erfordert aber mehrere Klicks. Um das schließlich zu minimieren, soll ein Raspberry Pi dies übernehmen. An den Raspberry Pi (im Folgenden auch nur Raspberry oder Raspi) sind mehrere Taster angeschlossen, um bestimmte Internetradiosender wählen zu können oder auch die Wiedergabe zu stoppen. Die JBL Soundbar kann nicht aufgeweckt werden, stattdessen muss sie vor der Ansteuerung eingeschaltet werden. Webradio steht als Synonym für Internetradio.
Im Netz findet sich zwar die Aussage, dass ein Raspberry Pi 2 ausreichend ist, aber wegen einem einigermaßen noch aktuellen Betriebssystem soll ein Raspberry Pi 3B eingesetzt werden. Wegen positiven Erfahrungen soll stattdessen Ubuntu Server 24.04 LTS genutzt werden. Primär geht es um die Wiedergabe von Webradiosendern, für Testzwecke wird jedoch auch die Wiedergabe von MP3-Dateien eingerichtet.
Hinweise zur Umsetzung
Das ganze Konstrukt funktioniert so: Die JBL Soundbar wird einmalig am Raspberry Pi angelernt. Der Raspberry Pi spielt einen Radiosender permanent ab, die angeschlossenen Taster wechseln die Radiosender. Das Ausschalten der JBL Soundbar kappt die Bluetooth-Verbindung lediglich. Ein neuerliches Einschalten der Soundbar startet daraufhin erneut die Wiedergabe.
Zunächst zur Verwunderung: Die Theorie hört sich zunächst ganz simpel und Raspberry-like an, wenn da nicht ausgerechnet das Audio- und Bluetooth-System auf dem Microrechner wäre. Ein Problem ist das geplante Handling: Wenn der Raspberry Pi eingeschaltet wird, soll er sich initial mit der Soundbar verbinden, ein Anmelden eines Benutzers ist eigentlich nicht geplant. Und hier beißt sich die Katze in den Schwanz – wenn kein Benutzer angemeldet ist, werden Audio und Bluetooth nicht automatisch hochgefahren. Wenn man das irgendwie hinbekommt, stehen am Ende Systemrechte im Weg.
Ja, ich gebe es zu – ich habe Unterstützung durch die Google KI gesucht. Nach 120 (!) Seiten Konversation (generierte PDFs aus dem Browser) war es nicht möglich, den Ansatz aus dem vorherigen Abschnitt umzusetzen. Die finale Lösung sieht jetzt so aus, dass sich der Benutzer anmeldet, um eine laufende Session zu erreichen, dann kommen Audio und Bluetooth hoch und dann kann der oben beschriebene Handshake mit der JBL Soundbar vorgenommen werden. Jaaaaa, das ist nicht optimal, ich bin jedem für eine intelligentere Lösung dankbar.
Hinweis: Es ist normalerweise üblich, den Raspberry mit WLAN ins lokale Netzwerk einzubinden. Es hat sich aber gezeigt …
Übersicht der JBL-Soundbar-Ankopplung
Ziemlich am Anfang eines Projekts steht bei mir vielfach eine Handskizze, aus der zu ersehen ist, welche Komponenten beteiligt sind und wie diese miteinander zusammenspielen. Gerade weil dieser Blogeintrag wegen einiger Prosa etwas länger geworden ist, hilft ein Zurückblättern zu der Skizze dabei, den Überblick am Ende zu behalten:

Zusammenstellung der Eckwerte
Als Erstes beginnen wir damit, die vorgesehene Technik und Software zusammenzustellen. Die Listings in den einzelnen Abschnitten werden vollständig wiedergegeben. Dies ist meiner eigenen Erfahrung geschuldet, dass alles nur komplett funktioniert. Die vorgeschlagene Lösung kann selbstverständlich ohne großen Aufwand auf andere Hardware oder eine VM portiert werden. Zur Kontrolle dienen hier die kompletten Listings.
- Rechner Raspberry Pi 3B mit 1 GiB Memory
– Hostname: green004
– IP-Adresse: 172.24.12.133
– Betriebssystem: Ubuntu Server 24.04.4 LTS
– Das aktuelle Betriebssystem Ubuntu Server 26.04 ist für den Raspberry Pi 3B nicht mehr verfügbar.
– Kernel: 6.8.0-1060 (Stand 08/2026) - Von mir verwendete Host- und Benutzernamen sowie IP-Adressen sind komplett frei wählbar
- Der verwendete Non-Root-Benutzer heißt installer, das Homeverzeichnis
/home/installer/ - JBL BT Soundbar Charge2+
– MAC-Adresse: 0C:A6:94:E9:1F:51 - Taster und LED
– Taster 1 – GPIO20
– Taster 2 – GPIO21
– Taster 3 – GPIO23
– LED 1 (blau) – GPIO24
In den Deckel des Raspberry-Gehäuses sind die drei Tasten und eine Status-LED eingearbeitet, der Lüfter hat sich mit 30 mm Kantenlänge als zu knapp bemessen herausgestellt, hier empfiehlt sich ein 40-mm-Modell. Aus Designgründen wurde eine blaue LED verwendet. Obwohl die Durchlassspannung im Bereich von 3,0 bis 3,4 Volt beträgt, sollte trotzdem ein Vorwiderstand für ca. 0,3 V Spannungsabfall verwendet werden. Dies entspricht damit einem Widerstandswert von 47 bis 100 Ohm [RTE].




Medien wiedergeben
MP3-Dateien abspielen
Zur Vorbereitung werden einige MP3-Dateien lokal in den Ordner /home/installer/music/ hochgeladen. Danach wird der Audioplayer mpg123 installiert. Zur Verfügung steht ein Headset, das sowohl mit einem Klinkenstecker als auch einem USB-Adapter angeschlossen werden kann. Das Headset wird zunächst mit dem Klinkenstecker angeschlossen. Die Lautstärke kann danach über das Tool alsamixer eingestellt werden.
Die Ausgabe der MP3-Dateien funktioniert zuerst am Kopfhörerausgang. Das Terminalfenster zeigt durch den alsamixer eine textbasierte Grafik an, die Lautstärkeregelung erfolgt anschließend über die Cursor-hoch- und Cursor-runter-Tasten der Tastatur. Soll mpg123 ohne Root-Rechte und damit ohne sudo gestartet werden, ist der von mir genutzte Non-root-Benutzer installer in die Gruppe audio aufzunehmen.
Sind auch Zugriffe auf Videokomponenten geplant, kann hier auch gleich die Aufnahme in die Gruppe video erfolgen. Zum Aktivieren muss sich der Benutzer installer am Ende einmal neu anmelden.
sudo apt install -y mpg123 alsa-utils sudo usermod -aG audio,video $USER mpg123 /home/installer/music/<mp3-datei.mp3> alsamixer

Webradio wiedergeben
Als Medienplayer kommt der extrem ressourcensparende mpv zum Einsatz. Er kann von einem Script aus gestartet werden und benötigt keine GUI. Im vorherigen Kapitel wurde der Benutzer installer bereits in die Gruppe audio aufgenommen, damit startet mpv ebenfalls mit Benutzer-Rechten.
sudo apt install -y mpv mpv http://<url-zum-radiostream.m3u>
Eine Liste mit einigen MP3-Streams ohne Anspruch auf Vollständigkeit ist im Blogbeitrag Tastaturblock LogiLink ID0120 zu finden. Der Auswahl wird am besten der Begriff Frühstücksradio gerecht. Es ist möglich, dass sich hier kurzfristig Änderungen bemerkbar machen, HR3 hat Stand 08/2026 bereits den Umstieg auf eine App unter dem ARD-Dach angekündigt:
Installation Bluetooth
Die Anbindung einer Bluetooth-Soundbar erfolgt am Besten mit den zwei Paketen pi-bluetooth und bluez. Diese beiden Pakete müssen in Ubuntu Server 24.04.4 nachinstalliert werden. Bei der Installation wird angezeigt, dass für Bluetooth ein Symlink generiert wird. Es wurde in 08/2026 gleichzeitig ein neuer Kernel installiert. Damit dieser aktiv wird, ist ein Reboot notwendig. Zur Kontrolle wird zusätzlich nach einem Reboot kontrolliert, ob Bluetooth gestartet ist – wie erwartet läuft der Service.
sudo apt update && sudo apt -y upgrade sudo apt install -y pi-bluetooth bluez Created symlink /etc/systemd/system/dbus-org.bluez.service ? /usr/lib/systemd/system/bluetooth.service. Created symlink /etc/systemd/system/bluetooth.target.wants/bluetooth.service ? /usr/lib/systemd/system/bluetooth.service. sudo reboot sudo systemctl status bluetooth
Bluetooth-Zugriff auf JBL Soundbar einrichten
Der Zugriff auf Bluetooth-Geräte wird mit dem Tool bluetoothctl verwaltet. Grundsätzlich sind nacheinander folgende Tätigkeiten bis zu einem funktionierenden Connect vorzunehmen:
- Einschalten des Bluetooth-Moduls –
power on - Aktivieren des Pairing-Agenten, i. d. R. erfolgt dies bereits automatisch –
agent on - Scannen nach Geräte –
scan on - Pairing mit der Soundbar –
pair <MAC-Adresse> - Abschalten des Scannens nach erfolgreichem Pairing –
scan off - Sichern eines späteren automatischen Wiederverbindens –
trust <MAC-Adresse> - Connecten mit der Soundbar –
connect <MAC-Adresse> - Abfrage verbundene Geräte –
devices Paired - Abfrage verbundene Geräte (ältere Bluetooth-Versionen) –
paired-devices
So schön das Betriebssystem Ubuntu Server auch ist, es präsentierte sich eine hartnäckige Fehlermeldung. Zur Demonstration habe ich die Beseitigung dieses Fehlers hier im Text gelassen, bei mehrfachen Installationen sind bei mir keine weiteren Fehler aufgetaucht. Ich habe die Listings auch absichtlich etwas umfangreicher gelassen, um besser sehen zu können, an welcher Konfigurationsstelle man gerade unterwegs ist. scan on liefert sämtliche Bluetooth-Geräte der Umgebung, die Flut hier zwischenzeitlich mit einem scan off eindämmen.
bluetoothctl
Agent registered
[CHG] Controller B8:27:EB:4E:57:E6 Pairable: yes
[bluetooth]# power on
[bluetooth]# Changing power on succeeded
[bluetooth]# scan on
...
[NEW] Device 29:18:9E:C8:1C:9A 29-18-9E-C8-1C-9A
...
Damit der Raspberry Pi die JBL Soundbar finden kann, diese vor dem Absetzen des Pairing-Befehls selbst in den Pairing-Modus versetzen – die Bluetooth-LED blinkt auf der Soundbar in weiß:
[bluetooth]# pair 0C:A6:94:E9:1F:51 Attempting to pair with 0C:A6:94:E9:1F:51 [CHG] Device 0C:A6:94:E9:1F:51 Connected: yes [JBL Charge 2+]# [CHG] Device 0C:A6:94:E9:1F:51 Bonded: yes [JBL Charge 2+]# [CHG] Device 0C:A6:94:E9:1F:51 UUIDs: 00001108-0000-1000-8000-00805f9b34f b ... [JBL Charge 2+]# [CHG] Device 0C:A6:94:E9:1F:51 UUIDs: 00001131-0000-1000-8000-00805f9b34f b [JBL Charge 2+]# [CHG] Device 0C:A6:94:E9:1F:51 ServicesResolved: yes [JBL Charge 2+]# [CHG] Device 0C:A6:94:E9:1F:51 Paired: yes [JBL Charge 2+]# Pairing successful [JBL Charge 2+]# [CHG] Device 0C:A6:94:E9:1F:51 ServicesResolved: no [CHG] Device 0C:A6:94:E9:1F:51 Connected: no [bluetooth]# trust 0C:A6:94:E9:1F:51 [bluetooth]# [CHG] Device 0C:A6:94:E9:1F:51 Trusted: yes [bluetooth]# Changing 0C:A6:94:E9:1F:51 trust succeeded [bluetooth]# connect 0C:A6:94:E9:1F:51 Attempting to connect to 0C:A6:94:E9:1F:51 [bluetooth]# Failed to connect: org.bluez.Error.Failed br-connection-profile-unavailable [bluetooth]# devices Paired Device 0C:A6:94:E9:1F:51 JBL Charge 2+ ältere bluetoothctl-Versionen: [bluetooth]# paired-devices [bluetooth]# exit
Die JBL Soundbar liefert beim Connect-Befehl eine Fehlermeldung!
Behebung Connect-Fehler – org.bluez.Error.Failed br-connection-profile-unavailable
Im Netz wird bei einer Suche dieser Inhalt zurückgegeben: This error typically occurs when your audio server (PipeWire/WirePlumber) fails to load the necessary Bluetooth A2DP audio profiles. … If the error persists, Ubuntu 24.04 may be missing the libspa-0.2-bluetooth plugin required to route Bluetooth audio. [FLM]
Also wird im nächsten Schritt das Paket libspa-0.2-bluetooth nachinstalliert und zur Sicherheit ein Reboot ausgeführt:
sudo apt install -y libspa-0.2-bluetooth sudo reboot bluetoothctl [bluetooth]# connect 0C:A6:94:E9:1F:51 Attempting to connect to 0C:A6:94:E9:1F:51 [bluetooth]# Failed to connect: org.bluez.Error.Failed br-connection-profile-unavailable [bluetooth]# exit
Nach dem Neustart liefert die Kontrolle mit bluetoothctl allerdings, dass beim Ubuntu Server 24.04.4 auch nach der Installation von libspa-0.2-bluetooth der Fehler weiterhin bestehen bleibt.
Eine weitere Recherche im Netz liefert …
Weiterbearbeitung des Fehlers
Es muss … installiert werden …
Bei der Installation wird angezeigt, dass für PipeWire, PipeWire-Pulse und WirePlumber Symlinks im Benutzerkontext generiert werden, der Enable-Befehl ist damit überflüssig.
sudo apt install -y pipewire-audio pipewire-pulse wireplumber libspa-0.2-modules systemctl --user enable pipewire pipewire-pulse wireplumber sudo reboot bluetoothctl Waiting to connect to bluetoothd...[bluetooth]# hci0 new_settings: powered bondable ssp br/edr le secure-conn [bluetooth]# Agent registered [bluetooth]# [CHG] Controller B8:27:EB:4E:57:E6 Pairable: yes [bluetooth]# devices Device 0C:A6:94:E9:1F:51 JBL Charge 2+ [bluetooth]# disconnect 0C:A6:94:E9:1F:51 Attempting to disconnect from 0C:A6:94:E9:1F:51 [bluetooth]# Successful disconnected [bluetooth]# remove 0C:A6:94:E9:1F:51 [bluetooth]# [DEL] Device 0C:A6:94:E9:1F:51 JBL Charge 2+ [bluetooth]# Device has been removed [bluetooth]# scan on
Die JBL Soundbar in den Pairing-Modus versetzen – die weiße Bluetooth-LED blinkt:
[bluetooth]# pair 0C:A6:94:E9:1F:51 Attempting to pair with 0C:A6:94:E9:1F:51 [CHG] Device 0C:A6:94:E9:1F:51 Connected: yes [JBL Charge 2+]# [CHG] Device 0C:A6:94:E9:1F:51 Bonded: yes ... [JBL Charge 2+]# [CHG] Device 0C:A6:94:E9:1F:51 ServicesResolved: yes [JBL Charge 2+]# [CHG] Device 0C:A6:94:E9:1F:51 Paired: yes [JBL Charge 2+]# Pairing successful [JBL Charge 2+]# trust 0C:A6:94:E9:1F:51 [JBL Charge 2+]# connect 0C:A6:94:E9:1F:51 Attempting to connect to 0C:A6:94:E9:1F:51 [CHG] Device 0C:A6:94:E9:1F:51 Connected: yes [JBL Charge 2+]# [NEW] Endpoint /org/bluez/hci0/dev_0C_A6_94_E9_1F_51/sep1 [JBL Charge 2+]# [NEW] Transport /org/bluez/hci0/dev_0C_A6_94_E9_1F_51/sep1/fd1 [JBL Charge 2+]# Connection successful [JBL Charge 2+]# [CHG] Transport /org/bluez/hci0/dev_0C_A6_94_E9_1F_51/sep1/fd1 Volume: 0x0028 (40) [JBL Charge 2+]# [CHG] Device 0C:A6:94:E9:1F:51 ServicesResolved: yes [JBL Charge 2+]# [CHG] Transport /org/bluez/hci0/dev_0C_A6_94_E9_1F_51/sep1/fd1 Volume: 0x0029 (41) [JBL Charge 2+]# exit
Die JBL Soundbar hat sich ordnungsgemäß connected.
Kontrolle Bluetooth-Connect mit Reboot
Dieser Abschnitt ist nur eine Kontrolle, um zu prüfen, ob das Zusammenspiel Raspberry — Soundbar auch funktioniert, wenn man aus dem Urlaub zurückkommt und alle Netzgeräte wieder hochfährt (ggf. überspringen).
sudo reboot bluetoothctl [bluetooth]# Agent registered [bluetooth]# [CHG] Controller B8:27:EB:4E:57:E6 Pairable: yes [bluetooth]# connect 0C:A6:94:E9:1F:51 Attempting to connect to 0C:A6:94:E9:1F:51 [CHG] Device 0C:A6:94:E9:1F:51 Connected: yes [JBL Charge 2+]# [NEW] Endpoint /org/bluez/hci0/dev_0C_A6_94_E9_1F_51/sep1 [JBL Charge 2+]# [NEW] Transport /org/bluez/hci0/dev_0C_A6_94_E9_1F_51/sep1/fd0 [JBL Charge 2+]# Connection successful [JBL Charge 2+]# [CHG] Transport /org/bluez/hci0/dev_0C_A6_94_E9_1F_51/sep1/fd0 Volume: 0x0028 (40) [JBL Charge 2+]# [CHG] Device 0C:A6:94:E9:1F:51 ServicesResolved: yes [JBL Charge 2+]# [CHG] Transport /org/bluez/hci0/dev_0C_A6_94_E9_1F_51/sep1/fd0 Volume: 0x0029 (41) [JBL Charge 2+]# exit
Der Connect von bluetoothctl aus funktioniert nach einem Reboot sofort! Die Kommandos
für MP3 und Internetradio werden ohne sudo abgesetzt, da die Tools mit Benutzerrechten laufen.
mpv https://liveradio.swr.de/sw282p3/swr1bw/play.mp3 (Beispiel) mpg123 /home/installer/music/’Born to Run.mp3’ (Beispiel)
An diesem Punkt ist die Basis-Bluetooth-Installation abgeschlossen, der ausgewählte Radiosender
und eine MP3-Musikdatei werden problemlos wiedergegeben.
Es ist aber bereits an dieser Stelle anzumerken, dass der Test im Terminal vom angemeldeten
Benutzer installer aus erfolgt. Für die nächsten Schritte zum automatisierten Betrieb ohne die
Anmeldung eines Benutzers wird sich diese Situation als herausfordernd darstellen.
Problematik Wiedergabe ohne Anmeldung Benutzer
Hier noch einen ausführlichen Text mit:
- normalerweise wird der Raspberry Pi eingeschaltet, fährt hoch, es wird eine Taste gedrückt, um
den Sender zu starten. Das ist aber nur beim allerersten Mal möglich, das Starten des Raspis dauert
zu lange. - es wird eine Taste gedrückt, um die Wiedergabe zu stoppen
- Der Raspi läuft weiter und wartet auf das nächste Drücken der Sendertaste, mit einer anderen
Taste kann der Sender gewechselt werden - Bei dieser Vorgehensweise meldet sich kein Benutzer an
- Und genau das ist das Problem bei einem Raspberry Pi
- Audio und Bluetooth erfordern einen angemeldeten Benutzer, sonst erfolgt keine Wiedergabe
- noch weitere Erklärungen …
Scripte zur Wiedergabe von Internetradio
Es wird davon ausgegangen, dass der Benutzer installer angemeldet ist und Scripte dann manuell gestartet werden oder dass Scripte nach dem Anmelden des Benutzers installer automatisch gestartet werden. Dieser automatische Start ist über Cronjobs des Benutzers oder Services des Benutzers möglich. Systemweite Cronjobs oder Services sollen nicht genutzt werden.
Alle Scripte werden im Home-Verzeichnis des Benutzers installer im Ordner webradio-jbl abgelegt.
cd /home/installer mkdir webradio-jbl
Shellscript zum Starten des Radiosenders SWR1 BW
Vor dem Ausführen des Shellscripts ist die JBL Soundbar einzuschalten.
vi /home/installer/webradio-jbl/connect_jbl-soundbar_and_swr1bw.sh #!/bin/bash # alle wiedergaben stoppen killall mpv # connect mit jbl soundbar echo -e "connect 0C:A6:94:E9:1F:51\nexit" | bluetoothctl # swr1 bw wiedergeben mpv https://liveradio.swr.de/sw282p3/swr1bw/play.m3u chmod 755 /home/installer/webradio-jbl/connect_jbl-soundbar_and_swr1bw.sh /home/installer/webradio-jbl/connect_jbl-soundbar_and_swr1bw.sh
Im Kapitel Webradio wiedergeben sind weitere Radiosender gelistet.
Shellscript zum Starten des Radiosenders HR3
Da in den nächsten Abschnitten darauf ein Bezug erfolgt, hier noch das Shellscript für HR3:
vi /home/installer/webradio-jbl/connect_jbl-soundbar_and_hr3.sh #!/bin/bash # alle wiedergaben stoppen killall mpv # connect mit jbl soundbar echo -e "connect 0C:A6:94:E9:1F:51\nexit" | bluetoothctl # hr3 wiedergeben mpv http://metafiles.gl-systemhaus.de/hr/hr3_2.m3u chmod 755 /home/installer/webradio-jbl/connect_jbl-soundbar_and_hr3.sh
Shellscript zum Stoppen des Webradios
Der Vollständigkeit halber:
vi /home/installer/webradio-jbl/stopp_webradio.sh #!/bin/bash # alle wiedergaben stoppen killall mpv chmod 755 /home/installer/webradio-jbl/stopp_webradio.sh
Python-Script zur Steuerung des Webradios
Die Steuerung des Webradios wird über ein zentrales Pythonscript realisiert, das nach der Initialisierung in eine Endlosschleife wechselt und auf das Drücken eines Tasters wartet. Die drei Taster lösen folgende Events aus:
- Taster 1 – Starten Webradio SWR1 BW
- Taster 2 – Starten Webradio HR3
- Taster 3 – Beenden Webradiowiedergabe
Nach dem Drücken eines Tasters wird das zugehörige Script aus den Kapiteln Shellscript zum
Starten des Radiosenders SWR1 BW, Shellscript zum Starten des Radiosenders HR3 oder Shellscript zum Stoppen des Webradios gestartet. Die drei Taster und eine zusätzliche Status-LED sind an GPIO-Ports entsprechend dem Kapitel Zusammenstellung der Eckwerte angeschlossen.
Python nutzt zur GPIO-Ansteuerung die moderne Bibliothek gpiozero, diese muss noch nachinstalliert werden.
sudo apt install -y python3-gpiozero
Der Benutzer installer hat beim Betriebssystem Ubuntu Server per default keinen Zugriff auf die GPIO-Ports. Um diesen zu erreichen, ist der Benutzer der Gruppe dialout hinzuzufügen. Bei anderen Raspberry-Betriebssystemen wird im Netz auf die Gruppe gpio verwiesen, ggf. muss diese dann neu angelegt und berechtigt werden. Zur Aktivierung ist der Rechner neu zu starten.
sudo usermod -aG dialout $USER sudo reboot
Das erste Listing running_webradio_basic.py beinhaltet nur die notwendigen Kommandos:
vi /home/installer/webradio-jbl/running_webradio_basic.py
#!/usr/bin/python3
from signal import pause
from subprocess import Popen
from gpiozero import Button, LED
from time import sleep
SHELL_SCRIPT1 = "/home/installer/webradio-jbl/connect_jbl-soundbar_and_swr1bw. sh"
SHELL_SCRIPT2 = "/home/installer/webradio-jbl/connect_jbl-soundbar_and_hr3.sh"
SHELL_SCRIPT3 = "/home/installer/webradio-jbl/stopp_webradio.sh"
taster1 = Button(20)
taster2 = Button(21)
taster3 = Button(23)
led1 = LED(24)
def taster1_gedrueckt():
Popen(["bash", SHELL_SCRIPT1])
def taster2_gedrueckt():
Popen(["bash", SHELL_SCRIPT2])
def taster3_gedrueckt():
Popen(["bash", SHELL_SCRIPT3])
taster1.when_pressed = taster1_gedrueckt
taster2.when_pressed = taster2_gedrueckt
taster3.when_pressed = taster3_gedrueckt
try:
Popen(["bash", SHELL_SCRIPT2])
sleep(1)
except KeyboardInterrupt:
print("\nSchleife manuell beendet.")
pause()
chmod 755 /home/installer/webradio-jbl/running_webradio_basic.py
/home/installer/webradio-jbl/running_webradio_basic.py
Im zweiten Listing running_webradio.py sind Fehlerroutinen, zusätzliche Kommentare und die Ansteuerung der Status-LED enthalten:
vi /home/installer/webradio-jbl/running_webradio.py
#!/usr/bin/python3
# script zum starten von zwei webradiosendern und stoppen der wiedergabe
# dateiname: running_webradio.py
# taster1 - swr1bw, taster2 - hr3, taster3 - aus, led1 - status-led
from signal import pause
from subprocess import Popen
from gpiozero import Button, LED
from time import sleep
# webradio-scripte
SHELL_SCRIPT1 = "/home/installer/webradio-jbl/connect_jbl-soundbar_and_swr1bw.sh"
SHELL_SCRIPT2 = "/home/installer/webradio-jbl/connect_jbl-soundbar_and_hr3.sh"
SHELL_SCRIPT3 = "/home/installer/webradio-jbl/stopp_webradio.sh"
# taster und led zuweisen
taster1 = Button(20)
taster2 = Button(21)
taster3 = Button(23)
led1 = LED(24)
# funktionen definieren
def taster1_gedrueckt():
print("SWR1 BW wird eingeschaltet ...")
led1.on()
sleep(0.5)
led1.off()
try:
# popen startet das script im hintergrund
Popen(["bash", SHELL_SCRIPT1])
except Exception as e:
print(f"Fehler beim Starten des Scripts: {e}")
def taster2_gedrueckt():
print("HR3 wird eingeschaltet ...")
led1.on()
sleep(0.5)
led1.off()
try:
# popen startet das script im hintergrund
Popen(["bash", SHELL_SCRIPT2])
except Exception as e:
print(f"Fehler beim Starten des Scripts: {e}")
def taster3_gedrueckt():
print("Webradio beendet ...")
led1.on()
sleep(0.5)
led1.off()
try:
# popen startet das script im hintergrund
Popen(["bash", SHELL_SCRIPT3])
except Exception as e:
print(f"Fehler beim Starten des Scripts: {e}")
# ereignis zuweisen (ohne klammern hinter der funktion)
taster1.when_pressed = taster1_gedrueckt
taster2.when_pressed = taster2_gedrueckt
taster3.when_pressed = taster3_gedrueckt
# beim scriptstart led1 5 sekunden lang einschalten und hr3 wiedergeben
print("Status-LED 5 Sekunden lang einschalten")
led1.on()
sleep(5)
led1.off()
print("HR3 wird eingeschaltet ...")
try:
# popen startet das script im hintergrund
Popen(["bash", SHELL_SCRIPT2])
except Exception as e:
print(f"Fehler beim Starten des Scripts: {e}")
# endlosschleife
print("Warten auf Tasterdruck (Endlosschleife)")
try:
sleep(1)
except KeyboardInterrupt:
print("\nSchleife manuell beendet.")
# programm am laufen halten
pause()
chmod 755 /home/installer/webradio-jbl/running_webradio.py
/home/installer/webradio-jbl/running_webradio.py
Python-Script beim Login von installer ausführen
Im Kapitel Python-Script zur Steuerung des Webradios wurde das zentrale Script zum Steuern des Webradios beschrieben. Dieses Script soll automatisch gestartet werden, wenn sich der Benutzer installer am Raspberry anmeldet. Die Notwendigkeit dieses Anmelde-Constructs wurde im Kapitel Idee des Internetradios beschrieben. Um zu verhindern, dass das Script bei jedem Login startet, erfolgt dieses nur beim Login des Benutzers installer bei einer lokalen Terminalsession (auch TTY-Session genannt), nicht bei SSH.
Das Webradio-Python-Script wird in die versteckte Konfigurationsdatei .bashrc im
Home-Verzeichnis /home/installer/ eingetragen und damit beim Öffnen einer TTY-Session
ausgeführt. Es ist für die Funktion des Python-Scripts unerheblich, ob die JBL Soundbar ein- oder
ausgeschaltet ist. Bei eingeschalteter Box ist das Webradio sofort zu hören, bei ausgeschalteter Box
erst, wenn diese eingeschaltet wird und sich der Raspberry connected hat.
vi /home/installer/.bashrc
Einfügen am Dateiende:
# pruefen, ob die session auf einer lokalen tty-session laeuft
if [[ "$(tty)" == /dev/tty[0-9]* ]]; then
# exec ersetzt die shell durch das skript
exec /home/installer/webradio-jbl/running_webradio.py
fi
installer nach einem Boot automatisch anmelden
Um einen Benutzer nach einem Systemstart automatisch mit einer lokalen Terminalsession (auch TTY-Session genannt) anzumelden gibt es mindestens zwei Möglichkeiten, entweder über einen Cronjob oder über Systemd. Ich entscheide mich für Systemd, auch weil es in [AUB] sehr gute Hinweise zum Thema gibt. Es ist wichtig, dass der Service das Login zwingend nur für eine TTY-Session durchführt. Ansonsten würde jedes Anmelden mit einer SSH-Session über das Netzwerk ebenfalls zum Starten des Webradio-Python-Scripts in der .bashrc führen. Ein Doppel- oder Dreifachstart ist aber nicht erwünscht und würde die Primär-Session ggf.
beeinflussen.
PRÜFEN GEGEN VORHERIGES KAPITEL!
Als erstes wird im Systemordner /etc/systemd/system/ ein neuer Ordner für unseren Service angelegt. In diesen Ordner wird die Servicedatei mit dem Content aus dem nachfolgenden Listing gespeichert und der Rechner neu gestartet. Das ExecStart-Kommando meldet den Benutzer installer automatisch und ohne die Eingabe eines Passworts an. -noclear ist für die Optik gut und verhindert, dass der Bildschirm vor dem Login geleert wird, %I ist ein Platzhalter für die Terminalkennung und $TERM übergibt den Terminaltyp an das Login-Programm. Durch type=idle wartet der Service, bis alle anderen Systemdienste geladen sind.
sudo mkdir -p /etc/systemd/system/getty@tty1.service.d
sudo vi /etc/systemd/system/getty@tty1.service.d/override.conf
Einfügen:
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin installer --noclear %I $TERM
Type=idle
sudo reboot
Mit einer parallelen SSH-Anmeldung am Raspberry kann geprüft werden, ob das Webradio-Python-Script korrekt gestartet wurde:
who installer tty1 2026-08-17 15:42 installer pts/0 2026-08-17 15:44 (172.24.12.106) ps -ef | grep webradio install+ 1030 824 20 15:42 tty1 00:00:27 /usr/bin/python3 /home/installer/webradio-jbl/running_webradio.py install+ 1140 1030 0 15:43 tty1 00:00:00 bash /home/installer/webradio-jbl/connect_jbl-soundbar_and_hr3.sh
Damit funktioniert alles und viel Spass beim eigenen Projekt!
Über ein Feedback würde ich mich freuen!
Verwendete und weitere Quellen
[RTE] – https://raspberry.tips/elektronik-rechner
[FLM] – https://forums.linuxmint.com/viewtopic.php?t=417932
[AUB] – https://askubuntu.com/questions/679419/how-to-make-autologin-work-in-ubuntu-no-display-manager
Die nachfolgenden Quellen sind bei diesem Thema sehr hilfreich gewesen, vielen Dank an alle Autoren:
https://schmidt-feldberg.de/usb-soundkarte-auf-dem-raspberry-pi-3-einrichten/
https://unix.stackexchange.com/questions/677348/cannot-loadpulseaudio-modules-via-pactl-failure-no-such-entity
http://www.elektronik-kompendium.de/sites//raspberrypi/3101101.htm
https://forum-raspberrypi.de/forum/thread/56306-problem-imzusammenspiel-von-alsa-pulseaudio-und-einer-anwendung/
https://forums.linuxmint.com/viewtopic.php?t=417932