Sonos Steuerung mit ESP8266 (Wemos D1 mini)

Ich besitze seit einiger Zeit 2 Sonos Play 1. Es ist wirklich sehr praktisch so unkompliziert in einem oder mehreren Räumen die selbe oder unterschiedliche Musik zu hören. Da ich mich sehr für Smart Home Technologien interessiere, habe ich gelesen, dass die Sonos Lautsprecher auch in ein Smart Home integriert werden können. KNX Sonos Komponenten, die dies später im Eigenheim realisieren könnten, sind jedoch recht teuer und können teilweise sogar nur das: Sonos Boxen steuern.

Das muss auch selber funktionieren, habe ich mir gedacht. Nach ein wenig Recherche wurde mir klar, dass das ganze per UPNP Kommandos funktioniert. Da bei UPNP jeder Hersteller sein eigenes Süppchen zu kochen scheint, funktioniert das nur mit ein bisschen Bastelei. Zuerst bin ich auf einen Node.JS Webserver von jishi (Link) gestoßen. Der kann quasi alles. Sehr interessant sind die Funktionen Say (Sprachausgabe eines Textes auf einem Speaker), SayAll (auf allen Speakern), ClipAll (Dateiwiedergabe auf allen Speakern, Clip (auf einem Speaker). Dafür würde ich aber einen Node.JS Server benötigen, der immer läuft. Habe ich aber nicht…

Dann kam mir die Idee:
Es muss doch irgendwie möglich sein, diese UPNP-Kommandos mit meinem Wemos D1 mini (Arduino kompatibler Microcontroller mit WLAN) zu erzeugen. Genauer gesagt wollte ich schließlich, dass mir jeden morgen beim Frühstücken vor der Arbeit automatisch zu einer bestimmten Zeit die aktuelle Außentemperatur und die zu erwartende Höchsttemperatur des Tages über eine der Sonos Play 1 mitgeteilt wird.

Folgende Komponenten/Hilfsmittel habe ich benutzt:

Der Microcontroller ruft alle 1,5 Minuten ein PHP-Script auf meinem Webserver auf, welches zurückgibt ob die richtige Uhrzeit zur Audioausgabe erreicht ist. Der Microcontroller hat keine RTC-Funktionalität, daher der Umweg. Wenn die Zeit erreicht ist, wird ein weiteres PHP-Script aufgerufen, welches die MP3-Erstellung durchführt und die Länge der Datei in Sekunden zurückgibt. Anschließend wird der aktuelle Status (aktuelle Wiedergabe gespeichert) und der Sonos Box die MP3 zur Wiedergabe gegeben. Nach der Länge + 1 Sekunde wird die vorherige Wiedergabe auf der Box wiederhergestellt. Es funktioniert! 🙂

So sieht das Arduino-Script aus.

So die verwendete angepasste SonosUPNP-Klasse:

Und hier die PHP-Scripte:

Ich arbeite gerade noch daran, dass mir zusätzlich die bisherige Verspätung meiner Zugverbindung mitgeteilt wird. Die Funktion ist aber noch in Arbeit und muss noch weiter getestet werden.

Categories: Arduino, PHP