Internetradio mit Raspberry Pi & JBL Bluetooth-Soundbar

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:

webradio-mit-jbl-bt-soundbar-uebersicht
Übersicht der JBL-Soundbar-Ankopplung

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].

webradio-mit-jbl-bt-soundbar-schaltung
Anschluss der Taster und der LED an die GPIO-Pins des Raspberry Pi
Internetradio-Raspberry-Pi-soundbar-2
Abbildung 3: Außenansicht Gehäuse Raspberry Pi mit Tastern und LED
Internetradio-Raspberry-Pi-soundbar-3
Abbildung 4: Innenansicht Deckel Gehäuse Raspberry Pi
Internetradio-Raspberry-Pi-soundbar-1
Abbildung 5: Gehäuse Raspberry Pi mit angeschlossenen Tastern und LED

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
Textbasierte Grafik des alsamixer
Textbasierte Grafik des 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

Schreibe einen Kommentar