Rund um die Squeezebox ...
Einführung zur Squeezebox
Die ehemalige Logitech Squeezebox war bzw. ist ein feines System um eine größere Musiksammlung und Radioprogramme in sehr guter Qualität auf eine Stereoanlage streamen zu können. Leider wurde die Produktion der Hardware im Jahr 2012 eingestellt.
Es gibt zwar mittlerweile etliche Geräte die Netzwerkfunktionalität bieten. Allerdings haben die Lösungen immer einen oder mehrere dicke Haken:
- Meist praktisch keine ordentliche Bedienmöglichkeit (außer Smartphone).
- Kein Display um aktuellen Titel anzuzeigen oder eine Auswahl zu treffen
- Abhängigkeit von Cloud-Diensten bzw. der Verfügbarkeit des einen Anbieters der die Hardware herstellt.
- Komplette Konzentration auf eine Steuerung durch ein Smartphone
- Geschlossenes System - nur bestimmte Steuerprogramme / Apps und Anwendungsszenarien sind unterstützt bzw. vom Hersteller "gewünscht".
- Trotz problemloser und kostenfreier Verfügbarkeit der Quelltexte für eine Implementierung können meist keine ogg-Vorbis Dateien abgespielt werden und müssen (on-the-fly) konvertiert werden.
- Oft verblüffend unkomfortabel wenn viele Musikdateien vorhanden sind.
Im Gegensatz dazu steht der Logitech Mediaserver, der zwar kein UPnP Server ist, aber dafür Open-Source und insbesondere für die Verwaltung vieler Musikdateien sehr gut geeignet ist. Die neuen Versionen sind stand-alone fähig und laufen auch ohne Zugriff auf das Internet. Da es - obwohl die Anfänge ins Jahr 2000 zurückreichen - eine offene Plattform ist, gibt es natürlich auch gute Unterstützung für moderne Smartphones und Steuerprogramme für den PC.
Nachbauideen
Da es sich um eine offene Plattform handelt deren Protokoll und Konfiguration beschrieben ist gibt es mittlerweile viele Nachbauideen. Viele basieren auf dem Raspberry PI Board und dem "Headless"-Player squeezelite. Für komfortables Abspielen habe ich mir einen Player basierend auf dem Raspberry PI 2 Model B Board mit dem 7" Touch Display zur Steuerung und Hifiberry-Digi+ für die Audioausgabe gebaut. Zwei meiner Player enthalten jetzt einen Raspberry Pi 3. Der hat den Vorteil der WLAN Unterstützung. Für das Büro baue ich gerade noch einen weiteren Player zusammen. Ein Raspberry Pi 3. Mittlerweile gibt es ein preislich attraktives Gehäuse, das SmartiCase mit passender Abdeckung. Den neuen Player habe ich in das Nachfolgegehäuse SmartiPi Touch2 eingebaut. Leider ist das nicht ganz so stimmig wie das von mir zuerst verwendete Gehäuse und das 7" Display passt nicht ganz so perfekt. Die Gehäuseabdeckung (ordentlich funktioniert nur die große, 37mm tiefe Abdeckung) muß minimal nachgearbeitet werden, damit die SPDIF Kabel eingesteckt werden können. Als Software verwende ich den piCore Player. Dieser basiert auf TinyCore Linux, SqueezeLite als Player und Jivelite als grafische Steuerung und ist gut konfigurierbar.
Hardware...
Folgende Teile verwende ich für den Aufbau Raspberry Pi2 Model B bzw. Raspberry Pi3 Model B, original 7" Touch-Display, Hifiberry Digi+ oder Hifiberry DAC+ und ein recht gut passendes Gehäuse (siehe jeweils unten). In meinem Setup übernimmt ein PoE Splitter die Stromversorgung, dadurch kann das Board z.B. Nachts automatisiert abgeschaltet werden (zentral per Software gesteuert).
Die neuen Versionen des piCorePlayer haben IR Support. Die anfänglich eingesetzte Version von piCorePlayer 3.22 basiert auf lirc. Da muß man ein paar Details anpassen damit es wirklich so eingerichtet ist, das wichtige Details funktionieren. Die aktuelle Version von piCorePlayer 6.1, liest die IR Kommandos direkt über ein neues Kernelinterface in jivelite und (fast) alles kann über das Webinterface konfiguriert werden.
Raspberry PI mit Display und IR Empfänger im Smarticase
Ich habe alle Player für das Smarticase mit Fernbedienbarkeit umgebaut. 3 Player sind mit SPDIF Ausgang (Hifiberry Digi+), einer mit Analogausgang (Hifiberry DAC+), weil das Zielsystem nur einen Analogeingang hat. Ein weiterer Player ist jetzt Ende 2020 hinzugekommen und ist mit piCorePlayer 6.1 installiert.
Der Einbau von Display und Raspberry PI Board ins Smarticase beschreibe ich hier nicht. Das haben schon andere erledigt. Hier im folgenden Text beschreibe ich insbesondere die Arbeiten für den IR Empfänger und für LLDP Unterstützung, damit man jeweils nachvollziehen kann, welcher Player wo am Netzwerk-Switch hängt.
Einbau des IR Empfängers
Hardwarearbeiten für den IR Empfang
In alle Player habe ich einen IR Empfänger TSOP 4838 eingebaut. Die Empfindlichkeit dieses Bauteils ist für die verwendeten Steuercodes völlig ausreichend und man kann den Player aus mehreren Metern Entfernung in verschiedenen Winkeln zuverlässig steuern. Der IR Empfänger muß an 3,3V, GND und GPIO Pin24 des Raspberry PI Boards angeschlossen werden. Hierzu müssen in die von mir für die ersten Player verwendeten Smarticases zwei 4,5 mm große Löcher gebohrt werden. Durch das eine Loch (nach vorne) kann der IR Empfänger "nach außen schauen" und die IR Signale empfangen. Das andere Loch dient dazu das Kabel ins Smarticase und dort drinnen dann zum Raspberry Pi zu führen. Das SmartPi2 Touch Gehäuse hat eine eingebaute Kamerahalterung. Hier klappt der Einbau nicht ganz so gut wie im Smarticase-Gebäuse, dafür muß man nur ein 4,5 mm Loch bohren.
Die Anschlußdrähte habe ich mit Isolierband gesichert und dann mit einem kurzen Stück Schrumpfschlauch eingeschrumpft.
Der IR Empfänger kann dann direkt auf das Loch geklebt werden. Vorsichtige Naturen nehmen einen lösbaren Kleber oder Isolierband. Am SmartPiTouch2 Gehäuse hält es nur mit Klebeband ordentlich.
Verkabelt man den IR Empfänger wie beschrieben, so steht das nicht im Weg mit dem I2C und dem SPI Bus den der Audiocontroller auf der Zusatzplatine braucht. Hier landet das dekodierte IR Signal an GPIO Pin 24. Die anderen beiden Pins sind Masse und 3,3 V (siehe das interaktive Raspberry PI pinout). Der 5V Zweig des Displays wird über die Hifiberry Digi+ Platine an das Pi Board weitergeschickt.
Softwareanpassungen damit der IR Empfang klappt
Bei piCorePlayer 6.1 kann das komplett über die Tweaks Seite im Webinterface eingerichtet werden. Bei piCorePlayer 3.22 müssen ein paar Kleinigkeiten angepasst werden.
Eine richtige Fernbedienung verwenden
Damit das ganze richtig nett funktioniert und ich nicht auf eine Fernbedienung aus meiner eigenen Grabbelkiste angewiesen bin habe ich mir eine mit Codes programmierbare Universalfernbedienung gekauft und angelernt. Ich beschreibe es hier, weil das wahrscheinlich für viele das Leben einfacher macht. Ich verwende die unten genannte Fernbedienung mit der Version 3.22 und 6.1 von piCore Player.
Gekauft habe ich eine Hama 4-in-1-SmartTV Universalfernbedienung für knapp 10 Euro bei Amazon (weil die recht preiswert war, keine Kritiken über plötzliches Versagen zu finden waren und nur 2 * AAA Batterien gebraucht werden). Ich habe auf die TV Funktion den Panasonic TV Code 5511 eingestellt, das ist offensichtlich eine Fernbedienung die RC-5 Codes verwendet. (Auf dieser FB: Lange Setup drücken bis die LED unter der Power Taste leuchtet, dann "TV", dann 5, 5, 1, 1. Die LED geht dann aus). Hier ist die von mir erstelle Konfigurationsdatei für diesen Code.
Version | Konfigurationsdatei | Vorgehen |
piCorePlayer 3.22 | lircd.conf | Diese Konfigurationsdatei muß man auf dem piCore Player nach
/usr/local/etc/lircd/lircd.conf kopieren und danach die
Konfiguration sichern (damit es über einen Reboot erhalten wird). Damit
funktionieren alle mir wichtigen Funktionen. |
piCorePlayer 6.1 | jivelite | Die Konfigurationsdatei muß über "Tweaks"→"IR remote control"→"IR page"→"Upload custom jivelite keytables to pCP" geladen werden. lircd ist nicht erforderlich. |
Testen der Fernbedienung?
Am besten via SSH auf dem Player einloggen. Ich beschreibe das hier nur noch für den piCorePlayer 6.1.
Testen ob der IR Empfänger überhaupt was empfängt
Wenn der IR Empfänger richtig im Linux auf dem PI eingerichtet ist, wird
ein eigener Interrupthandler aktiviert. Über watch cat
/proc/interrupts
kann man sich die bisher eingegangenen Interrupts
ansehen:
CPU0 CPU1 CPU2 CPU3 17: 644 0 0 0 ARMCTRL-level 1 Edge 3f00b880.mailbox 18: 2 0 0 0 ARMCTRL-level 2 Edge VCHIQ doorbell 40: 0 0 0 0 ARMCTRL-level 48 Edge bcm2708_fb DMA 42: 714 0 0 0 ARMCTRL-level 50 Edge DMA IRQ 44: 0 0 0 0 ARMCTRL-level 52 Edge DMA IRQ 45: 0 0 0 0 ARMCTRL-level 53 Edge DMA IRQ 48: 399 0 0 0 ARMCTRL-level 56 Edge DMA IRQ 49: 0 0 0 0 ARMCTRL-level 57 Edge DMA IRQ 56: 231876 0 0 0 ARMCTRL-level 64 Edge dwc_otg, dwc_otg_pcd, dwc_otg_hcd:usb1 77: 40 0 0 0 ARMCTRL-level 85 Edge 3f804000.i2c 78: 0 0 0 0 ARMCTRL-level 86 Edge 3f204000.spi 80: 45 0 0 0 ARMCTRL-level 88 Edge mmc0 161: 0 0 0 0 bcm2836-timer 0 Edge arch_timer 162: 52539 8164 2620 71906 bcm2836-timer 1 Edge arch_timer 165: 0 0 0 0 bcm2836-pmu 9 Edge arm-pmu 166: 1 0 0 0 pinctrl-bcm2835 24 Edge gpio-ir-recv-irq FIQ: usb_fiq IPI0: 0 0 0 0 CPU wakeup interrupts IPI1: 0 0 0 0 Timer broadcast interrupts IPI2: 4847 6757 5865 7881 Rescheduling interrupts IPI3: 801 2421 1194 616 Function call interrupts IPI4: 0 0 0 0 CPU stop interrupts IPI5: 10245 1390 145 20468 IRQ work interrupts IPI6: 0 0 0 0 completion interrupts Err: 0
Drückt man Tasten an der (konfigurierten) Fernbedienung so muß der Zähler in der fettgedruckten Zeile hochzählen wenn Interrupts durch die empfangenden IR Impulse ausgelöst werden. Mittels Strg+C kann "watch" beendet werden.
Einrichten und Testen der Steuercodes
Hat man gesehen, das die IR Signale empfangen werden, so kann man zum nächsten Schritt übergehen. Im nächsten Schritt muß man root werden und die folgenden Kommandos (hier die dick geschriebenen, die normale Schrift erzeugt der Computer.
tc@piCorePlayer:~$ sudo /bin/sh root@piCorePlayer:/home/tc# cd /usr/local/etc/keytables/ root@piCorePlayer:/usr/local/etc/keytables# ir-keytable -c -w jivelite Read HAMA-Panasonic-5511 table Old keytable cleared Wrote 38 keycode(s) to driver Protocols changed to rc-5 root@piCorePlayer:/usr/local/etc/keytables# ir-keytable -t Testing events. Please, press CTRL-C to abort.
Wenn man an der richtig eingestellten Fernbedienung jetzt Tasten drückt, so
erscheinen die jeweiligen "Scancodes". Mit Strg+C kann man
ir-keytable
beenden.
Mit dieser Fernbedienung funktionieren alle mir wichtigen Funktionen:
- Favoritenauswahl über die "FAV" Taste (bei mir wichtig für Radio)
- Lauter/Leiser über die V+/V- Tastenwippe
- Nächster/Vorheriger Track über >>| und |<<
- Vor/Zurückspulen mit den beiden entsprechenden Tasten
- Stop/Play/Pause
- Pfeilwippe wie auf der Squeezebox-FB
- Menü/Exit/EPG sind mit Shuffle, Suchen und Wiederholfunktion belegt
- OK fügt Stück ans Ende der Playlist
- Videotexttaste zeigt "now-playing"
- TV Taste rechts oben zeigt die Trackinfo
Zumindest bei den 3.22er Playern klappt allerdings die Eingabe von Textzeichen in der Suchmaske nicht. Damit kann ich aber leben.
LLDP Support
Am Schluß habe ich mir noch ein kleines Tool angepasst bzw. gebaut. Damit weiß ich schneller welcher Player wo am Netzwerk-Switch angeschlossen ist. Dazu habe ich mir einen kleinen, extrem minimalistischen LLDP Dienst für die Player gebaut. Der LLDP-Dienst meldet auch den jeweiligen Strombedarf (maximal 10W) an, meine Player sind ja alle via PoE versorgt. Der LLDP Dienst ist extrem simpel und versendet nur alle 30s LLDP Nachrichten
Folgendes muß man auf seinem Linux-Desktop Rechner machen (vor oder nach dem Herunterladen, Debian/Ubuntu)
apt-get install build-essential
- installiert die fürs compilieren nötigen Toolsapt-get install g++-arm-linux-gnueabihf
- installiert den ARM Crosscompiler
Nach dem Vorbereiten des Systems auf diese Weise kann der C-Code wie folgt für ARM Crosscompiliert werden:
arm-linux-gnueabihf-gcc -O2 -o basic-lldp basic-lldp.c
Dieses Binary basic-lldp
habe ich mittlerweile auch als tcz
zusammengepackt und auf die Speicherkarte als tcz File kopiert. Es wird direkt
als tinycore Paket verwendet und über ein Startskript gestartet.
User Command#1: echo 0 > /proc/sys/net/ipv4/tcp_window_scaling ; echo '4096 87380 256000' > /proc/sys/net/ipv4/tcp_rmem User Command#2: /usr/local/sbin/lircd --device=/dev/lirc0 --uinput
- User Command#1 - Schaltet TCP Window-Scaling ab und verkleinert die Puffer. Das sorgt dafür daß ein vorgeschalteter Netzwerk-Switch nicht so viele Pause-Frames an den Squeezebox-Server verschicken muß und insbesondere die vom Squeezebox-Server direkt gestreamten Sachen gleichmäßiger geladen werden.
- User Command#2 - Wird nur bei den 3.22 Playern für die IR Unterstützung benötigt. Bei 6.1 nicht erforderlich.
Ich bin sehr zufrieden mit diesem Setup.