Sonos - Zone erstellen

Hallo zusammen,

ich habe PHPSonos im Einsatz und starte damit die Wiedergabe von Internetradio auf dem Sonos.

Nun möchte ich eine Zone erstellen, jedoch scheint das Script nicht zu funktionieren.

Wenn ich die Funktion „AddMember“ ausführe, kommt eine Fehlermeldung. Kann das jemand nachvollziehen?

Genaue Fehlermeldung reiche ich nach.

Gruß,
Christoph

Hallo Christoph,

wenn du die Funktion im Webfront meinst, kann ich das insoweit bestätigen, dass nichts passiert (keine Fehlermeldung). Habe aber selbst noch nicht nach einer Lösung gesucht.
In eigenen Scripten funktioniert die Funktion.

Gruß, Peter

Ich beziehe mich auf eigene Scripte. Ins WebFront habe ich das alles noch nicht integriert.

Ist Dein Sonos-System auf der aktuellsten Version? Hast Du auch IPS 3.1?

Ich liefere den genauen Code und die Fehlermeldungen später nach.

Hallo,

hier das Script:

$SonosSZ_IP = '192.168.2.220';
$SonosSZ_ID = 'RINCON_000E58F2XXXX01400';
$sonos = new PHPSonos($SonosSZ_IP); //Sonos ZP IPAdresse
$AddMember = $sonos->AddMember($SonosSZ_ID);

und hier 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/26.1-76230 (ZPS3)
Connection: close

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><s:Fault><faultcode>s:Client</faultcode><faultstring>UPnPError</faultstring><detail><UPnPError xmlns="urn:schemas-upnp-org:control-1-0"><errorCode>801</errorCode></UPnPError></detail></s:Fault></s:Body></s:Envelope>' in D:\Programme\IP-Symcon\scripts\PHPSonos.inc.php:2279
Stack trace:
#0 D:\Programme\IP-Symcon\scripts\PHPSonos.inc.php(641): PHPSonos->XMLsendPacket('POST /GroupMana...')
#1 D:\Programme\IP-Symcon\scripts\15070.ips.php(15): PHPSonos->AddMember('RINCON_000E58F2...')
#2 {main}
  thrown in D:\Programme\IP-Symcon\scripts\PHPSonos.inc.php on line 2279
Abort Processing during 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/26.1-76230 (ZPS3)
Connection: close

s:ClientUPnPError801' in D:\Programme\IP-Symcon\scripts\PHPSonos.inc.php:2279
Stack trace:
#0 D:\Programme\IP-Symcon\scripts\PHPSonos.inc.php(641): PHPSonos->XMLsendPacket('POST /GroupMana...')
#1 D:\Programme\IP-Symcon\scripts\15070.ips.php(15): PHPSonos->AddMember('RINCON_000E58F2...')
#2 {main}
  thrown
   Error in Script D:\Programme\IP-Symcon\scripts\PHPSonos.inc.php on Line 2279

Kann damit jemand etwas anfangen?

Gruß,
Christoph

Habe gestern Abend noch ein Updates des Sonos-Systems und von IPS durchgeführt - leider ohne das Problem zu lösen.

Hallo Christoph,

mein SONOS und IPS ist jeweils auf dem neuesten Stand.

Mit der Fehlermeldung kann ich auch nicht viel anfangen (ist wohl eher was für Experten :confused:)

Sind denn die Zuordnungen im Code richtig?
IP = Coord
id = Member

Ist Member noch in einer anderen Gruppe zugeordnet?

Gruß, Peter

Hallo,
ich verstehe nicht, was Du meinst.

$SonosSZ_IP = '192.168.2.220';
$SonosSZ_ID = 'RINCON_000E58F2XXXX01400'; 

Diese beiden Einträge sind die IP-Adresse und RINCON-ID von dem Sonos aus dem Schlafzimmer. Diesen möchte ich z.B. mit dem Sonos aus der Küche zu einer Zone zusammenschalten. Weiter bin ich noch nicht.

Oder liegt hier bereits der Denkfehler? Muss ich die IP von dem aus dem Schlafzimmer nehmen und die RINCON-ID von dem aus der Küche? Was meinst Du mit member und coord?

Danke!

Hi,

SONOS unterscheidet zwischen COORD (=Coordinator einer Gruppe) und Member (=Mitglied einer Gruppe).
Befehle für die Gruppe sollen (müssen?) an den COORD gehen.

Wenn SONOS-Player nicht einer Gruppe zugeordnet sind, sind sie COORD.

Also kannst du Schlafzimmer (member = ID Schlafzimmer) der Gruppe Küche (coord = IP Küche) zuordnen.

Ich habe mir 3 Hilfsfunktionen dafür programmiert, weil ich da auch nicht den vollen Durchblick hatte. Wenn du mit den vorhanden Funktionen nicht klar kommst, kann ich den Code gern zur Verfügung stellen.

Gruß, Peter

Das war immer die Ausgangslage meiner Tests. Jeder Player für sich alleine ohne Gruppierung.

Das wäre sehr nett und hilfreich.

Gruß,
Christoph

Hallo Christoph,

für dein Beispiel:
$SonosSZ_IP = ‚192.168.2.220‘; IP Küche
$SonosSZ_ID = ‚RINCON_000E58F2XXXX01400‘; ID Schlafzimmer

hier meine Funktionen:

<?

//******************************************************************************
// eigene SONOS-Funktionen
//    SONOS_Gruppe_bilden($coord, $member)
//    SONOS_Gruppe_loesen($member)
//    SONOS_Gruppe_tabelle()
//
//	include ("47731.ips.php");
//******************************************************************************

//******************************************************************************
// SONOS_Gruppe_bilden($coord, $member)
//******************************************************************************

function SONOS_Gruppe_bilden($coord, $member)
{
	$tabelle = SONOS_Gruppe_tabelle();
	$erg     = "ok";

	$sonosip	= $tabelle[$coord][1];   // Coordinator
	$sonosid	= $tabelle[$coord][0];
	$memberip= $tabelle[$member][1];
	$memberid= $tabelle[$member][0];

	// Talk to Coord
   $sonos = new PHPSonos($sonosip); //Sonos ZP IPAdresse
   $AddMember = $sonos->AddMember($memberid);
   // Talk to slave
   $sonos = new PHPSonos($memberip); //Slave Sonos ZP IPAddress
   // needed to start playback on Slave
   $ret = $sonos->SetAVTransportURI("x-rincon:" . $sonosid);

   return $erg;
}



//******************************************************************************
// SONOS_Gruppe-loesen($member)
//******************************************************************************

function SONOS_Gruppe_loesen($member)
{
	$tabelle = SONOS_Gruppe_tabelle();
	$erg     = "ok";

	$sonosip	= $tabelle[$tabelle[$member][3]][1];   // Coordinator
	$sonosid	= $tabelle[$tabelle[$member][3]][0];
	$memberip= $tabelle[$member][1];
	$memberid= $tabelle[$member][0];

	IF($sonosid == $memberid)
		{
		   $erg = "Coordinator kann nicht getrennt werden.";
		}
	ELSE
		{
		// Talk to Coord
   	$sonos = new PHPSonos($sonosip); //Sonos ZP IPAdresse
   	$RemoveMember = $sonos->RemoveMember($memberid);
   	// Talk to slave
		$sonos = new PHPSonos($memberip); //Slave Sonos ZP IPAddress
   	// needed for stop of playback on Slave
   	$sonos->SetAVTransportURI("");
   	$erg = "";
   }
	return $erg;
}



//******************************************************************************
// SONOS_Gruppe_tabelle()
// $tabelle['Büro'][0] = ID
// $tabelle['Büro'][1] = IP
// $tabelle['Büro'][2] = Coord oder Member
// $tabelle['Büro'][3] = Coord-Name
//******************************************************************************

function SONOS_Gruppe_tabelle()
{
	// Gruppen holen
	$zonen	= br_sonos_GetSONOS_Zones();
	$gruppen = br_sonos_GetSONOS_Groups();
	$master	= array_keys($gruppen);

	// eigene Tabelle aufbereiten
	foreach ($master as $index)
	{
		$member	= array_keys($gruppen [$index] ['Member']);
		$coord   = $zonen[($gruppen[$index]['Coordinator'])]['CurrentZoneName'];
		$tabelle[$zonen[$index]['CurrentZoneName']] = array ($index, $zonen[$index]['IP'], 'Coord', $coord);
   	foreach ($member as $index)
		{
			$tabelle[$zonen[$index]['CurrentZoneName']] = array ($index, $zonen[$index]['IP'], 'Member', $coord);
		}
	}
	//print_r ($master);
	//print_r ($member);
	return $tabelle;
}


?>

und hier ein kleines Beispiel:

<?

//******************************************************************************
// SONOS gruppieren
//******************************************************************************

include ("functions.inc.php");    // PHPsonos.inc.php enthalten
include ("47731.ips.php");       // hier das include meiner Zusatzfunktionen

$tabelle = SONOS_Gruppe_tabelle();

//print_r (SONOS_Gruppe_tabelle());
//$result = SONOS_Gruppe_loesen('Schlafzimmer');
//$result = SONOS_Gruppe_bilden('Bad', 'Schlafzimmer');


IF ($tabelle['Bad'][2] <> "Coord") SONOS_Gruppe_loesen('Bad');
IPS_Sleep(2000);
$result = SONOS_Gruppe_bilden('Bad', 'Schlafzimmer');


IF ($result <> "ok") echo "fehlgeschlagen: ".$result;


?>

Gruß, Peter

Jetzt ist der Groschen gefallen.

Vielen Dank für Deine Hilfe!

Hallo zusammen,
ich habe zwar diverse Teilskripte hier gefunden- aber vielleicht gibt es ja eine einfache fertige Funktion für mein Anliegen:

  1. Weiß jemand, wie man auf dem einfachsten Wege einen ZonePlayer „vereinzelt“?
    Also:
    -Wenn der Player Member in einer Group ist, ihn aus der Gruppe entfernen, sodass er Coordinator ohne Member wird
    -Wenn der Player Coordinator mit Gruppenmembern ist, alle Member entfernen und aus diesen eine neue Gruppe erstellen.

  2. Kann man irgendwie den aktuellen Zustand der Gruppe (bzw den Zustand jedes Players) abspeichern und per Knopfdruck auf den Playern rekonstruieren?

Gibts sowas schon? Ich möchte meinen Player im Bad automatisch einschalten und einen Radiosender abspielen, sobald im Bad das Licht angeht. Geht das Licht wieder aus, schaltet das System auf den vorigen Zustand zurück.

Ist ja nicht so fürchterlich abwegig, sowas zu machen- vll. hat das schon jmd. umgesetzt?

LG; Marcus