Vor einiger Zeit hatte ich schon etwas zum Einsatz des Sonos-Controllers unter Linux mithilfe von WINE geschrieben. Zufälligerweise war das die letzte Version, die unter WINE funktioniert hat, Version 3.7 und später laufen leider nicht mehr.
Das wäre halb so schlimm, gäbe es die automatische Update-Routine nicht. Diese prüft beim Start des Controllers, welche Version auf den lokalen Zone Playern installiert ist, und fordert ggf. zum Upgrade auf. Lehnt man dies ab, so verweigert der Controller den Dienst. Hmpf.
Nun bin ich heute über einen Beitrag bei cratoo.de gestolpert. Dort wird u.a. auf ein Posting im Sonos-Forum verwiesen, welches beschreibt, wie man den alten Controller dazu „überredet“, mit einer neueren Sonos-Version zusammenzuarbeiten. Es muss nur eine DLL gepatcht werden, sodass die hinterlegte Version mit der des Zone Players übereinstimmt. Die dort beschriebene Vorgehensweise habe ich heute ausprobiert, sie funktioniert auch noch mit Sonos-Version 4.2.
Hier nun meine Interpretation des Rezepts. Man nehme:
- Sonos Controller für Windows in Version 3.6.1 – den gibt’s direkt bei Sonos, aber es schadet nicht, sich davon eine Sicherheitskopie anzufertigen. Wer weiss, wie lange Sonos diesen noch anbietet…
- Die aktuelle Versionsnummer des lokalen Zone Players, zu finden z.B. über dessen Web-Interface: http://x.x.x.x:1400/status/VERSION, wobei x.x.x.x durch die IP-Adresse des ZP zu ersetzen ist.
Die IP-Adresse findet man z.B. über den DHCP-Server (in meinem Fall eine Fritz!Box) oder über die Controller-App (Einstellungen > Über das Sonos-System) heraus, nmap -p1400 <lokales Netzwerk> geht selbstverständlich auch.
In meinem Fall lautet die Versionsnummer „24.0-69180“, eventuell vorhandene Buchstaben am Ende ignoriert man.
- WINE in einer halbwegs aktuellen Version; ich nutze Ubuntu 12.04.3 x86_64, die dort mitgelieferte Version wine-1.4 funktioniert.
Den Sonos Controller installiert man wie gewohnt und verbindet ihn mit dem lokalen Zone Player. Nun wird er nach einem Update verlangen, dies lehnt man ab und beendet die Anwendung.
Jetzt ist die Datei pcdcr.dll ist zu lokalisieren, bei mir befindet sie sich unter ~/.wine/drive_c/Programme/Sonos. Wer möchte macht davon zuerst eine Sicherheitskopie, anschließend geht’s an’s Patchen!
In der Datei ist der Text „16.7-48310“ durch die weiter oben identifizierte Versionsnummer zu ersetzen. Mit sed geht dies beispielsweise so:
sed -bi "s/16\.7-48310/24.0-69180/" ~/.wine/drive_c/Programme/Sonos/pcdcr.dll
Anschließend kann der Controller wieder gestartet werden, er sollte nun nicht mehr nach einem Update suchen und einfach funktionieren. Das Ergebnis schaut so aus:
Sollte Sonos wieder einmal ein Update verteilen, so muss man nur die neue Versionsnummer herausfinden und die DLL erneut patchen.
Viel Vergnügen beim Nachkochen!
Update 16. Mai 2014: Der Trick funktioniert auch mit der neuen Softwareversion 5.0, der Versionsstring lautet „26.1-76230“.
Update 7. März 2015: Auch mit der Softwareversion 5.2 funktioniert’s so weiterhin. Der Versionsstring lautet „28.1-83040“.
Update 13. Juli 2015: OS-Version 5.4 ist raus, der passende Versionsstring lautet „29.5-91030“.
Update 1. Januar 2016: Die kürzlich erschienene OS-Version 6.0 funktioniert weiterhin wie beschrieben, der passende Versionsstring lautet „31.3-22220“.
Update 19. August 2016: Bei OS-Version 6.3 lautet der Versionsstring „32.11-30071“. Aufgrund der jetzt zweistelligen Minor-Version muss man das letzte Zeichen weglassen, damit das Patchen weiter funktioniert, d.h. „32.11-3007“. Der Teil nach dem Bindestrich scheint nicht relevant zu sein.