Ich steuere meine Sonos Player mittlerweile recht erfolgreich mithilfe eines kleinen PHP Skriptes, daß ich mal auf die schnelle geschrieben habe, über den Gira Homeserver. Damit kann man feine Dinge anstellen wie z.B. Radio An/Aus oder die Lautstärke auf einzelne Taster legen. Oder alle Radios beim Abschließen der Haustüre mittels eines Riegelschaltkontaktes ausgehen lassen.

Ich habe mich hauptsächlich der PHP – Sonos Klasse bedient, welche hier zu finden ist. Diese wurde von mehreren Leuten schon erweitert und mit allerhand Funktionen bestückt. Darum habe ich mir einen Wrapper gebaut, der die für mich relevanten Funktionen zur Verfügung stellt (die index.php). Dort müssen auch die einzelnen Player inkl. deren IP-Adresse eingefügt werden. Die Player verwenden normalerweise DHCP und müssen mittels DHCP Reservierungen auf feste IP Adressen gebracht werden.

Das Interessante ist, das mit diesem Script die Player auch ausgelesen werden und damit Funktionen wie Toggle Play / Pause oder Volume Up unabhängig deren letzten Status realisiert werden können (man muss nicht 2 x auf die Taste drücken weil der Player zwischenzeitlich mit einem anderen Gerät gesteuert wurde). Es können auch Ansagen abgespielt werden. Dabei wird das laufende Programm unterbrochen, die Ansage abgespielt und anschließend das Programm an der unterbrochenen Stelle wieder fortgesetzt.

Zur Installation einfach die beiden Dateien index.php und PHPSonos.inc.php auf einen PHP-fähigen Webserver kopieren. In der index.php die Player zusammen mit Ihrer IP-Adresse in das $zones Array (Zeile 13) eintragen. Zum Testen kann das Script einfach im Browser aufgerufen werden:

http://deinWebserver/Pfad/zum/Script/index.php?zone=NameDerZone&do=TogglePlayStop

Dieser Aufruf ist an die Gegebenheiten anzupassen.

Die zur Verfügung stehenden Funktionen findet man in der index.php im $_GET[‚do‘] switch ab Zeile 24. Die Interessantesten dürften sein:

index.php?zone=MeineZone&do=TogglePlayStop: schaltet um zwischen Play und Pause
index.php?zone=MeineZone&do=VolumeUp: Lautstärke wird pro Aufruf um 1 erhöht
index.php?zone=MeineZone&do=VolumeDown: Lautstärke wird pro Aufruf um 1 vermindert
index.php?zone=MeineZone&do=sendMessage&MesageId=1&Volume=30: Programm wird unterbrochen und Nachricht mit der ID 1 wird abgespielt. Die gewünschte Lautstärke wird über den Parameter Volume übergeben. Der Pfad zu den Nachrichten ist in Zeile 222 in der index.php anzupassen. Der Ordner muss vom Sonos aus erreichbar sein. Die Datei muss in folgendem Format dort gespeichert sein: MessageId.mp3 macht dann z.B. 1.mp3

Im Homeserver eine Webseitenabfrage wie auf den Screenshots dargestellt erstellen:

Es gibt eine neue Version: http://trautner.net/547-sonos-mit-gira-homeserver-steuern-neue-version

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

92 Comments

  1. Hallo,
    bisher habe ich auch mit Scripten und Sonos gearbeitet. Was hier beschrieben ist, ist aber um längen besser als meine Installation…
    Radio hören und die Sendung wir unterbrochen von „Es klingelt jemand an der Tür.mp3“ 😉
    Das habe ich immer gesucht, vielen Dank. Werde heute abend mal ein bisschen installieren….
    Gruß Marc

  2. Hi,
    alles installiert, und klappt super. Ich hatte vorher verschiedene Skripte gebastelt, jetzt brauche ich nur noch die 2. Laut&Leiser ist super…

    Nur ein Problem;-)
    Ich bekomme die Klingel nicht an Laufen. Es wurde ein 1.mp3 erstellt und es dem Script zugewiesen.
    Leider funktioniert es nicht…

    Mir sind verschieden Strings aufgefallen MessageId und MesageId. Ist richtig?

    Ich habe alle Mesage nach dem Test in Message geändert, bring auch nix.
    $sonos->AddToQueue(„x-file-cifs://srv01/Music/Sprachmeldungen/$MessageId.mp3“);

    Kann mir jemand helfen.

    Vielen Dank und Gruß aus Halver
    Marc

    • Hi Marc,

      freut mich, dass es bei dir funktioniert. Zu deinem Problem: Das mit dem String (MesageId) habe ich gesehen, stellt aber keinb Problem dar, da ich das s durchgängig vergessen habe. Wenn du die Variable geändert hast, musst du auch den Aufruf nach MessageID ändern: index.php?zone=MeineZone&do=sendMessage&MessageId=1. Deine Nachricht muss unter dem Namen der aufgerufenen MessageID abgespeichert sein, z.B.: 1.mp3. Des weiteren musst du in der von dir beschriebenen Zeile den Pfad zu deiner Nachricht anpassen. Dieser muss auch zwingend von deinem Sonos aus erreichbar sein. Dies kannst du am besten testen, in dem du versuchst diese Nachricht direkt mit Sonos abzuspielen. Dann ist sichergestellt, das dein Sonos darauf Zugriff hat. Wenn das alles passt, kannst du das Script zum Testen auch direkt im Browser aufrufen: index.php?zone=MeineZone&do=sendMessage&MesageId=1.

      • Hallihallo,
        ich hatte alle Änderungen wie oben schon verändert. Leider komme ich nicht weiter. 1.mp3 habe ich in einen Verzeichnis gepackt und Sonos hat es indiziert, wird auch von Sonos in der Playlist abgespielt.
        Mein Aufruf im Browser ist:
        http://qnap/index.php?zone=Kueche&do=sendMessage&MessageId=1

        Hast du noch einen Tip? Anbei meine index.php
        Vielen Dank und Gruß
        Marc

        -Script entfernt-

        • Hi Marc,

          ich habe den Fehler gefunden *schäm*. Der Aufruf war nicht vollständig. Der korrekte Aufruf der Funktion lautet:

          index.php?zone=Kueche&do=sendMessage&MessageId=1&Volume=30

          Du musst noch die gewünschte Lautstärke (Wert zwischen 0 und 100) mitgeben. Ich werde es oben im Beitrag auch gleich noch ändern.

  3. Juhuu, vielen Dank, klappt alles 🙂

  4. Super,

    freut micht, wenn alles klappt. Interessehalber: Für welche Nachrichten nutzt du es?

  5. Ich habe einen Klingelton bzw. Mp3 was abgespielt wird, wenn jemand an der Tür ist.

  6. Auch nicht schlecht. So eine Art High-End Multiroom-Klingel 🙂 Meine melden aktuell „Die Waschmaschine ist fertig“. Mit dem Trockner klappt es noch nicht so ganz 🙁

  7. Toll. Das sind ja super Features. Kann man vielleicht auch im Sonos-System gespeicherte Playlisten auslesen und (vielleicht als m3u) abspeichern?

  8. Hi, komplette Playlisten habe ich bisher nicht als Kommando, ich meine aber das es schon mit anderen Tools wie z.B. sonosweb ausgelesen wurde, sollte also möglich sein.

  9. Hallo

    Funktioniert einwandfrei und stabil.Habe auf einem IIS PHP installiert und die Scripts kopiert.
    Bisher hatte ich Barix im Einsatz. Eine Audioeinblendung musste ich über VB6 auf einem separaten System ausführen.

    Habt Ihr für Playlisten oder Radio Favoritenanwahl schon was ausgebaut?

    Vielen Dank und Gruss
    Thomas

    • Hi Thomas,

      freut mich, dass es bei dir läuft.

      >Habt Ihr für Playlisten oder Radio Favoritenanwahl schon was ausgebaut?
      Was schwebt dir hier vor?

      Viele Grüße

      Thomas

  10. Hi Thomas

    Habe unerwartet doch noch ein Problem mit dem Aufruf MessageID bekommen. Hat alles perfekt funtioniert.
    Seit gestern bekomme ich immer eine Fehlermeldung nach Aufruf mit Messageid. (500 Serverresourcen nicht gefunden.)
    Dies tritt nur auf wenn eine Radioquelle beim ZP aktiviert ist. Wenn in der Liste ein MP3 Song aktiviert ist funktioniert alles perfekt.
    Hast du noch einen Tip was da passiert ist?

    Vielen Dank und Gruss
    Thomas

    • Ich habe vor einer Weile an dem Script gebaut, da es bei mir mit den Messages auch Probleme gab (weiß aber leider nicht mehr genau warum, ist schon eine Weile her). Ich schaue, dass ich die neue Version hier die Tage online stelle. Dann kannst du es damit mal probieren.

  11. Hallo Thomas
    Vielen Dank im voraus.
    Habe im Script noch gelesen, das bei Radio Stream die Mac-Adresse noch eine Rolle spielt. Habe nicht ganz verstanden wo ich diese mitgeben sollte.

    Hoffen wir auf einen neuen Release.

    Gruss Thomas

    • Hi Thomas,

      du meinst, wenn du einen Radio Stream einstellen willst? Die brauchst du nicht, bzw. kannst du mit der Funktion $sonos->SetRadio einen Radiosender ohne Angabe der Mac-Adresse einstellen.

      In meinem Script gibt es auch noch die Funktion nextRadio(); Damit kannst du deine Radiosender in einer Datenbank speichern und bequem durchzappen (nutze ich auf einem Taster im Bad und in der Küche).

  12. Ich habe die Version oben gegen die aktuelle ausgetauscht. viel Spaß beim testen.

  13. Hallo Thomas
    Zuerst einmal vielen Dank für den neuen Script. Kämpfe noch mit den Details
    DB habe ich angelegt und die 4 Radiostationen erfasst. Bekomme aber mit der Funktion nextRadio immer folgende Fehlermeldung

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\sonos.php on line 230

    Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\sonos.php on line 247

    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/14.4-33290 (ZP90) Connection: close s:ClientUPnPError‘ in C:\xampp\htdocs\PHPSonos.inc.php:502 Stack trace: #0 C:\xampp\htdocs\PHPSonos.inc.php(56): PHPSonos->sendPacket(‚POST /MediaRend…‘) #1 C:\xampp\htdocs\sonos.php(250): PHPSonos->Play() #2 C:\xampp\htdocs\sonos.php(87): nextRadio() #3 {main} thrown in C:\xampp\htdocs\PHPSonos.inc.php on line 502

    Hast du eine Idee was hier falsch läuft ?

    Gruss Thomas

  14. Huhu, jetzt kämpfe ich auch ein bisschen mit dem Radiosendern. Habe auf meiner Qnap mysql installiert.
    Tabelle und Radiosender angelegt lt. index.php. Nun erhalte ich den Fehler:

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /share/MD0_DATA/Qweb/index.php on line 216

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /share/MD0_DATA/Qweb/index.php on line 224

    Fatal error: Call to undefined function l_query() in /share/MD0_DATA/Qweb/index.php on line 239

    Hier meine Tabelle:

    radiostation Anzeigen Struktur Suche Einfügen Leeren Löschen 4 MyISAM latin1_swedish_ci 2,2 KiB –
    settings Anzeigen Struktur Suche Einfügen Leeren Löschen 0 MyISAM latin1_swedish_ci 1,0 KiB –
    2 Tabellen Gesamt 4 MyISAM hp8_bin 3,2 KiB 0 Bytes
    markierte: Alle auswählen / Auswahl entfernen

    vollständige Textfelder id radio url
    Bearbeiten Löschen 1 Radio7 players.creacast.com/creacast/radio7/playlist.m3u
    Bearbeiten Löschen 2 SWR3 mp3-live.swr3.de/swr3_m.m3u
    Bearbeiten Löschen 3 Donau3FM server1.webradiostreaming.de:2640
    Bearbeiten Löschen 4 Bayern3 http://streams.br-online.de/bayern3_2.asx

    Hat jemand eine Ahnung wo der Fehler liegt. Vielen Dank und ein schönes Wochenende. Marc

    • Hi Marc,

      das liegt vermutl. daran, dass bei dir in der Tabelle settings noch nichts drin steht. Dort wird der zuletzt gehörte Radiosender gespeichert. Schreib da z.B. mal eine 1 rein, dann müsste es gehen:


      INSERT INTO
      settings (act_id) VALUES (1);

  15. Vielen Dank für die Info, habe eine 1 in die Tabelle gepackt. Jetzt folgt der Fehler:

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /share/MD0_DATA/Qweb/index.php on line 217

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /share/MD0_DATA/Qweb/index.php on line 225

    Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /share/MD0_DATA/Qweb/index.php on line 242

    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/14.4-33290 (ZPS5) Connection: close s:ClientUPnPError‘ in /share/MD0_DATA/Qweb/PHPSonos.inc.php:502 Stack trace: #0 /share/MD0_DATA/Qweb/PHPSonos.inc.php(56): PHPSonos->sendPacket(‚POST /MediaRend…‘) #1 /share/MD0_DATA/Qweb/index.php(245): PHPSonos->Play() #2 /share/MD0_DATA/Qweb/index.php(82): nextRadio() #3 {main} thrown in /share/MD0_DATA/Qweb/PHPSonos.inc.php on line 502

    Hast Du noch eine Idee?

    • Hi Marc,

      verdammt schwierig ohne aussagekräftige Fehlermeldung zu debuggen. Hast du ein PHPmyadmin am laufen? Dann den Query am besten dort mal testen und schauen was du für eine Fehlermeldung bekommst:

      SELECT s.act_id, MAX(r.id) AS max_id FROM settings s, radiostation r

  16. Moinmoin,
    vielen Dank für die Info. Ich habe Phpmyadmin auf der Qnap installiert. Ich habe diesen Befehl: #1140 – Mixing of GROUP columns (MIN(),MAX(),COUNT(),…) with no GROUP columns is illegal if there is no GROUP BY clause
    auf der Datenbank „sonos“ ausgeführt, die Antowrt war:

    #1140 – Mixing of GROUP columns (MIN(),MAX(),COUNT(),…) with no GROUP columns is illegal if there is no GROUP BY clause

    Gruß Marc

    • Hi,

      dann scheint dein MySQL Server wohl etwas strikter eingestellt zu sein und schon bei leichteren vergehen zu maulen. Ersetze mal den Query im Script damit:

      SELECT s.act_id, MAX(r.id) AS max_id FROM settings s, radiostation r GROUP BY s.act_id

      Dann sollte es eigentlich gehen.

  17. Vielen Dank, bin jetzt einen Schritt weiter:
    Zeige Datensätze 0 – 0 (1 insgesamt, die Abfrage dauerte 0.0030 sek.)

    Jetzt habe ich die Fehlermeldung:

    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/14.4-33290 (ZPS5) Connection: close s:ClientUPnPError‘ in /share/MD0_DATA/Qweb/PHPSonos.inc.php:502 Stack trace: #0 /share/MD0_DATA/Qweb/PHPSonos.inc.php(410): PHPSonos->sendPacket(‚POST /MediaRend…‘) #1 /share/MD0_DATA/Qweb/index.php(244): PHPSonos->SetRadio(‚Bayern3‘, ‚x-rincon-mp3rad…‘) #2 /share/MD0_DATA/Qweb/index.php(82): nextRadio() #3 {main} thrown in /share/MD0_DATA/Qweb/PHPSonos.inc.php on line 502

    Hast Du evtl. noch ein Idee,

    vielen Dank
    Marc

    • Hi Marc,

      sorry für die späte Antwort, bin momentan gerade viel unterwegs:

      Die Funktion an sich funktioniert jetzt aber? Dann würde ich die Fehlermeldung gerne auf später aufschieben, ich denke es ist nur eine Unschönheit (falsche Content Länge).

      • Hallo Thomas

        Habe das selbe Problem (Script liegt auf einer Synolgy-DiskStation), hast du einen Lösungsansatz – die Funktion ist einfach zu sexy…

        Danke

        Stefan

  18. Servus Thomas, tolle Sache!!
    Hab jedoch noch ein paar kleine Fragen:
    Im Script gibt es auch den Befehl Volume, um direkt einen Wert an den Player zu senden. Leider krieg ich das nicht hin, wenn ich:
    http://192.168.120.100:9050/Sonos/index.php?zone=Wohnzimmer&do=Volume=10 eintrage kommt die Meldung „Wrong Command“ schreibe ich
    http://192.168.120.100:9050/Sonos/index.php?zone=Wohnzimmer&do=Volume dann meldet das Script „Wrong Volume“.
    Ich hab auch noch ca. 10 andere Varianten probiert, leider ohne Erfolg. Ich hab auch schon alle Arten von Klammern probiert, da im Script auch Klammern angegeben sind.

    Weiters: Kann man eine im Sonos Controller gespeicherte Playliste per Befehl aufrufen? In der Squeezeboxwelt geht das mit Playlist Play. Dann kann man diese per Bustaster dynamisch aufrufenlassen. Z.B. um Oldies zu Spielen wenn der Papa Duschen geht, der Sohnemann zieht sich die Liste Techno rein. Die Playlisten kann man bequem im Controller erstellem.

  19. Vielen Dank, Lautstärke setzen funktioniert.

    So, nun kämpfe ich mit dem Radioaufruf:
    case ‚Test‘:
    $sonos->ClearQueue();;
    break;
    zum Testen, wenn ich einen case „TEST“ anlege funktioniert.
    wenn ich das nun ändere um einen Radiosender anzuwählen z.B.:
    case ‚Test‘:
    $sonos->SetRadio(Martin, „x-rincon-mp3radio://http://streams.br-online.de/bayern3_2.asx“);
    $sonos->Play();
    break;

    oder
    case ‚Test‘:
    $sonos->SetRadio(‚Martin‘, „x-rincon-mp3radio://’http://streams.br-online.de/bayern3_2.asx'“);
    $sonos->Play();
    break;
    und noch etliche andere Varianten (samt php Server Absturz) durchteste, ich komm leider nicht dahinter!

    Weiters hab ich gesehen, dass es auch eine „$sonos->SetQueue“ gibt. Kann man nicht damit eine Playlist aufrufen?

    Wäre dir einerseits für deine Hilfe bei meiner Erarbeitung der Probleme (ich will ja auch was lernen)dankbar , andererseits stelle ich die Frage, ob du mir gegen Aufwandsentschädigung folgende Funktionen realisieren könntest: Aufruf einer gespeicherten Playlist, Aufruf eines gespeicherten Radiosenders. Mit „gespeichert“ meine ich die Einträge im Sonos Controller. Den Rest könnte ich ja im Script dann selber erstellen.
    lg. Martin

    • Hi Martin,

      ich habe dich nicht vergessen, bin jedoch im Moment sehr beschäftigt und komme leider nicht dazu dir zu helfen.

    • Hallo Martin,

      vielleicht kann ich weiterhelfen …
      x-rincon-mp3radio://streams.br-online.de/bayern3_2.asx

      lg FTZ

    • Weiters hab ich gesehen, dass es auch eine “$sonos->SetQueue” gibt. Kann man nicht damit eine Playlist aufrufen?

      Sieht so aus:

      //$sonos->SetQueue("x-rincon-queue:RINCON_"."HIER DIE MAC DES PLAYERS ZB: FFEEDDCCBBAA"."01400#0"); //Playlist auswählen (Nötig, wenn Radio vorher ausgewählt war)

    • So, nun kämpfe ich mit dem Radioaufruf:

      Radioaufruf ist doch mitsamt DB-Anbindung schon im Script enthalten. Einfach eine MySQL Datenbank mit den Radiosendern anlegen.

      Wenn du direkt einen Radiosender aufrufen willst, lautet die Syntax wie in Zeile 242:

      $sonos->SetRadio($radio, "x-rincon-mp3radio://$url");

      $url must du mit der Url deines Radiosenders ersetzen

  20. Danke, aber wie muss denn die komplette Befehlszeile dann ausschauen?
    so z.B:
    $sonos->SetRadio(x-rincon-mp3radio://streams.br-online.de/bayern3_2.asx);
    oder gehört da noch was dazu? wie ‚ oder “
    ich kann das leider erst morgen am abend testen
    lg. Martin

  21. So, nun hab ich das getestet. Der Befehl lautet korrekt:
    $sonos->SetRadio(„x-rincon-mp3radio://URL_DES_SENDERS“, „ANGEZEIGTER_NAME“);
    z.B.:
    $sonos->SetRadio(„x-rincon-mp3radio://www.antenne.de/webradio/channels/das-schlager-karussell.m3u“, „Schlager“);

    ohne den Eintrag „ANGEZEIGTER_NAME“ gibts nämlich eine Fehlermeldung.

    Ein $sonos->Play();
    hab ich auch noch drangesetzt.

    Ich hoffe irgendjemand kann das irgendwann mal brauchen!

    So nun zu „$sonos->SetQueue“ , wie oben beschrieben braucht man das um die aktuelle Playliste nach dem Radiobetrieb wieder anzusteuern. Jedoch habe ich das nicht gemeint, Ich möchte einfach eine benannte Playliste aus dem Bereich „Sonos-Playlisten“ per Befehl aufrufen. Damit könnte man dann seine Playlisten im Sonoscontroller ganz einfach anlegen und dann per Tastendruck z.B.: Oldies aufrufen.
    Vielleicht hat da mal jemand eine Idee.
    lg. Martin

    • Mit der aktuellen Klasse:

      $sonoslists=$sonos->GetSONOSPlaylists();
      print_r($sonoslists); // DEBUG
      foreach($sonoslists as $sonoslist)
      {
      if ($sonoslist[‚title‘]==’Testlist‘) {
      echo („Starting: „.urldecode($sonoslist[‚file‘]).“…\n\r“);
      $sonos->SetQueue(urldecode($sonoslist[‚file‘]));
      }
      }

      $sonos->Play();

      Grüße, Benjamin

  22. Hi, schonmal vielen Dank für das Skript, läuft super! bräuchte allerdings noch folgende Funktion: gerät soll auf den audioeingang schalten. Ist so ein Befehl irgendwie möglich?

  23. Hallo!
    Versuche mich nun schon seit geraumer Zeit an dem Script leider läuft es bei mir aber alles andere als rund. Die Mute Funktion bringt mir nur die Fehlermeldung „undefined Index Mute“ beim Rest sieht es zwar so aus als ob es durchläuft, meine Sonos Komponenten reagieren aber nur ab und an darauf. Kennt jemand diese Phänomen?

    Grüße René

    • Hi,

      super script! Vielen Dank. Hat jemand eine Lösung zur nicht funktionierenden Mute Funktion gefunden?

      Beste Grüße
      Jürgen

  24. Hallo
    Erstmal Danke für das Script!
    Frage: ist ein Aufruf der Radiosender auch ohne DB möglich? Ist die DB zwingend?
    Danke
    Pat

    • Hi Pat,

      zwingend erforderlich ist die DB keineswegs. Du musst das Script dann halt umschreiben und die Sender z.B. in einem Array oder einer Textdatei ablegen.

  25. Hallo.
    Aber ist es denn nicht möglich die Radiosender im Sonos direkt aufzurufen? Warum muss eine zus. Quelle (DB) vorhanden sein? Die Radio Quellen sind ja alle bereits im Sonos hinterlegt.
    Oder verstehe ich hier was falsch?

    Danke
    Pat

    • Hi Pat,ich kenne keine Möglichkeit, SONOS mitzuteilen einen bestimmten Radiosender von den hinterlegten abzuspielen.

      Viele Grüße

      Thomas

      • Thomas,
        ich habe noch das Problem bei den Messages. Einfügen und abspielen geht, jedoch wird die MP3 nicht mehr aus der Liste gelöscht. Beim erneuten aufrufen des Skriptes wird die MP3 dann nochmals und abermals in die Liste eingefügt (und natürlich alle abgespielt).
        any ideas?

        pat

    • Hallo,
      die Radio Favoriten kann man mit der aktuellsten PHPSonos Klasse über die Funktion Browse abfragen.

      So kann man beispielsweise den ersten Favoriten aufrufen:
      $browselist = $sonos->Browse(„R:0/0″,“c“);
      print_r($browselist); // DEBUG
      $sonos->SetRadio(urldecode($browselist[0][‚res‘]));
      $sonos->Play();

      Viele Grüße, Benjamin

  26. Hallo!
    Nach einem Script wie diesem suche ich schon seit Wochen. Hatte mich anfangs durch das IP-Symcon-Forum gewühlt, bin aber nicht schlauer geworden.
    Mir reicht es, meine einzelnen Player mittels URL-Aufruf zu starten oder zu stoppen. Das funktioniert mit Deinem Script ja schon mal super. Heißen dank dafür- war schon kurz vorm Aufgeben.
    Ich würde nun gerne einen Radiosender ebenfalls per URL-Aufruf starten. Da ich nur einen Sender höre, brauche ich keine DB. Wie hinterlege ich diesen einen Stream in der index.php und mit welcher URL bringe ich die Player dann dazu, den Stream abzuspielen?

    Gruß
    Oli

  27. Hi,

    die Antwort zu deiner Frage steht weiter oben in den beiträgen. du wirst dazu das Script anpassen müssen:

    Wenn du direkt einen Radiosender aufrufen willst, lautet die Syntax wie in Zeile 242:

    $sonos->SetRadio($radio, "x-rincon-mp3radio://$url");

  28. Hi Thomas,

    ja, das hatte ich gelesen. Aber das kann doch unmöglich die URL sein, mit der ich dann letztendlich den Player dazu bringe, den Sender abzuspielen. Mit URL meine ich etwas nach dem Schema „http://localhost/sonos/index.php?zone=Kueche&do=TogglePlayStop“

    Oli

  29. Hallo Thomas

    Super Sache mit dem Script. Habe aber Probleme mit dem Radioaufruf (MySQL Datenbank)
    DB habe ich angelegt und die 4 Radiostationen erfasst. Bekomme aber mit der Funktion nextRadio immer folgende Fehlermeldung.

    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/21.4-61160c (ZP120) Connection: close s:ClientUPnPError‘ in /mnt/disk1/sonos/htdocs/sonos/PHPSonos.inc.php:502 Stack trace: #0 /mnt/disk1/sonos/htdocs/sonos/PHPSonos.inc.php(410): PHPSonos->sendPacket(‚POST /MediaRend…‘) #1 /mnt/disk1/sonos/htdocs/sonos/index.php(240): PHPSonos->SetRadio(‚SWR3‘, ‚x-rincon-mp3rad…‘) #2 /mnt/disk1/sonos/htdocs/sonos/index.php(78): nextRadio() #3 {main} thrown in /mnt/disk1/sonos/htdocs/sonos/PHPSonos.inc.php on line 502

    Alles andere krieg ich hin PLAY,STOP,VOLUME ….!Der Webserver und MySQL läuft auf einer Buffalo Linkstation.

    memo

  30. Hi,

    schwierig dir hier Remote zu helfen, zumal ich diese Funktion selbst nicht nutze. Ich vermute mal, dass die Content Länge des Befehls nicht stimmt.

  31. Hi

    Das kapier ich nicht,also den Befehl führe ich mit http://192.168.0.129:100/sonos/index.php?zone=Wohnzimmer&do=nextRadio aus,und dann kriege ich diese Fehlermeldung.
    Oder stimmt die Ausführung vom Befehl nicht?

    • Hi,

      deine Ausführung stimmt. Kannst du mir bitte mal die Radiosender, die du in der DB angegeben hast mitteilen? Dann schau ich mir es hier einmal an.

  32. Hallo Thomas

    Ich meine den Fehler gefunden zu haben.Im index.php habe ich die folgende Zeile abgeändert
    242 : $sonos->SetRadio(„x-rincon-mp3radio://$url“, „$radio“);
    Danach hatte ich keine Fehlermeldungen mehr und die Umschaltung zwischen den Radiosendern (laut DB) funktioniert jetzt auch.
    Jezt hab ich ein anderes Problem.Manche url Adressen von den Radiosendern funktionieren nicht beim
    Sonos,kriege vom Sonos Fehlermeldungen wie ,Server nicht erreichbar od. Titel ist nicht korrekt codiert obwohl die url Adressen von der Homepage korrekt sind!Mit dem Iphone kann ich im Sonos-Favoriten umschalten,sehe aber nicht die url Adressen dort.
    Hast du vieleicht eine Idee wie ich an die richtigen Adressen rankomme,oder gibt es mittlerweile eine
    andere Möglichkeit direkt im Sonos Favoriten umzuschalten?

    • Hi, sorry, kann ich dir nicht wirklich weiterhelfen, da ich die Funktion eigentlich nicht mehr nutze. Kann evtl. sein dass es sich um Playlisten handelt. Dann ist unter der Url eine Datei hinterlegt, in der dann die urL zu Stream steckt.

  33. Hallo zusammen!
    Vorab: DANKE für diese gute Anleitung.

    Ich bleibe jedoch schon am Anfang stecken. Habe die beiden Dateien auf meinen PHP-Webserver gepackt und die Index.php mit meinen Zonen angepasst.

    Wenn ich im Browser jetzt aber zB http://192.168.178.24/index.php?zone=Stephan&do=TogglePlayStop auswähle tut sich gar nichts, das Browserfenster bleibt weiß und das Sonos-System bleibt stumm.

    Gibt es eine Grundlage die offensichtlich übersehen habe?

    Viele Grüße

    Stephan Schommer

    • Bist du dir sicher, dass dein Sonos unter der angegebenen IP zu erreichen ist? Was anderes fällt mir momentan nicht ein. Dein Webserver kann die Sonos erreichen (Firewall o.ä.)?

  34. Hi,

    ich mal das Script schnell in 5 minten per Web Aufruf zum laufen gebracht. Bin begeistert!
    Kann man die erhöhung der Volume steuern? also nicht um 1 erhöhen pro Tastendruck sondern um 2 oder 3 oder 4?
    index.php?zone=MeineZone&do=VolumeUp: Lautstärke wird pro Aufruf um 1 erhöht

    Gruß

    Andreas

    • Hi,

      du wirst dafür das Skript anpassen müssen. Als Schnellösung kannst du folgende Stelle im Skript suchen und die Zahl deinen Wünschen anpassen:

      $volume += 1;

      Grüße

      Thomas

  35. Hi, ich bekomme GetMute nicht zum laufen. Hat das jemand schon hinbekommen ?
    Wenn ja, wie ?

  36. Hi,
    ich versuche seit längerem die Datenbank in Betrieb zu nehmen zur Wiedergabe von Radiosendern.

    Der Datenbankzugriff funktioniert und die Datenbank ist auch korrekt beschrieben.
    Beim Aufruf von […]/do=nextRadio sollte nun einer der Radiosender aufgerufen werden (URL’s sind getestet), jedoch erhalte ich diese Fehlermeldung:

    „Beim Abrufen von http://IP/Sonos/index.php?zone=Wohnzimmer&do=nextRadio ist auf der Website ein Fehler aufgetreten. Möglicherweise wird sie gerade gewartet oder ist falsch konfiguriert.“

    Da ich den Fehler Serverseitig (Apache2, php5, debian wheezy) vermutete habe ich getestet (ohne Erfolg):
    – Erhöhen von memory_limit
    – Prüfen von mod_rewrite

    Hat jemand eine Idee wo der Fehler liegt?

    Vielen Dank im Voraus und danke für das Skript: alles andere was ich getestet habe oder selbst geändert habe läuft super!

    • Hi,

      schalte in PHP die Fehlerausgabe ein, dann solltest du eine aussagekräftige Fehlermeldung bekommen

      • Dadurch konnte ich zumindest einige Warnings aufheben und komme zu folgender Fehlermeldung:

        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/22.0-65180b (ZPS3) Connection: close s:ClientUPnPError‘ in /var/www/Sonos/PHPSonos.inc.php:509 Stack trace: #0 /var/www/Sonos/PHPSonos.inc.php(417): PHPSonos->sendPacket(‚POST /MediaRend…‘) #1 /var/www/Sonos/index.php(246): PHPSonos->SetRadio(‚SWR3‘, ‚x-rincon-mp3rad…‘) #2 /var/www/Sonos/index.php(84): nextRadio() #3 {main} thrown in /var/www/Sonos/PHPSonos.inc.php on line 509

        Wie weiter oben beschrieben habe ich im Skript
        „SELECT s.act_id, MAX(r.id) AS max_id FROM settings s, radiostation r GROUP BY s.act_id“ geändert, jedoch ohne Änderung…

        lg

        • Hi,

          evtl. Hilft dir der Beitrag von weiter oben:

          Ich meine den Fehler gefunden zu haben.Im index.php habe ich die folgende Zeile abgeändert
          242 : $sonos->SetRadio(“x-rincon-mp3radio://$url”, “$radio”);
          Danach hatte ich keine Fehlermeldungen mehr und die Umschaltung zwischen den Radiosendern (laut DB) funktioniert jetzt auch.
          Jezt hab ich ein anderes Problem.Manche url Adressen von den Radiosendern funktionieren nicht beim
          Sonos,kriege vom Sonos Fehlermeldungen wie ,Server nicht erreichbar od. Titel ist nicht korrekt codiert obwohl die url Adressen von der Homepage korrekt sind!Mit dem Iphone kann ich im Sonos-Favoriten umschalten,sehe aber nicht die url Adressen dort.
          Hast du vieleicht eine Idee wie ich an die richtigen Adressen rankomme,oder gibt es mittlerweile eine
          andere Möglichkeit direkt im Sonos Favoriten umzuschalten?

  37. @ Thomas:
    Das ist alles sehr interessant – für mich als Laie…
    Frage: Dein Aufruf „Waschmaschine ist Fertig“ – wie bekommst du den Befehl / Kontakt vom EIB ?
    Waschmaschine mit EIB-Modul, Schaltaktor mit Stromüberwachung, oder wie geht das ?
    Danke für deine Info.

    LG vom Bodensee
    DANIEL

    PS: Das „Es klingelt jemand an der Haustüre“ brauche ich auch :-))

    • Hi,

      Richtig erraten: Schaltaktor mit Stromüberwachung und dann Webseitenaufruf mit Gira Homeserver:)

  38. Bin wirklich schwer begeistert von diesem Skript, war schon nahe am Aufgeben!!! Hab das Skript bei mir am Synology NAS (DS214+) zum Laufen gebracht.
    =====
    1.) Interessanterweise funktioniert das Skript bei all meinen Sonos Geräten bis auf eines – auf dem bekomme ich die Meldung: „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/24.0-71060 (ZP90) Connection: close s:ClientUPnPError‘ in /volume1/web/PHPSonos.inc.php:502 Stack trace: #0 /volume1/web/PHPSonos.inc.php(133): PHPSonos->sendPacket(‚POST /MediaRend…‘) #1 /volume1/web/index.php(306): PHPSonos->SetVolume(’30‘) #2 /volume1/web/index.php(165): sendMessage(‚2′, ’30‘) #3 {main} thrown in /volume1/web/PHPSonos.inc.php on line 502“ ==> Hat jemand eine Idee?
    2.) Beim Befehl „SendMessage“ kann meinem Verständnis nach dzt. nur ein Player angesteuert werden. Kann man im Skript irgendwie auch alle Player in einer Gruppe zusammenfassen (damit die Message dann auf allen Playern gleichzeitig ausgegeben wird) und dann wieder den alten (vorherigen) Gruppenstatus herstellen?
    Lg und vielen Dank nochmals für das tolle Skript!

  39. Hallo Günther
    Ich nehme an das du die Fehlermeldung dann bekommst,wenn beim ZP eine Radioquelle angewählt war.
    Hast du diese Funktion schon mit Playlists(mp3) probiert?

  40. Moin,

    nettes Tutorial, jedoch macht es bei mir Probleme.
    Und zwar befinden sich die Scripte auf einem Raspberry-Computer der als Server fungiert. Ich kann die Scripte auch ohne Probleme in den Browser eingeben, es funktioniert alles.

    Unter Gira klappt das leider nicht so. „Web-Seiten/IP-Feräte“ habe ich nach deinem Beispiel aufgebaut, jedoch tut sich da nichts.
    In der Debug-Seite wird der Aufruf bestätigt („GET /index.php?zone=Buero&do=Play HTTP/1.0 Host: raspberrypi Connection: Close „) und alles was zurückkommt habe in ein K-Objekt geladen – welches jedoch immer leer ist.

    Ich hoffe du hast einen Rat für mich.

    • Ich konnte den Fehler selbst entdecken.
      Der Gira-Server kann scheinbar keine Hostnamen im eigenem Netz verarbeiten. Ich bekomme ständig DNS-Errors und bei Direkteingabe der IP läuft alles.

  41. Hi,

    dann hast du wahrscheinlich eine Fritzbox. Die löst intern nicht auf. Dort musst du die internen Domains, für die sie auflösen soll eintragen. Oder einen anderen DNS Server verwenden. Ich verwende seit der Abschaffung meines Windows Servers den meines Synology’s. Dort kann man auch eigene Zonen einrichten.

  42. Hey,
    ist es mithilfe dieses Scriptes und den Webseiten-Aufrufe im HS möglich, auch via KNX Tastsensor diese „Befehle“ aufzurufen?

    Wie schaffe ich die Verknüpfung zwischen einer Gruppenadresse und den „Website-Aufrufen“?

    Gruß Bernd

    • Ja, klar, hier im Einsatz. Deswegen habe ich es ja geschrieben. Im Logikeditor kannst du die Gruppenadressen mit den Webseitenaufrufen verknüpfen.

      • Hey Thomas,

        da ich noch nie mit dem Logikeditor gearbeitet habe tu ich mir da grad etwas schwer…
        Wie bekomm ich denn eine „neue, freie“ Gruppenadresse hin?

        Kannst du mir einen Screenshot schicken wie das ganze aussehen muss im LogikEditor?!

        Wäre super, vielen Dank!

        Gruß Bernd

  43. Follow up zu meinem Eintrag vom 8. Feb 2014:
    @Memo und all: Wie ihr seht, bin ich nicht der schnellste – Baby und Frau hatten in den letzten Wochen Vorrang 🙂
    Hab mein Problem endlich nachvollziehen können. Besagtes Sonos Gerät (an der Stereoanlage angeschlossener ZP-90), für das mir das PHP Skript stets Fehler ausgibt, ist auf „festgelegten Ausgangspegel“ (denn der wird ja über die Stereoanlage eingestellt) eingestellt. Wenn ich auf „variabler Ausgangspegel“ umstelle, funktioniert alles.
    Hab jetzt noch versucht, den Ausgangspegel in der Einstellung „festgelegter Ausgangspegel“ auszulesen – es wird der Wert 100 verwendet. Wenn ich nun index.php?zone=Wohnzimmer&do=sendMessage&MessageId=4&Volume=100 verwende, haut es das Skript dennoch „auf den Bauch“ – habt ihr Ideen, was man ändern müsste, um das zum funktionieren zu bringen?

    Hat noch jemand einen Vorschlag zu meinem Pkt 2.) vom 8. Feb 2014? – wie kann man mehrere Sonos Geräte in einem PHP Skript gruppieren und dann wieder gemäß der vorigen Einstellung „auseinanderdividieren“?

    Vielen Dank + lg
    Günther

  44. Und gleich noch’n Update: Hab’s doch geschafft, einige meiner „Probleme“ zu lösen: Hab meine PHPs etwas umgebaut – man kann jetzt bei mir einen Wert von 200 für die Lautstärke übergeben (normalerweise geht’s nur bis 100) – bei Übergabe von 200 wird schlicht und einfach von der Sonos Library keine Volumeeinstellung vorgenommen ==> somit funktioniert auch mein Sonos ZP90 mit Einstellung „festgelegter Ausgangspegel“ perfekt (wenn ich Volume = 200 übergebe).
    Wenn somit jemand meine Türklingel drückt, wird (dzt. nur auf 1, ich arbeite noch an den anderen) auf den Sonos Geräten der Big Ben Chime ausgegeben und ein email an mein Handy geschickt (dann kann ich wenn ich nicht zuhause bin, über Video nachsehen, wer da rumklingelt…)
    Hab mal ein kleines Youtube Video von meiner Hard- und Software gemacht: http://www.youtube.com/watch?v=Bajl2kY-M2w
    Meine Hardware:
    * Synology DS 214+ mit aktiviertem PHP Server Paket
    * Arduino Uno R3 mit Ethernet Shield (mit dem WLAN Shield ginge es genau so…)
    * 6 verschiedene Sonos Geräte der Typen ZP90, Sonos S1, Sonos S5 und 1 Bridge
    Wie ihr sehen könnt, habe ich keinen Gira Homeserver, aber die Problemstellung ist exakt dieselbe.
    Ich habe mich lange mit vielen Vergleichen der verschiedenen Home Server auseinandergeschlagen, nachdem ein Arduino nur 23 EUR (im Gegensatz zum Figaro für rund 1000 EUR) kostet, habe ich mich für Arduino entschieden. Ich war extrem positiv überrascht, wie einfach das Ding zu programmieren ist (da braucht man wirklich kein Techniker zu sein – es hilft zugegebenermaßen…) und was man mit dem alles machen kann.
    Viel Spaß! – Fragen gerne willkommen. Wenn jemand meine Source Codes haben will – auch kein Problem…

  45. Das gibts ja wohl nicht – Autokorrektur? FI B ARO !

  46. Pingback: MP3 Ausgabe über Sonos

  47. Pingback: HOWTO: Visualisierung von Kabel/Sat Receiver EPG + Steuerung - Page 3

  48. Hi Thomas,
    Is it possible to play a whole album from a local hard drive using this code?

  49. hallo
    ich kann die Liste der möglichen Befehle nicht finden
    gibt es da einen Link dazu
    danke

  50. Hier geht es zur aktuellen Version: http://trautner.net/547-sonos-mit-gira-homeserver-steuern-neue-version

    Damit es hier keine Missverständnisse gibt, mache ich die Kommentare zu.