Projekt "Badezimmerradio"

Mo, 21. Juni 2021, Ralf Hersel

Wer bei GNU/Linux.ch mitgelesen hat, weiss, dass ich mit einem Raspberry Pi 4 eine NAS, einen Musikplayer und einen Video-Streamer gebaut habe. Dadurch wurde mein alter Raspi 3 arbeitslos. Da ich gerne morgens im Badezimmer Musik höre, und zwar ohne Sprachbeiträge, stand eine Lösung für einen Internet-Radioplayer aus. Bisher diente mein altes BQ Aquaris E4.5 mit Ubuntu Touch als Playback-Gerät, bis der Akku des Smartphones platzte. Zwischenzeitlich hatte ich ein kleines FM-Radio im Einsatz, was aber aufgrund der Senderauswahl und des schlechten Empfangs nicht überzeugen konnte. Bühne frei für den Raspi 3.

Meine ursprüngliche Idee war es, den Raspi 3 mit ein paar Hardwaretasten über die GPIO-Pins zu verbinden, um das Radio ein- und auszuschalten, bzw. zwischen Internetradio-Sendern umschalten zu können. Da ich morgens nur halb lebe, wurde diese Idee wieder verworfen. Stattdessen habe ich mich für eine Eintasten-Lösung entschieden.

Auf dem Spiegelschrank im Bad hockt eine Boombox, die per 3.5mm Stereo-Klinke vom Raspi angespielt wird. Bekanntermassen ist die Audioqualität des Raspis, sowohl über HDMI, als auch über den analogen Klinkenanschluss miserabel. Das macht aber nichts; morgens zählt für mich Lautstärke mehr als Qualität.

Den Raspi habe ich im Spiegelschrank verstaut und über Wi-Fi mit dem Router verbunden. Um am Morgen eine Eintasten-Lösung zur erreichen, verlasse ich mich auf CRON-Einstellungen für Wochentage und für das Wochenende. Montag bis Freitag soll der Internet-Radiosender von 6:30 bis um 8:00 Uhr spielen und am Wochenende von 10:30 bis um 12:00 Uhr (ja, ich bin Spätaufsteher). Die Einstellungen dafür sehen so aus und werden mit dem Befehl crontab -e eingetragen:

25 6 * * 1-5 /home/ralf/dev/badradio/radio_cron.sh
# At 06:25 on every day-of-week from Monday to Friday
30 10 * * 6-7 /home/ralf/dev/badradio/radio_cron.sh
# At 10:30 on every Saturday and Sunday

Mit dem Befehl crontab -l kann man überprüfen, ob die Einträge registriert wurden. Wie ihr seht, starten die beiden CRON-Einträge jeweils die Datei /home/ralf/dev/badradio/radio_cron.sh. Dieses Shell-Skript könnt ihr selbstverständlich in ein beliebiges Verzeichnis legen. Der Inhalt des Skriptes sieht so aus:

#!/bin/bash
cd ~/dev/badradio/;
date >> radio_cron.log
mpv http://www.iloveradio.de/ilove2dance.m3u &
echo started >> radio_cron.log
sleep 90m
killall mpv
echo stopped >> radio_cron.log

Was passiert hier? Zuerst wird in das 'current working directory' gewechselt, damit die Log-Datei dort gespeichert wird. Dann wird ein initialer Log-Eintrag mit dem Datum in die Log-Datei geschrieben. Danach wird ein Internet-Radiosender mit dem Programm MPV gestartet. MPV muss vorher auf dem Raspi installiert werden:

sudo apt install mpv

Dann wird die Startzeit für das Playback in die Log-Datei geschrieben. Anschliessend wird der Sender für 90 Minuten abgespielt. Danach wird der Player MPV beendet und die Stopzeit in die Log-Datei geschrieben. Das Schreiben in die Log-Datei ist selbstverständlich optional; die entsprechenden Zeilen können aus dem Skript entfernt werden.

Nachdem man die CRON-Einstellung verändert hat und das Shell-Skript ausführbar gemacht hat (mit chmod 755 radio_cron.sh), muss der Raspi neu gestartet werden: sudo reboot. Danach steht dem Singen unter der Dusche nichts mehr im Wege. Ach halt, da wäre noch eine Kleinigkeit namens PulseAudio.

Falls ihr Glück habt, könnt ihr im Panel von Raspberry-Pi-OS mit einem Rechtsklick auf den Lautstärkeregler, das Ausgabegerät auf 'Headphones' umschalten. Seht ihr dort jedoch die Meldung 'No devices found', dann heisse ich euch herzlich willkommen im Club. Wenn euch PulseAudio mit Arbeitsverweigerung nervt, könnt ihr dem ein Ende setzen, indem ihr PulseAudio deinstalliert und stattdessen dem alten ALSA vertraut. Das geht so:

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

Danach könnt ihr in der Datei /usr/share/alsa/alsa.conf diese Einstellungen ändern, um den Headphones-Ausgang als Standard zu setzen:

defaults.ctl.card 1
defaults.pcm.card 1

Dort steht die 0 für den HDMI-Ausgang und die 1 für den 3.5mm Klinkenstecker. Seid bitte vorsichtig bei der Veränderung der Audio-Einstellungen. Anpassungen können dazu führen, dass andere Geräte (z.B. euer Fernseher über HDMI) nicht mehr korrekt angespielt werden.

Und jetzt viel Spass beim Singen unter der Dusche.