Sonos Modul

Hallo Zusammen,
mir fällt seit einiger Zeit auf, dass bei mir die CoverURL beim Spielen von Radiosendern nichtmehr gefüllt wird - ist das bei euch auch so bzw. gibts da einen Trick?

Gruß

Hallo,

dafür kann es viele Ursachen geben.
Es könnte z.B. sein, dass sich die URL geändert hat.
Hattest Du mal die SONOS App offen, als Du SNS_SetRadio(49277, ‚OE3‘); ausgeführt hast?
Oft sieht man da eine Fehlermeldung.

Gruß,
Thorsten

Hallo,

erstmal danke für das Modul!

Bei mir kommt im Sonos-Splitter bei Update-Grouping folgende Meldung:


Fatal error: Uncaught Exception: Error during Soap Call: UPnPError s:Client 501 (UNKNOWN) in C:\ProgramData\Symcon\modules\.store\de.kugelberg.sonos\libs\sonosAccess.php:758 Stack trace: #0 C:\ProgramData\Symcon\modules\.store\de.kugelberg.sonos\libs\sonosAccess.php(392): SonosAccess->processSoapCall('/ZoneGroupTopol...', 'urn:schemas-upn...', 'GetZoneGroupSta...', Array) #1 C:\ProgramData\Symcon\modules\.store\de.kugelberg.sonos\SonosSplitter\module.php(384): SonosAccess->GetZoneGroupState() #2 C:\ProgramData\Symcon\scripts\__generated.inc.php(1111): SonosSplitter->updateGrouping() #3 C:\Windows\System32\-(3): SNS_updateGrouping(12290) #4 {main} thrown in C:\ProgramData\Symcon\modules\.store\de.kugelberg.sonos\libs\sonosAccess.php on line 758
Abort Processing during Fatal-Error: Uncaught Exception: Error during Soap Call: UPnPError s:Client 501 (UNKNOWN) in C:\ProgramData\Symcon\modules\.store\de.kugelberg.sonos\libs\sonosAccess.php:758 Stack trace: #0 C:\ProgramData\Symcon\modules\.store\de.kugelberg.sonos\libs\sonosAccess.php(392): SonosAccess->processSoapCall('/ZoneGroupTopol...', 'urn:schemas-upn...', 'GetZoneGroupSta...', Array) #1 C:\ProgramData\Symcon\modules\.store\de.kugelberg.sonos\SonosSplitter\module.php(384): SonosAccess->GetZoneGroupState() #2 C:\ProgramData\Symcon\scripts\__generated.inc.php(1111): SonosSplitter->updateGrouping() #3 C:\Windows\System32\-(3): SNS_updateGrouping(12290) #4 {main} thrown Error in Script C:\ProgramData\Symcon\modules\.store\de.kugelberg.sonos\libs\sonosAccess.php on Line 758

(Zuerst war eine ältere Version des Moduls installiert)

Woran könnte das liegen?

Viele Grüße

Rudi

Hallo,

Das ist eine sehr gute Frage!
An dieser Stelle wird in die Sonos Boxen gerufen und eine Gruppenkonfiguration ausgelesen.

Hierzu wird sich irgendeine Box rausgepickt, die erreicht werden kann.
Es sieht so aus, als wenn diese zufällig ausgewählte Box diesen Call „GetZoneGroupState()“ nicht unterstützt…
Wenn Du im Splitter Debug Meldungen anschaltest, kannst Du sehen welche Box verwendet wird.
Könntest Du mal schauen um welchen es sich da handelt, wenn dieser Fehler auftritt?

Was ist das für ein Modell?

Gruß,
Thorsten

Hallo Thorsten,

danke für deine schnelle Rückmeldung.

Bei Update Grouping bleibt das Debug leider leer.

Bei Tunein Favoriten auslesen wird im Debug bei getSonos: using Player die Box 192.168.178.30 angezeigt.

Das ist ein Play1 OS: S1 Version 11.2.4.

Was mir noch aufgefallen ist: Unter Sonos Discovery werden die Instanzen erst angezeigt, nachdem ich sie manuell angelegt habe.

Unter Meldungen kommt immer wieder:
07.02.2021, 10:07:11 | TimerPool | Sonos Player (Sonos Update Status):

Fatal error: Uncaught Exception: Error during Soap Call: UPnPError s:Client 803 (UNKNOWN) in C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php:758
Stack trace:
#0 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php(213): SonosAccess->processSoapCall(’/MediaRenderer/…’, ‚urn:schemas-upn…‘, ‚GetOutputFixed‘, Array)
#1 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\SonosPlayer\module.php(2163): SonosAccess->GetOutputFixed()
#2 C:\ProgramData\Symcon\scripts__generated.inc.php(1087): SonosPlayer->updateStatus()
#3 C:\Windows\System32-(1): SNS_updateStatus(41449)
#4 {main}
thrown in C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php on line 758

Abort Processing during Fatal-Error: Uncaught Exception: Error during Soap Call: UPnPError s:Client 803 (UNKNOWN) in C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php:758
Stack trace:
#0 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php(213): SonosAccess->processSoapCall(’/MediaRenderer/…’, ‚urn:schemas-upn…‘, ‚GetOutputFixed‘, Array)
#1 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\SonosPlayer\module.php(2163): SonosAccess->GetOutputFixed()
#2 C:\ProgramData\Symcon\scripts__generated.inc.php(1087): SonosPlayer->updateStatus()
#3 C:\Windows\System32-(1): SNS_updateStatus(41449)
#4 {main}
thrown
Error in Script C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php on Line 758

Vielen Dank und viele Grüße

Rudi

Hallo,

das ist ein guter Hinweis.
Die Discovery Instanz zeigt keine Module an, die als „invisible“ gekennzeichnet sind.
Dabei handelt es sich um Boxen die nicht direkt steuerbar sind. Z.B: der passive Teil eines Stereo Paares, Ein Teil von einem 5.1 Verbund, …

Wenn Du eine solche Box manuell angelegt hast, würde ich genau diese Fehler erwarten!
Ist das der Fall?

Gruß,
Thorsten

Hallo Thorsten,

hier sind viele Sonos im Netzwerk. Darunter auch zwei 5.1 und einige Stereo-Paare. Woher weiß ich, welche Boxen „invisible“ sind und welche ich „eintragen“ kann?

Die Ip-Adressen habe ich aus dem Sonos-Windows-Programm / Hilfe / Über mein Sonos System. Ich kann jedoch nicht feststellen, wer von einem Paar / 5.1 „invisible“ ist.

Danke und viele Grüße
Rudi

Hallo,

nun ja, man könnte es der Discovery überlassen. Diese ignoriert diese Boxen ja extra…

Wenn Du es aber lieber selber nachsehen willst, muss Du Dir diese über UPNP auslesen.
Das ginge z.B. mit diesem Script:

<?

if(file_exists('../modules/SymconSonos/Sonos/sonosAccess.php')){
  include_once '../modules/SymconSonos/Sonos/sonosAccess.php';
}elseif(file_exists('../modules/Sonos/libs/sonosAccess.php')){
  include_once '../modules/Sonos/libs/sonosAccess.php';
}elseif(file_exists('../modules/.store/de.kugelberg.sonos/libs/sonosAccess.php')){
  include_once '../modules/.store/de.kugelberg.sonos/libs/sonosAccess.php';
}else{
    die('sonosAccess.php not found');
}

// enter your IP here
  $ip = '192.168.1.10';
// 

$sonos = new SonosAccess($ip);
$grouping = new SimpleXMLElement($sonos->GetZoneGroupState());

print_R($grouping);

Setzt natürlich voraus, dass das Sonos Modul installiert ist, in welcher Version auch immer…

Das gibt Dir ein Array aus, welches alle Player Deines Systems enthält. Hier ein Auszug aus meinem, mit meinem Stereo paar.

...
 [ZoneGroupMember] => Array
                                (
                                    [0] => SimpleXMLElement Object
                                        (
                                            [@attributes] => Array
                                                (
                                                    [UUID] => RINCON_000E58C3863C01400
                                                    [Location] => http://192.168.1.10:1400/xml/device_description.xml
                                                    [ZoneName] => Küche
                                                    ...
                                                    [MoreInfo] => 
                                                )

                                        )

                                    [1] => SimpleXMLElement Object
                                        (
                                            [@attributes] => Array
                                                (
                                                    [UUID] => RINCON_000E58C37EF001400
                                                    [Location] => http://192.168.1.11:1400/xml/device_description.xml
                                                    [ZoneName] => Küche
                                                    ...
                                                    [Invisible] => 1
                                                    ...
                                                    [MoreInfo] => 
                                                )

                                        )
...

Ich habe mal ein paar gleiche Teile mit „…“ ersetzt.
Wie Du siehst, steht bei der 192.168.1.11 ein „[Invisible] => 1“. Bei der 192.168.1.10 fehlt das „Invisible“ hingegen.

Aber das ist genau das, was das Discover Modul macht.

Im Zweifel kannst Du es aber auch einfach ausprobieren:
Starte eine Wiedergabe per APP. Und dann führe für beide Alternativen ein SNS_Pause() aus.
Bei einer Instanz bekommst Du eine Exception, bei der anderen hört die Wiedergabe auf. Die bei der es geht, ist die richtige.

Gruß,
Thorsten

Hallo Thorsten,

das mit dem der Discovery überlassen funktioniert nicht. Hier erscheinen nur die Boxen für welche ich bereits manuell eine Instanz angelegt habe. Die anderen Boxen werden nicht angezeigt. Oder mache ich hier etwas falsch?

Danke für dein Skript, habe es gerade getestet. Ich bekomme jedoch folgende Fehlermeldung:

Fatal error: Uncaught Exception: Error during Soap Call: UPnPError s:Client 501 (UNKNOWN) in C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php:758
Stack trace:
#0 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php(392): SonosAccess->processSoapCall(’/ZoneGroupTopol…’, ‚urn:schemas-upn…‘, ‚GetZoneGroupSta…‘, Array)
#1 C:\ProgramData\Symcon\scripts\44152.ips.php(18): SonosAccess->GetZoneGroupState()
#2 {main}
thrown in C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php on line 758
Abort Processing during Fatal-Error: Uncaught Exception: Error during Soap Call: UPnPError s:Client 501 (UNKNOWN) in C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php:758
Stack trace:
#0 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php(392): SonosAccess->processSoapCall(’/ZoneGroupTopol…’, ‚urn:schemas-upn…‘, ‚GetZoneGroupSta…‘, Array)
#1 C:\ProgramData\Symcon\scripts\44152.ips.php(18): SonosAccess->GetZoneGroupState()
#2 {main}
thrown
Error in Script C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php on Line 758

Ist fast die gleiche Meldung, die alle 5 Sekunden unter Meldungen erschein:

10.02.2021, 18:46:15 | TimerPool | Sonos Splitter (Sonos Update Grouping):

Fatal error: Uncaught Exception: Error during Soap Call: UPnPError s:Client 501 (UNKNOWN) in C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php:758
Stack trace:
#0 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php(392): SonosAccess->processSoapCall(’/ZoneGroupTopol…’, ‚urn:schemas-upn…‘, ‚GetZoneGroupSta…‘, Array)
#1 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\SonosSplitter\module.php(384): SonosAccess->GetZoneGroupState()
#2 C:\ProgramData\Symcon\scripts__generated.inc.php(1111): SonosSplitter->updateGrouping()
#3 C:\Windows\System32-(1): SNS_updateGrouping(12290)
#4 {main}
thrown in C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php on line 758

Abort Processing during Fatal-Error: Uncaught Exception: Error during Soap Call: UPnPError s:Client 501 (UNKNOWN) in C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php:758
Stack trace:
#0 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php(392): SonosAccess->processSoapCall(’/ZoneGroupTopol…’, ‚urn:schemas-upn…‘, ‚GetZoneGroupSta…‘, Array)
#1 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\SonosSplitter\module.php(384): SonosAccess->GetZoneGroupState()
#2 C:\ProgramData\Symcon\scripts__generated.inc.php(1111): SonosSplitter->updateGrouping()
#3 C:\Windows\System32-(1): SNS_updateGrouping(12290)
#4 {main}
thrown
Error in Script C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php on Line 758

10.02.2021, 18:46:15 | TimerPool | Sonos Player (Sonos Update Status):

Fatal error: Uncaught Exception: Error during Soap Call: UPnPError s:Client 803 (UNKNOWN) in C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php:758
Stack trace:
#0 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php(213): SonosAccess->processSoapCall(’/MediaRenderer/…’, ‚urn:schemas-upn…‘, ‚GetOutputFixed‘, Array)
#1 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\SonosPlayer\module.php(2163): SonosAccess->GetOutputFixed()
#2 C:\ProgramData\Symcon\scripts__generated.inc.php(1087): SonosPlayer->updateStatus()
#3 C:\Windows\System32-(1): SNS_updateStatus(50809)
#4 {main}
thrown in C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php on line 758

Abort Processing during Fatal-Error: Uncaught Exception: Error during Soap Call: UPnPError s:Client 803 (UNKNOWN) in C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php:758
Stack trace:
#0 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php(213): SonosAccess->processSoapCall(’/MediaRenderer/…’, ‚urn:schemas-upn…‘, ‚GetOutputFixed‘, Array)
#1 C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\SonosPlayer\module.php(2163): SonosAccess->GetOutputFixed()
#2 C:\ProgramData\Symcon\scripts__generated.inc.php(1087): SonosPlayer->updateStatus()
#3 C:\Windows\System32-(1): SNS_updateStatus(50809)
#4 {main}
thrown
Error in Script C:\ProgramData\Symcon\modules.store\de.kugelberg.sonos\libs\sonosAccess.php on Line 758

Ich habe es mit verschiedenen Sonos-IPs getestet, auch mit Boxen wo sich nur 1 im Raum befindet.

Auf einer anderen Symcon-Installation (mit nur 2 Sonos-Boxen) funktioniert das Skript und auch Discovery, usw. perfekt.

Danke und viele Grüße.

Rudi

Hallo,

Ich glaube, da kann Dir hiervon Sonos Thread nicht geholfen werden.

Gruß,
Thorsten

Hallo,

habe hier einen Beitrag gefunden, dass es offenbar ab ca. 20 Boxen nicht mehr funktioniert.

https://github.com/svrooij/sonos2mqtt/issues/134

Ich vermute, ist das gleiche Problem (sind bei mir über 20).

Schade.

Viele Grüße Rudi

Hallo zusammen,
Im Falle, dass mehrere Sonos Geräte gruppiert sind, werden Infos wie Cover, aktueller Titel etc. nur beim Gruppenmaster in den Variablen hinterlegt, die Slaves haben kein Cover und Titelinfos. Gibts dafür nen Grund…? Irgendwie wäre es doch hilfreich, wenn jede Cover Variable das Cover des Albums enthält, das auf dem Speaker gerade läuft- unabhängig davon, ob es Master oder Slave ist, oder…?
Wenn es gute Gründe gibt, weshalb das Modul das anders löst- wie kann ich das denn trotzdem für mich lösen…?

LG; Marcus

Hallo,

das stimmt so nicht.
Die folgenden Variablen werden vom Koordinator „kopiert“:

  • Status
  • nowPlaying
  • Radio
  • Group Volume
  • Sleeptimer (falls konfiguriert)
  • CoverURL (falls konfiguriert)
  • ContentStream (falls konfiguriert)
  • Artist (falls konfiguriert)
  • Album (falls konfiguriert)
  • TrackDuration (falls konfiguriert)
  • Position (falls konfiguriert)
  • Title (falls konfiguriert)
  • Details (falls konfiguriert)

Allerdings werden diese Variablen versteckt, wenn die Box einer Gruppe zugeordnet ist.

Das habe ich gemacht, um nicht unnötigerweise die gleiche Information mehrfach anzuzeigen und fälschlicherweise zu suggerieren, dass man diese Parameter ändern könnte. => In der Sonos App verschwindet die Box ja sogar komplett.

Das kann aber über die Property „DisableHiding“ („automatisches Verstecken von Variablen ausschalten“) ausgeschaltet werden.

Das war es, was Du gemeint hast, oder?

Gruß,
Thorsten

Hallo,

das ist krass.
Diese Funktion nicht mehr zu verwenden würde bedeutet, dass ich das Modul (zumindest in Bezug auf Discovery und Gruppenhandling) komplett umbauen müsste, falls es überhaupt geht.

An dieser Stelle kann nicht sagen, ob ich das tuen kann oder werde.

Sorry,
Thorsten

Moin Thorsten,
Vielen Dank – das müsste sein. Ich probiere das nachher einmal aus. Aber sag mal – das Cover Bild wird nicht übergeben oder? Kann man das nicht noch irgendwie machen…?

Liebe Grüße, Marcus

Hallo! Danke fürs Feedback. Das Problem war, dass sich die Streaming Url des Senders geändert hat. Diese ist im Netz nirgendwo mehr zu finden. Ich habe dann direkt beim Sender angefragt und die neue erhalten. Seitdem wieder alles perfekt! :slight_smile:

Hallo,

ich habe eine Frage zum SNS_SetRadio(), gehe ich recht davon in der Annahme, das ich nur die TuneIN Sender die ich auch im Splitter mit dem Button „TuneIN Favoriten auslesen“ setzen kann?

Da ich öfter Tonausetzer bei TUneIN habe, bin ich zu Sonos Radio umgestiegen. In der Sonos App stehen die Radiosender auch in der Gruppe „Sender“. Steuern kann ich die aber nur, wenn ich im Splitter den Button „Playlisten neu einlesen“ drücke.

Ich fände es logischer wenn auch die Sonosradiosender mit SNS_SetRadio() gesteuert werden könnten.

Viele Grüße

Hallo,

das geht auch.

Du kannst im Splitter in die Liste mit den Radiosendern manuell einen einfügen.
Sobald das geschehen ist, kannst Du ihn über SNS_SetRadio() ansprechen.

Reicht das nicht?

Gruß,
Thorsten

Moin Thorsten,

ich importiere mit der Instanz immer nur die Sonos-Favoriten, denn davon habe ich nur ein paar (<20). Für meine Lieblingsalben nutze ich aber die gespeicherten Playlisten in Sonos. Die kann ich mit SNS_SetPlaylist auch prima abspielen, alles gut.

Aber kannst du mir verraten, wie ich die gespeichrten Playlisten abfragen kann ? In der „alten Klasse“ ging das mal. Über das Variablenprofil kann ich aber nicht, da ja aus oben genannten Gründen ich nur die Favoriten importiere. Das wäre praktisch, denn ich möchte so ein paar Dutzend kleine RFID Karten mit Coverbildchen machen und die dann nur noch an den Schrank halten.

Kannst du oder jemand mir da weiterhelfen ?

und btw: könnte man bei bestimmten Funktionen wie SNS_SetPlaylist den Fehler abfragen ? Ich bekomme als Rückgabewert immer ein false, falls die PLaylist nicht existiert oder Sonos unerreichbar ist (ich schalte die nachts oder im Urlaub aus) schmeißt mir die Instanz eine Exception. Klar, das kann man mit try{} abfangen, aber im Modul wäre das natürlich schicker.

Vielen Dank,
Tom

Hallo,

Ich bin mit nicht ganz sicher ob ich Dich richtig verstanden habe, aber dieses Script gibt die alles aus, was ich starten könnte. Die drei Sektionen entsprechenden dann dem „Import Playlists“ im Splitter…

<?

if(file_exists('../modules/SymconSonos/Sonos/sonosAccess.php')){
  include_once '../modules/SymconSonos/Sonos/sonosAccess.php';
}elseif(file_exists('../modules/Sonos/libs/sonosAccess.php')){
  include_once '../modules/Sonos/libs/sonosAccess.php';
}elseif(file_exists('../modules/.store/de.kugelberg.sonos/libs/sonosAccess.php')){
  include_once '../modules/.store/de.kugelberg.sonos/libs/sonosAccess.php';
}else{
    die('sonosAccess.php not found');
}

$replaceFrom = ['/\.m3u$/','/\.M3U$/','/_/'];
$replaceTo   = ['','',' '];

// enter your IP here
  $ip = '192.168.1.10';
// 

$sonos = new SonosAccess($ip);

print "saved:\n";
foreach ((new SimpleXMLElement($sonos->BrowseContentDirectory('SQ:')['Result']))->container as $container) {
   print "- \"" . $container->xpath('dc:title')[0] ."\"\n";
}

print "\nimported:\n";
foreach ((new SimpleXMLElement($sonos->BrowseContentDirectory('A:PLAYLISTS')['Result']))->container as $container) {
  print "- \"" . preg_replace($replaceFrom, $replaceTo, $container->xpath('dc:title')[0]) . "\"\n";
}

print "\nfavories:\n";
foreach ((new SimpleXMLElement($sonos->BrowseContentDirectory('FV:2')['Result']))->item as $item) {
print "- \"" . preg_replace($replaceFrom, $replaceTo, $item->xpath('dc:title')[0]) . "\"\n";
}

Die Funktion SetPlaylist macht eigentlich genau das Gleiche und schaut ob das was ich hier ausgegeben habe (also zwischen den Anführungszeichen) gefunden wird.
Wenn ja, wird es gesetzt.

Nun ja, da scheiden sich die Geister.
Wenn Du etwas setzen willst, was es nicht gibt, dann ist das meiner Meinung nach schon eine Exception wert.
Auch wenn Du einen Player ansteuerst, der nicht erreichbar ist.

Welches Verhalten würdest Du Dir denn vorstellen?

Gruß,
Thorsten