Vorgeschichte
Nachdem ich mich ein wenig in die Handhabung der Raspberry Pi* eingearbeitet hatte, dauerte es nicht lange und ich kaufte mir eine 2. Raspberry Pi* fürs Wohnzimmer. Diese sollte dort einige Schalt- und Messaufgaben (Helligkeitsmessung, Schalten von Geräten mit IR-Empfängern wie HiFi-Decoderstation, TV-Receiver, etc.) übernehmen, damit diese platzsparend auch im Schrank untergebracht werden konnten. Diese Funktionen waren recht zügig umgesetzt und nun lag dieser auch damals schon recht leistungsfähige Mini-Computer hinter dem TV. Da wir viel und gern Radio, vorzugsweise Rockmusik, hören und ein Teufel Soundsystem besitzen auf dem sich diese auch super anhört, kam mir die Idee die sich langweilende Raspberry Pi* um ein Web-Radio zu erweitern, mit welchem wir einfach und bequem zwischen verschiedenen Internet-Radiosendern auswählen können. Das Ganze sollte sich natürlich, wie soll es auch anders sein, nahtlos in die selbstgebaute GUI (englisch: graphical user interface) meiner DIY-Hausautomatisierung* einbinden lassen. Der Startschuss zur Entwicklung des SHAS-Radio war damit gefallen.
Hinweis: Da dieses Projekt mittlerweile doch recht umfangreich geworden ist und Programmierkenntnisse sowohl in HTML, PHP, JavaScript als auch Python erforderlich sind, möchte ich hier keine detaillierte Nachbauanleitung, sondern viel mehr eine Anregung, respektive einen Wegweiser aufzeigen, um technikinteressierten Bastlern vorab eine grobe Richtung beim Start der Umsetzung eines ähnlichen Projektes zu geben. Bei Bedarf gebe ich aber auch gern die zur Installation nötigen Dateien weiter.
KOMMENTAR DES AUTORS
Version 1 – Headless SHAS-Radio für die Hausautomatisierung (2014)
In seiner ersten Version sollte das Radio ohne direkte GUI erstellt werden und ausschließlich über das Netzwerk fernsteuerbar sein, da die Radiofunktion auf der Raspberry Pi* im Wohnzimmer genutzt, aber über die Oberfläche meiner DIY-Hausautomatisierung*, welche wiederum auf einer anderen Raspberry Pi* läuft, bedient werden sollte. Der Plan war den Aufbau so zu gestalten, dass ich bei Bedarf auch weitere Räume mit einer Raspberry Pi* ausstatten und somit um ein Webradio erweitern hätte können. Da die Hausautomatisierung größtenteils in HTML, Javascript und PHP umgesetzt wurde, lag es nahe, dass SHAS-Radio auch mit diesen Sprachen umzusetzen, da damit die Kommunikation zwischen Hausautomatisierung und Radio einfach zu realisieren ist.
Ganz ohne „fremde“ Software ist allerdings die gewünschte Funktionalität nicht umzusetzen gewesen. So nutzte ich für alles was mit dem Abspielen der Radio-Streams oder lokal gespeicherter MP3’s zusammenhängt, einen Mediaplayer namens mplayer* (http://manpages.ubuntu.com/manpages/bionic/de/man1/mplayer.1.html), welcher über die Kommandozeile mittels Parameterübergabe gestartet werden kann. Dieser öffnet dann selbstständig die URL und kümmert sich auch um „fast“ alles was mit Stream in Verbindung steht.
Um einen Stream zu öffnen, führe ich also in PHP das gewünschte Kommando mittels der exec-Methode aus und überlasse den Rest einfach dem Mediaplayer.
//starte mplayer $pid1 = shell_exec("sudo mplayer -slave -input file=Radio_FiFo -quiet -loop 0 -cache 2048 -cache-min 20 ".$Sender. " > StreamInfo.txt &");
Hierbei beinhaltet die Variable $Sender
die URL zum Radiostream. Die Ausgabe des mplayer leite ich mittels
in eine Textdatei um. Aus dieser filtere ich dann die Informationen zum aktuell gespielten Titel, Interpreten, Album, etc. heraus, um dem Nutzer auch ein paar Informationen anzeigen zu können.> StreamInfo.txt
Für die Steuerung des mplayer* (Play, Pause, Vor, Zurück …) verwendete ich eine FIFO-Datei mit dem Namen Radio_FiFo, welche ich mit Hilfe des Kommandozeilenbefehls mkfifo Radio_FiFo
erstellt habe. Diese wird auch beim Startaufruf des Players als Parameter übergeben (siehe oben) und ermöglicht es so mit der aktuellen Playerinstanz zu kommunizieren. Möchte man den Player zum Beispiel pausieren, so geschieht dies durch den Aufruf von shell_exec("echo \"PAUSE\" > Radio_FiFo");
durch die gleiche PHP-Steuerdatei welche auch schon für das Starten des Players zuständig war. Da mplayer* nicht nur Radiostreams, sondern auch MP3’s abspielen kann, baute ich noch eine Funktion ein, welche es möglich macht komplette MP3-Ordner abzuspielen. Hierbei wird nach der Nutzerauswahl des Ordners der Pfad einem PHP-Script übergeben, welches anschließend eine Playlist-Datei mit allen sich im Ordner befindenden *.MP3 Dateien erstellt.
Bedienung (Version 1)
Wie schon erwähnt, sollte sich das SHAS-Radio unauffällig in meine DIY-Hausautomatisierung* integrieren und daher auch leicht per Toucheingabe vom Handy oder Tablet aus bedienbar sein. Da die GUI der Hausautomatisierung auf einzelnen Blöcken basiert, habe ich einen neuen Block für die Radiosteuerung definiert. Dieser beinhaltet auf der Hauptebene lediglich die Knöpfe für die Play-, Reverse-, Forward-Funktion und eine Schaltfläche für das Untermenü, da dies die hauptsächlich benötigten Steuerelemente sind. Der aktuell eingestellte Sender wird durch ein Hintergrundbild, oder bei dem MP3’s durch einen Lauftext angezeigt.
Internet-Radiostream geöffnet | lokaler MP3-Ordner geöffnet | Untermenü erweiterte Einstellmöglichkeiten |
Zum Wechseln der Radiosender und zum Umschalten zwischen Internet-Radiostream oder MP3-Wiedergabe, wurde ein Untermenü für die erweiterten Funktionen hinzugefügt. Dieses wird durch das Klicken auf den Menüknopf geöffnet und eenthält Dropdown-Menüs mit den gespeicherten Radiosendern und MP3-Ordnern. Damit die Änderung der Playerkonfiguration im richtigen SHAS-Radio durchgeführt wird, wurde der Konfigurationsdatei für den Anzeigeblock der Hausautomatisierung, die lokale IP-Adresse der gewünschten Raspberry Pi* und der Pfad zum PHP-Script des Radios hinzugefügt.
Damit waren alle bis hierhin nötigen Funktionen umgesetzt und das Radio verrichtete, bis zur Ablöse durch die Amazon Echo-Dots, zuverlässig seinen Dienst. Spätestens zur Weihnachtszeit ist es dann wieder so weit und das SHAS-Radio V1 darf alle Jahre wieder unsere Weihnachtsalben abspielen, da diese eben nicht über Amazon Music verfügbar sind.
Version 2 – vom netten Gimmick zum Stand-Alone Radio (2016)
Die 2. Version des SHAS-Radio entstand aus der Anfrage eines guten Freundes. Dieser hatte eine HiFi-Anlage aus den 1990ern mit mehreren Decks. Diese hat einen super Klang, doch leider gab es damals noch keine Hardware womit man Internet-Radiosender empfangen konnte. Wir unterhielten uns eines Tages über das Thema Raspberry Pi* und was mit dem Mini-Computer alles möglich sei. Ich erzählte Ihm vom selbst-programmierten, auf meine Bedürfnisse zugeschnittenen Internetradio und er fragte mich, ob ich sowas nicht auch für Ihn bauen könnte. Da er keine Hausautomatisierung besitzt und die Bedienung auch für seine Freundin verständlich und unkompliziert sein sollte, war schnell klar, dass ich hier um ein Display und eine eigene grafische Bedienoberfläche nicht drum herum kommen werde. Die PHP-Dateien zur Steuerung der Playerfunktionen des mplayer* nutze ich vom bereits vorhandenen SHAS-Radio V1. Um die Anzeige der Titel, Interpreten und weiterer Informationen zu verbessern, überarbeitete ich diese lediglich an einigen Stellen.
Zur Anzeige der grafischen Oberfläche bestellten wir zuerst ein 4,3″ Display. Dieses war aber von der Bedienbarkeit nicht wirklich komfortabel und so änderte ich den Aufbau bereits nach kurzer Zeit und verwendete ab da ein 5″-LCD Touch-Display, welches auf die GPIOs des Raspberry Pi* aufgesteckt und zusätzlich mittels HDMI Kabel angeschlossen wird.
5″-LCD Touch-Display |
Für die Anzeige der Radio-GUI richtete ich zuerst nach einer Anleitung wie dieser* (https://stoffl.info/2020/03/25/how-to-raspberry-pi-chromium-kiosk-mode-autostart-und-vollbildmodus/?cn-reloaded=1) den sogenannten Kiosk-Mode für die Raspberry Pi* ein. Der Kiosk-Mode ist ein Modus in dem die Raspberry Pi* nicht in die Kommandozeile oder den Desktop bootet und dann stehen bleibt, sondern direkt nach dem erfolgreichen Bootvorgang einen Webbrowser öffnet und darin eine beliebig wählbare Webseite anzeigt. Dies in Verbindung mit einem Custom-Splashscreen (eigener Boot- und Startbildschirm) lässt kaum noch erahnen, das eine Raspberry Pi* im Hintergrund arbeitet. Die Radio-GUI habe ich anschließend mittels HTML so gestaltet, dass die Bedienung per Touch-Eingabe so problemlos, wie auf dem kleinen Display möglich, durchgeführt werden kann. Für das Anlegen, Sortieren und Löschen der Internet-Radiosender habe ich eine extra Konfigurationsseite erstellt, welche von jedem beliebigen PC, aus dem gleichen Netzwerk, erreicht werden kann. Das Hinzufügen von MP3s zur Wiedergabeliste des SHAS-Radio kann über eine mit Samba* erstellte Netzwerkfreigabe und das Kopieren der Mp3’s in den damit bereitgestellten Freigabeordner genauso einfach erledigt werden.
Fotos des SHAS-Radio V2 sowohl im eingebauten Zustand, als auch während der Entwicklung auf dem Schreibtisch
Version 3 – schmaleres Betriebssystem und überarbeitete Funktionen (2020)
Im Laufe des Jahres 2020 entstand die Version 3 des SHAS-Radio. Am grundlegenden Hardwareaufbau, Raspberry Pi* mit 5″ Display und USV, hat sich zur Vorgängerversion nur die verbaute Raspberry Pi* selbst geändert. Kam bei Version 2 noch das alte Modell 1B oder das Modell 2 zum Einsatz, so setzt das SHAS-Radio 3 nun auf die aktuellere Raspberry Pi* 3. Softwareseitig wurde das aktuelle Raspberry Pi OS* (Buster) verwendet. Setzte ich beim SHAS-Radio 2 noch auf eine Komplettinstallation inkl. Desktop, so nutzte ich bei Version 3 nur noch die schlankere und schneller bootende lite-Version. Da diese allerdings ohne das X Window System*, welches zur Anzeige von Fenster-Applikationen wie den verwendeten Webbrowser nötig ist, ausgeliefert wird, installierte ich dieses manuell nach. So erhielt ich einen schnell bootenden Kiosk-Mode, der nicht erst die Desktop-Umgebung starten muss, sondern in die Kommandozeile bootet und dann den Browser von da aus startet. Außerdem kamen neue Funktionen, wie das Auslesen der ID3-Tags von MP3-Dateien, das Speichern der Abspielposition des letzten Titels, das Anlegen mehrerer WLAN-Netzwerke und, auf Wunsch meines Freundes, ein Betriebsstundenzähler, welcher die Gesamtlaufzeit des Radios anzeigt, hinzu. Außerdem überarbeitete ich die Art und Weise der Speicherung der aktuell eingestellten Werte. Nutzte ich dafür bei Version 2 noch mehrere einzelne Config-Dateien, so gibt es bei Version 3 nur noch 2 *.XML Dateien für die gleiche Aufgabe. Diese bieten den Vorteil, dass sie via JavaScript problemlos ausgewertet werden können.
Sonderversion Hardwareumbau Logitech Pure-Fi Express
Für das Kinderzimmer meiner Tochter erweiterte ich eine nicht mehr genutzte Logitech Pure-Fi Express* Dockingstation für IPhone und IPad um ein integriertes SHAS-Radio. Dafür ersetzte ich die originale Segmentanzeige durch ein 16×2-LCD-Display um die Anzeige der Titelinformationen zu ermöglichen. Den großen Wahl- / Einstellknopf an der Front behielt ich bei, jedoch tauschte ich die Platine gegen einen Eigenbau aus, damit die Bedienung des Drehencoders auf meine verbaute Raspberry Pi* wirkt. Diese integrierte ich anschließend so, dass die Anschlüsse für USB und LAN an der Rückseite zugänglich sind. Das Radio lässt sich somit sowohl über den großen Knopf an der Gerätefront, als auch über meine DIY-Hausautomatisierung* steuern. Aktuell plane ich das Radio auf die Hardware des SHAS-Radio V3 upzugraden, um die Bedienung auch hier über ein 5″-LCD Touch-Display zu ermöglichen.
SHAS-Radio USV
Eine wichtige Voraussetzung für den Anschluss an die HiFi-Anlage meines Freundes war, dass die Raspberry Pi* nicht dauerhaft in Betrieb ist und auch nicht manuell hoch- und heruntergefahren werden muss. Die HiFi-Anlage bietet für das Anschließen weiterer Decks normale 230V Steckdosenausgänge an denen nur beim Einschalten der HiFi-Anlage Spannung durchgeschalten wird. Mit dem Anschluss eines Netzteiles an einen dieser Ausgänge ist das Hochfahren der Raspberry Pi* kein Problem, da diese beim Anlegen von Spannung automatisch bootet. Leider ist das Herunterfahren nicht so unkompliziert umzusetzen gewesen. Da es sich beim installierten Raspbian um ein vollwertiges Linux-Betriebssystem handelt, sollte dies bevor man die Spannungsversorgung des Raspberry Pi* unterbricht, genauso wie jeder Windows-Rechner auch, ordentlich heruntergefahren werden. Macht man dies nicht, so kann es zu Fehlern im Linux-Dateisystem kommen, welche bis zum Komplettausfall führen können.
Da das SHAS-Radio aber vor dem Ausschalten der HiFi-Anlage nicht erst gesondert heruntergefahren werden sollte, sondern dies mit dem Ausschalten der Anlage, und dem damit verbundenen Unterbrechen der Spannungsversorgung, automatisch geschehen sollte, galt es eine Lösung zu finden die Raspberry Pi* nach dem Wegfallen der eigenen Spannungsversorgung herunterzufahren und dann abzuschalten. Für diesen Zweck baute ich eine USV* (unterbrechungsfreie Stromversorgung) welche den Raspberry Pi* nach dem Ausschalten der HiFi-Anlage mittels eines kleinen Lithium-Polymer-Akkumulators* weiterhin mit Spannung versorgt. Ein verbauter ATmega 328P-PU Micro-Controller steuert das Herunterfahren der Raspberry Pi* und schaltet am Ende sowohl die Batterie-Spannungsversorgung für die Raspberry Pi*, als auch für den USV-Controller selbst ab, womit das System beim nächsten Einschalten der HiFi-Anlage wieder ganz normal startet. Da diese USV* sicherlich auch für andere Projekte nützlich sein kann, werde ich sie in einem eigenen Artikel nochmal ausführlicher beschreiben.
Haftungsausschluss:
Hiermit weise ich direkt darauf hin, dass für Beschädigungen und / oder sonstige Schäden, welche durch die Nutzung, den Nachbau oder den Betrieb von hier gezeigten elektrischen Schaltungen, Komponenten oder Teilkomponenten entstanden sind, keinerlei Haftung seitens des Seitenbetreibers, Autors oder einer beteiligten dritten Person übernommen wird!