Da bei mir das Abspielen der Nachrichten mal wieder nicht funktionierte und die Codequalität unterirdisch war (ein kurzer Hack, der sich bewährt hat), habe ich mich daran gesetzt und das Skript komplett neu geschrieben.

Features

  • das Skript ist jetzt eine Klasse und übersichtlich gegliedert
  • Konfiguration in config.php ausgelagert
  • einiges mehr wie z.B. Pfade konfigurierbar gemacht
  • für die nextRadio – Funktion wird jetzt keine Datenbankanbindung mehr benötigt, die Angabe der Radiosender erfolgt in der config.php, der aktuell abgespielte Radiosender wird in einer Textdatei abgelegt.
  • Die URL Struktur ist gleich geblieben, anstatt ‚do‘ sollte aber in Zukunft ‚action‘ verwendet werden (es geht beides)

Das Hosting der neuen Version erfolgt auf Github. Dort könnt Ihr auch Bugs melden, Verbeserungen oder neue Features vorschlagen und selbst hinzufügen. Dort könnt Ihr euch auch über neue Versionen benachrichtigen lassen.

Hier geht es zum Skript auf GitHub: https://github.com/ThomasTr/sonos

Download der aktuellen Version als zip: https://github.com/ThomasTr/sonos/archive/master.zip

Image: „Home Automation“ (CC BY-NC-SA 2.0) by  multimedia_tech

52 Comments

  1. Le Voisin

    Hallo erstmal, danke für das sehr ausgefeilte Script,
    ich hätte da mal ne Frage,
    Lässt es sich umsetzen, das wenn es klingelt, einige Zonen gruppiert werden, dann der
    Klingelton abspielen und anschließend die Gruppierung wieder aufheben?
    Klingt ziemlich kompliziert, ich weiß.
    Grüße Le Voisin

  2. Hi,

    Gruppierungen sind in dem Script nicht enthalten, müsstest du erst implementieren. Von daher nur mit Programmieraufwand umsetzbar.

  3. Hallo.
    Kannst du mir sagen wie ich einen Radiosender auswählen kann, der in der config definiert wurde

  4. Hi, hiermit kannst du die Radiostationen durchblättern: http://yourserver/sonos/index.php?zone=kitchen&action=nextRadio

    Einen direkten Aufruf gibt es nicht, müsste erst implementiert werden.

  5. vielen dank für die info.
    wie aufwändig wäre es das zu implementieren.
    im php-slript von ip-symcom ist die funktion ja implementiert

  6. Habs gelöst,
    indem ich im sonos.php skript für den jeweiligen sender eine action zugefügt habe,die dann per setradio einen radiostream aufruft und auch noch benennen kann

  7. Super 🙂

  8. Vielleicht willst du die Funktion ja mal hinzufügen.
    Oder es gibt evtl die möglichkeit den radiostream anhand des in der config definierten namens aufzurufen. hier die funktion:

    protected function _action“NAMEDESSENDERS“()
    {
    $this->_PHPSonos->SetRadio(„x-rincon-mp3radio://RADIO-URL“,
    ‚NAME DES SENDERS‘);
    $this->_PHPSonos->Play();
    }

  9. Hallo

    Erst mal vielen Dank für die Scrpits. Bei mir will die Sache noch nicht so recht, ich habe den folgenden Fehler.

    Warning: fopen(log.txt): failed to open stream: Permission denied in /volume1/web/sonos/sonos.php on line 394

    Warning: fwrite() expects parameter 1 to be resource, boolean given in /volume1/web/sonos/sonos.php on line 395

    Warning: fclose() expects parameter 1 to be resource, boolean given in /volume1/web/sonos/sonos.php on line 396

    Fatal error: Uncaught exception ‚Exception‘ with message ‚Missing zone‘ in /volume1/web/sonos/sonos.php:73 Stack trace: #0 /volume1/web/sonos/sonos.php(61): Sonos->_assertZone(“) #1 /volume1/web/sonos/sonos.php(13): Sonos->_main() #2 /volume1/web/sonos/index.php(8): Sonos->__construct() #3 {main} thrown in /volume1/web/sonos/sonos.php on line 73

    Bei mir liegen die folgenden Dateien auf dem Web-Folder.

    – config-php
    – index.php
    – PHPSonos.inc.php
    – sonos.php

    und ich habe in der config.php folgendes eingetragen.

    ‚zones‘ => array(
    ‚Wohnzimmer‘ => ‚192.168.88.41‘,
    ‚Schlafummer‘ => ‚192.168.88.38‘,
    ‚Kinderzimmer‘ => ‚192.168.88.37‘,
    )

    Fehlt da noch was?

    Gruss

  10. Hi,

    das Script darf die Logdatei nicht öffnen./erstellen Check mal die Berechtigungen.

    • Hallo

      Was für Rechte müssten die Dateien dann genau haben? Ich habe meine Dateien übrigens auf einem Synology NAS.

      Vielen Dank

      Gruss

  11. Hi,

    liegt beir mir auch auf einem Synology NAS. Evtl. hilft es eine leere log.txt anzulegen. Ansonsten haben der darüberliegende Ordner sowie das Script selber alle Rechte.

  12. Danke für die schnelle Antwort.

    Wären die Rechte 755 dann in Ordnung?

    Ich werde das mit dem log.txt heute Abend mal versuchen.

    Könnte es vielleicht auch an der Schreibweise der Zonen liegen, ich habe in der config.php die Zonen Gross/Klein geschrieben, in der Sonos App werden die Zonen jedoch in alles Grossbuchstaben angezeigt?

    Viele Grüsse

  13. Der Fehler den du oben gepostet hast, hat erstmal nichts mit deinen Zonen zu tun. Die Rechte sollten passen, ansonsten probier es haqlt mal mit 777 und schau ob es dann funktioniert, kannst ja dann stufenweise wieder runter gehen.

  14. Hallo

    Ich habe den Test gemacht, es wird zwar nun in die log.txt geschrieben (Rechte sollten also passen), doch es kommt beim Aufruf von

    http://[meineip]/sonos/index.php

    Fatal error: Uncaught exception ‚Exception‘ with message ‚Missing zone‘ in /volume1/web/sonos/sonos.php:73 Stack trace: #0 /volume1/web/sonos/sonos.php(61): Sonos->_assertZone(“) #1 /volume1/web/sonos/sonos.php(13): Sonos->_main() #2 /volume1/web/sonos/index.php(8): Sonos->__construct() #3 {main} thrown in /volume1/web/sonos/sonos.php on line 73

    Also irgend etwas mit den Zonen muss da falsch sein.

    Gruss

  15. Das ist ok so, du musst das Script mit den entsprechenden Parametern aufrufen.

  16. Ahhh das heisst diese Url …index.php kann man gar nicht so aufrufen, sondern es funktioniert nur mit den Parameter?

    Ich habe hier mal noch eine Sonos Config

    Verknüpfter ZP: 192.168.88.38
    ———————————
    BRIDGE: BRIDGE
    IP-Adresse: 192.168.88.23
    ———————————
    PLAY:5: Kinderzimmer
    IP-Adresse: 192.168.88.37
    ———————————
    PLAY:3: Schlafzimmer
    IP-Adresse: 192.168.88.38
    ———————————
    PLAYBAR: Wohnzimmer
    IP-Adresse: 192.168.88.41
    ———————————
    SUB: Wohnzimmer
    IP-Adresse: 192.168.88.42
    ———————————
    PLAY:1: Wohnzimmer (RL)
    IP-Adresse: 192.168.88.48
    ———————————
    PLAY:1: Wohnzimmer (LL)
    IP-Adresse: 192.168.88.49

    und in der config.php habe ich es so drin.

    ‚zones‘ => array(
    ‚Wohnzimmer‘ => ‚192.168.88.41‘,
    ‚Schlafzimmer‘ => ‚192.168.88.38‘,
    ‚Kinderzimmer‘ => ‚192.168.88.37‘,
    )

    Ich hoffe dies ist so korrekt.

    Vielen Dank auf jeden Fall für die Hilfe

    Gruss

  17. Richtig, Url immer nur mit Parameter, muss ich vielleicht mal in einer zukünftigen Version, wenn ich wieder vieeel Zeit habe abfangen. Tolles Setup 🙂 Config sieht auch gut aus.

  18. Klappt nun alles wenn der Aufruf mit den Parameter erfolgt.

    Vielen herzlichen Dank

  19. Nico Schymanski

    nochmal zum Verständnis..

    ich kopiere nur die PHPSonos.inc.php in den Ordner sonos auf dem Webserver aus dem Github heraus?
    Habe also:
    config.php
    index.php
    sonos.php und die oben genannten Dateien auf dem Server ?

  20. Genau, du brauchst:

    config.php
    index.php
    sonos.php
    PHPSonos.inc.php

    Entsprechende Rechte setzen, dass PHP in diesem Ordner schreiben darf.

  21. Große Schrift. Es könnte auch nützlich sein, um den HS mit Stromvolumen zu aktualisieren und zu spielen Zustand über „getVolume“ und „gettransportinfo“ Funktionen. Aber ich habe Probleme kommunizieren diese an HS, scheint wie HS bekommt nur den HTTP-Header im Gegenzug uppon GET-Anfrage. Etwaige sugegstions?

  22. Hi John,

    i think it would be better to ask your questions in english. I don’t understand your german 😉

  23. Great script:) Working like a charm. I’m trying to update the HS with current volume and playing state via „getVolume“ and „gettransportinfo“ functions. But I’m having trouble communicating it to HS, seems like HS gets only the HTTP header in return uppon the GET request. Any suggestions?

    • Hi John,

      Nice 😉 Unfortunately i don’t have any experience in this direction, since i don’t communicate in this direction. Sorry 🙁

  24. Hallo
    Kann es sein das mit dem Sonos-Update 6 das Script nicht mehr rund läuft?
    Vielen Dank
    Gruss

    • Habe eben Sonos aktualisiert und auf die schnelle An/Aus und Laut/Leise getestet: geht. Mehr habe ich im Moment nicht implementiert.

  25. An/Aus haben ich bisher getestet und funktioniert auch bei mir. Wenn ich das ganze über den HS aufrufe dauert es aber 10-20sec. bis die Songs reagiert. Über den Webbrowser geht das sofort. Eine Idee woran das liegen kann?

  26. Hallo ,

    ich bekomme immer eine Fehlermeldung T string zeile 7 weiß jemannd warum ?
    Dateien liegen auf dem Raspberry mit apache2 und PHP 5.
    Habe nur die IP Adresse geändert.

    • Evtl. ein Hochkomma vergessen/zuviel? Ansonsten schwierig aus der Ferne zu debuggen. Poste doch mal die gesamte Fehlermeldung und evtl. den Part, den du angepasst hast.

  27. Das ist die Fehlermeldung:
    Parse error: syntax error, unexpected ’sonos‘ (T_STRING) in /var/www/upload/sonos.php on line 6

    Die Datei:
    array(
    ‚Bad‘ => ‚192.168.178.38‘,
    ),
    ‚radiostations‘ => array(
    ‚DasDing‘ => ’swr-mp3-m-dasding.akacast.akamaistream.net/7/588/137139/v1/gnl.akacast.akamaistream.net/swr-mp3-m-dasding‘,
    ‚1Live‘ => ‚1live-diggi.akacast.akamaistream.net/7/965/119435/v1/gnl.akacast.akamaistream.net/1live-diggi‘,
    ‚SWR3‘ => ‚mp3-live.swr3.de/swr3_m.m3u‘,
    ‚Donau3FM‘ => ’server1.webradiostreaming.de:2640′,
    ),
    ‚messagePath‘ => ‚x-file-cifs://nas1/music/_Sprachmeldungen/‘,
    ‚messageStorePath‘ => ‚x-file-cifs:/c/music/_Sprachmeldungen/‘,
    ‚messagePath‘ => ‚http:///sonos/spraak/‘, // for f.e. a RPI
    ‚messageStorePath‘ => ‚http:///sonos/spraak/‘,
    ‚messageLang‘ => ‚de‘,
    ‚currentRadio‘ => ‚currentRadio.txt‘,
    ‚filePhpSonos‘ => ‚PHPSonos.inc.php‘,
    ‚logging‘ => true,
    ‚logfile‘ => ‚log.txt‘,
    );

    • Kann nichts feststellen. Schick mir mal alles in einem zip Archiv an die eMail Adresse aus dem Impressum, dann schau ich mir das mal an.

  28. Hallo! Vielen Dank für deine Mega-Arbeit! Auch wenn die Frage schon n halbes Jahr her ist – wird zukünftig eine Ansteuerung einer vordefinierten Gruppen möglich sein? Das Thema mit der Klingel finde ich echt ne gute Sache. Da wären bestimmt noch mehr begeistert! Der HS könnte dann ja sogar statusabhängig die Kinderzimmer dazunehmen oder weglassen – je nachdem ob eines der Lütten in der Falle liegt oder nicht. Leider bin ich im Programmieren sowas von gar nicht fit um das Thema selbst anzugreifen. Geschweige denn dass ich abschätzen könnte, um welchen Aufwand es sich hier handelt.

    • Hi, leider fehlt mir die Zeit an dem Script weiter zu entwickeln. Aber vielleicht findet sich ja einer, der ein bisschen Zeit investieren möchte.

      • Das wäre natürlich der Hammer! Was denken sie, wäre der zeitliche Aufwand. Kenne einige Freelancer. Vllt würde sich auch auch einer finden, der das übernimmt. Nur wir gesagt kann ich das gar nicht einschätzen.

        • Das kann ich leider so aus dem Stegreif nicht abschätzen. Wenn es entsprechende Funktionen in der Sonos – Klasse gibt, auf die man zurückgreifen kann (und die auch funktionieren), dann wäre es wahrscheinlich in recht kurzer Zeit passiert. Wenn es die entsprechenden Funktionen noch nicht gibt, wird’s schmutzig, dann musst du den Netzwerktraffik mitschneiden und entsprechend nachbauen, das wird dann heftig.

  29. Hallo,

    bin gerade am durchprobieren der einzelnen Funktionen – danke für die tolle Arbeit.

    Was bei mir jetzt nicht klappt, ist eine 1.mp3 abzuspielen bzw. der Code mit dem „Hello world“ vom github Beispiel.

    Hier meine Fehlermeldungen:
    „1.mp3″
    Fatal error: Uncaught exception ‚Exception‘ with message ‚Error sending command: HTTP/1.1 500 Internal Server Error CONTENT-LENGTH: 347 CONTENT-TYPE: text/xml; charset=“utf-8“ EXT: Server: Linux UPnP/1.0 Sonos/31.9-26010 (ZP120) Connection: close s:ClientUPnPError‘ in /share/MD0_DATA/Web/sonos/PHPSonos.inc.php:2308 Stack trace: #0 /share/MD0_DATA/Web/sonos/PHPSonos.inc.php(965): PHPSonos->sendPacket(‚POST /MediaRend…‘) #1 /share/MD0_DATA/Web/sonos/sonos.php(352): PHPSonos->Play() #2 /share/MD0_DATA/Web/sonos/sonos.php(94): Sonos->_actionSendMessage() #3 /share/MD0_DATA/Web/sonos/sonos.php(66): Sonos->_assertAction(’sendMessage‘) #4 /share/MD0_DATA/Web/sonos/sonos.php(13): Sonos->_main() #5 /share/MD0_DATA/Web/sonos/index.php(8): Sonos->__construct() #6 {main} thrown in /share/MD0_DATA/Web/sonos/PHPSonos.inc.php on line 2308

    „Hello world“:
    Warning: file_get_contents(http://translate.google.com/translate_tts?ie=UTF-8&q=Hello+world&tl=en): failed to open stream: HTTP request failed! HTTP/1.0 503 Service Unavailable in /share/MD0_DATA/Web/sonos/sonos.php on line 334

    Warning: file_put_contents(//192.168.43.2/web/sonos/sprachmeldungen/store/Hello+world.mp3): failed to open stream: No such file or directory in /share/MD0_DATA/Web/sonos/sonos.php on line 335

    Fatal error: Uncaught exception ‚Exception‘ with message ‚Error sending command: HTTP/1.1 500 Internal Server Error CONTENT-LENGTH: 347 CONTENT-TYPE: text/xml; charset=“utf-8″ EXT: Server: Linux UPnP/1.0 Sonos/31.9-26010 (ZP120) Connection: close s:ClientUPnPError‘ in /share/MD0_DATA/Web/sonos/PHPSonos.inc.php:2308 Stack trace: #0 /share/MD0_DATA/Web/sonos/PHPSonos.inc.php(965): PHPSonos->sendPacket(‚POST /MediaRend…‘) #1 /share/MD0_DATA/Web/sonos/sonos.php(352): PHPSonos->Play() #2 /share/MD0_DATA/Web/sonos/sonos.php(94): Sonos->_actionSendMessage() #3 /share/MD0_DATA/Web/sonos/sonos.php(66): Sonos->_assertAction(’sendMessage‘) #4 /share/MD0_DATA/Web/sonos/sonos.php(13): Sonos->_main() #5 /share/MD0_DATA/Web/sonos/index.php(8): Sonos->__construct() #6 {main} thrown in /share/MD0_DATA/Web/sonos/PHPSonos.inc.php on line 2308

    Ich komme leider nicht drauf, wo meine Fehler liegen.
    Danke für eure Hilfe

    Jürgen

    • Das Problem mit 1.mp3 dürfte von fehlenden Berechtigungen kommen, das habe ich mit der Sonos Anwendung schon rausgefunden. Werde heute noch einen andere Pfad probieren.

      Aber Sprachmeldung ???

  30. Hi Thomas,
    Vielen Dank fuer dein Script.
    Waere super, wenn du eine sample.php zur Verfuegung stellen kannst, mit ein paar Beispielen?
    Merci
    Martin

  31. Josef Nebl

    Servus habe folgendes Problem!
    Habe mir einem Webserver mit Xammp auf Win 7 erstellt und nach Anleitung auf Ihrer Seite einen Ordner Sonos erstellt und die angeben *.php Dateien darin abgelegt!
    Der Ordner Sonos liegt in Htdocs wie im Internet beschrieben!
    Habe nun die config.php die Zone Kueche die IP meines Play 1 eingtragen.
    Über die Sonos App habe ich dem Play 1 die Zone Küche vergeben!

    Wenn ich nun im Browser folgenden Befehl versuche:
    http://localhost/sonos/index.php?zon…en&action=Play

    Bekomme ich folgende Fehler:
    Fatal error: Uncaught exception ‚Exception‘ with message ‚Zone [kitchen] does not exist‘ in C:\xampp\htdocs\sonos\sonos.php:78 Stack trace: #0 C:\xampp\htdocs\sonos\sonos.php(61): Sonos->_assertZone(‚kitchen‘) #1 C:\xampp\htdocs\sonos\sonos.php(13): Sonos->_main() #2 C:\xampp\htdocs\sonos\index.php(8): Sonos->__construct() #3 {main} thrown in C:\xampp\htdocs\sonos\sonos.php on line 78

    laut Ihrer Seite muß man nur in der config.php die IP ändern.
    Zone Küche habe ich ja über die App eingestellt.
    Muss ich an der sonos.php auch was ändern?

    • Wenn du die Zone in der Config mit „Kueche“ angibst, musst du sie im Script auch entsprechend mit „Kueche“ und nicht mit „kitchen“ aufrufen.

  32. Matthias

    Hallo Thomas,
    super Script. Funktioniert soweit alles. Nur wenn ich eine Message abspielen will, wird diese abgespielt aber ich komm nicht mehr zum alten Programm zurück. Woran kann das liegen?

    Gruß

    Ich sende folgenden Aufruf:
    http://IP/sonos/index.php?zone=Esszimmer&action=sendMessage&messageId=1&volume=20
    Dann kommt folgender Fehler:
    Fatal error: Uncaught exception ‚Exception‘ with message ‚Error sending command: HTTP/1.1 500 Internal Server Error CONTENT-LENGTH: 347 CONTENT-TYPE: text/xml; charset=“utf-8″ EXT: Server: Linux UPnP/1.0 Sonos/32.11-30071 (ZPS5) Connection: close s:ClientUPnPError‘ in /volume1/web/sonos/PHPSonos.inc.php:2263 Stack trace: #0 /volume1/web/sonos/PHPSonos.inc.php(1632): PHPSonos->sendPacket(‚POST /MediaRend…‘) #1 /volume1/web/sonos/sonos.php(367): PHPSonos->SetAVTransportURI(‚x-sonosapi-radi…‘, ‚_actionSendMessage() #3 /volume1/web/sonos/sonos.php(66): Sonos->_assertAction(’sendMessage‘) #4 /volume1/web/sonos/sonos.php(13): Sonos->_main() #5 /volume1/web/sonos/index.php(8): Sonos->__construct() #6 {main} thrown in /volume1/web/sonos/PHPSonos.inc.php on line 2263

  33. Matthias

    Hallo Thomas,
    habe festgestellt dass das Problem nur beim Interpreten-Radio auftritt.
    ??
    Was kann das Problem sein?

    Gruß und Danke

  34. Matthias

    Hallo Thomas,
    das Problem dass beim Senden von folgendem Befehl:
    http://yourserver/sonos/index.php?zone=kitchen&action=sendMessage&messageId=1&volume=20
    die Nachricht abgespielt wird jedoch nicht wieder zum Interpreten-Radio zurückkommt.
    Mit normalen Radio und Play-List funktioniert es.

    Bei Bedarf kann ich die Fehlermeldung noch senden.

    Gruß

    • Hi Matthias, so leid es mir tut, mir fehlt gerade die Zeit den Fehler zu debuggen. Ich kann dir leider auch nicht sagen wann ich es schaffe.

  35. @Matthias

    Die folgende Linie muss ersetzt werden, damit der Fehler nicht mehr auftritt.

    alt:
    $radio = (strpos($saveMediaInfo[‚CurrentURI‘], „x-sonosapi-stream:“)) !== false;
    neu:
    $radio = (strpos($saveMediaInfo[‚CurrentURI‘], „x-rincon-mp3radio:“)) !== false;

    Gruss
    Pasci

  36. Hey, danke für das Scipt. Das einzige was nicht funktioniert ist das Senden einer Message. Das Radioprogramm wird zwar kurz unterbrochen, aber ich höre das MP3 nicht. Tipp?

    • Hi,

      wahrscheinlich kommt dein Sonos Player nicht an dein MP3 ran: falscher Pfad oder fehlende Berechtigungen.

  37. Martin Weißenburger

    Hallo Thomas,
    ich google schon seit Tagen, wie ich einen PHP Webserver auf dem HS oder einer Fritzbox mit einfachen Mitteln einrichten kann, da ich keine HTML/PHP Kenntnisse habe. Könntest du mir dabei helfen oder sagen wie das geht? Würde gerne meinen Play:1 im Bad per KNX anschalten können 🙂
    Frohe Weihnachten und Grüße aus Dillingen a.d. Donau

    • Hi Martin,
      gar nicht, du wirst das weder auf deiner Fritzbox noch auf deinem HS zum laufen bringen.
      Ich habe es bei mir auf einem Synology NAS am laufen. Ein Rasperry Pi dürfte auch noch eine günstige Alternative sein, da bräuchtest du aber fast schon Linux Kenntnisse.

Leave a Comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.