Rund um die Squeezebox ...

Einführung zur Squeezebox

[Squeezebox Nachbau]
Raspberry PI basierender Squeezebox-Nachbau, im neuen Gehäuse ("Smarticase") mit IR-Fernbedienbarkeit

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:

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

[Squeezebox Nachbau]
Raspberry PI basierender Squeezebox-Nachbau, mit DVB Streaming Empfang

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.

[Gebohrte Löcher] [Gebohrtes Loch am neuen Gehäuse]
Die am Smarticase (erstes Bild) bzw. SmartiPiTouch2 (zweites Bild) erforderlichen Löcher für den Empfänger und die Verkabelung des IR Empfängers

Die Anschlußdrähte habe ich mit Isolierband gesichert und dann mit einem kurzen Stück Schrumpfschlauch eingeschrumpft.

[IR Empfänger] [Verlegung Anschlußkabel]
Montage des IR Empfängers direkt mit zwei 4,5 mm Löchern am Smarticase vorbereitet und verkabelt.

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.

[Anschlußkabel] [Detail: Eingebauter Empfänger]
Hinführung der Kabel des IR Empfänger zum Raspberry PI Board. Das weitere Bild zeigt den fixierten IR Empfänger am Gehäuse

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.

[Anschluss IR Empfänger]
Anschluß der 5V Versorgung und des IR Empfängers auf der Hifiberry DAC+ Platine

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.

Konfigurationsdateien für die IR Fernbedienung
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.

[Hama Fernbedienung]
Die Fernbedienung mit dem Codebüchlein. Für die hier verlinkte Config muß der Panasonic TV mit id 5511 auf dieser FB eingestellt werden

Mit dieser Fernbedienung funktionieren alle mir wichtigen Funktionen:

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)

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

Ich bin sehr zufrieden mit diesem Setup.