PHP Sonos (Klasse zum Ansteuern einzelner Player)

Mir fehlten noch die Klang Einstellungen,
habe das mal bei mir in die „PHPSonos.inc.php“ eingebaut und getestet :


	public function SetTreble($Treble)
	{
$laenge=296 + (strlen($Treble));
$content='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: '.$laenge.'
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetTreble"

<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><u:SetTreble xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><DesiredTreble>'.$Treble.'</DesiredTreble></u:SetTreble></s:Body></s:Envelope>';

		$this->sendPacket($content);
	}
	
  public function SetBass($Bass)
	{
$laenge=288 + (strlen($Bass));
$content='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: '.$laenge.'
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetBass"

<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><u:SetBass xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><DesiredBass>'.$Bass.'</DesiredBass></u:SetBass></s:Body></s:Envelope>';

		$this->sendPacket($content);
	}


	public function SetLoudness($loud)
	{

		if($loud) { $loud = "1"; } else { $loud = "0"; }

$content='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 330
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetLoudness"

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetLoudness xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><Channel>Master</Channel><DesiredLoudness>'.$loud.'</DesiredLoudness></u:SetLoudness></s:Body></s:Envelope>';
		$this->sendPacket($content);
	}


	public function GetLoudness()
	{

$content='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 293
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#GetLoudness"

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetLoudness xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><Channel>Master</Channel></u:GetLoudness></s:Body></s:Envelope>';

		return (bool)$this->sendPacket($content);
	}
		public function GetTreble()
	{

$content='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 290
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#GetTreble"

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetTreble xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><Channel>Master</Channel></u:GetTreble></s:Body></s:Envelope>';

		return (int)$this->sendPacket($content);
	}



	public function GetBass()
	{
$content='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 279
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#GetBass"

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetBass xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><Channel>Master</Channel></u:GetBass></s:Body></s:Envelope>';

        	return (int)$this->sendPacket($content);
	}


Moin,
möchte zwei Sonos Geräte zu einer Gruppe zusammenfassen, die Lösung mit BR_Sonos habe ich gesehen, habe BR_Sonos aber nicht im Einsatz und möchte das auch eigentlich nicht ändern, da ich das bis jetzt nicht brauche. Theoretisch sollte das doch auch so gehen:

<?
include(„PHPSonos.inc.php“);

$sonos = new PHPSonos(„192.168.1.52“); //Sonos ZP IPAdresse

$sonos->AddMember(‚B8E937B934F601400‘);

?>

Die IP oben ist die vom Player im Schlafzimmer, die Member ID unten ist hoffentlich richtig, im Arbeitsplatz wird mir für das Sonos im Bad uuid:RINCON_B8E937B934F601400 angezeigt, ist das hinter RINCON_ denn die Member ID und habe ich die so richtig eingetragen? Das ganze funkioniert nämlich natürlich nicht (Gegencheck mit der Sonos App)

Gruß

Hi Luca,

das „RINCON_“ gehört noch mit zur Member-ID. Wenn also in AddMember das nicht hinzugefügt werden sollte, dann musst du es selber beim Aufruf mit hinschreiben…

Grüße
Reiner

Moin,

<?
include(„PHPSonos.inc.php“);

$sonos = new PHPSonos(„192.168.1.52“); //Sonos ZP IPAdresse

$sonos->AddMember(‚RINCON_B8E937B934F601400‘);
?>

auch so tut sich leider nichts, unter Räume in der Sonos App werden die Räume weiterhin einzeln und nicht als Gruppe angezeigt, was habe ich vergessen bzw. was mache ich falsch?

Gruß

Hi Luca,

hmm… was genau macht denn AddMember in deiner Version? Kannst du den Methodenschnipsel mal kurz posten?
Nicht, dass sich dort ein Fehler eingeschlichen hat…

Alternativ kannst du auch einfach direkt eine Datei auf dem Bad wiedergeben.
Als Dateiname musst du dann „x-rincon:RINCON_<ID_DES_SCHLAFZIMMERS>“ angeben. Das bildet dann die Gruppe…

Grüße
Reiner

Moin,
ohoh, ich ahne das ich da was falsch verstanden habe… Ich möchte einfach nur eine Gruppe mit Bad und Schlafzimmer aufmachen um im nächsten Schritt dann in beiden Räumen synchron das gleiche abzuspielen, also quasi das gleiche wie wenn ich in der Sonos App zwei Räume zu einer Gruppe hinzufüge, das was ich gepostet habe ist dazu der ganze Code, habe ich da was falsch aufgefasst?

Gruß

PS:
Hast du zu dem Datei wiedergeben mal einen kompletten Codeschnipsel, also was um das „x-rincon:RINCON_<ID_DES_SCHLAFZIMMERS>“ drumrum muss? Überblicke die ganzen Befehle gerade nicht um zu wissen wie ich nun eine Datei abspiele, AddToQueue, SetQueue oder bin ich ganz falsch?

Hi Luca,

mein Problem ist, dass ich diese Klasse hier gar nicht verwende :slight_smile:

Also, kurz zum System der Gruppe:
Es gibt einen Master. Dessen Abspielen wird dann auf alle Slaves übertragen.
Es gibt einen oder mehrere Slaves, die das Wiedergeben, was der Master so abspielt.

In der Sonos-App machst du das darüber klar, welches Lied wo überall abgespielt werden soll, indem du Player einer bestehenden Gruppe (auch ein einzelner Player ist eine Gruppe für sich) hinzufügst.

In deinem Code sagst du einem neuen Slave, dass er den Master-Player sozusagen abspielen soll.
Im Original heißt der Befehl „SetAVTransportURI“; leider weiss ich jetzt nicht, ob und wie die PHPSonos-Klasse das umgesetzt hat…

Anschließend sagst du nur noch deinem Master-Player, was abgespielt werden soll. Deine Slaves folgen dann automatisch…

Grüße
Reiner

Super, danke, so klappts jetzt!

<?
include(„PHPSonos.inc.php“);

$sonos = new PHPSonos(„192.168.1.43“); //Sonos Bad

$sonos->SetAVTransportURI(‚x-Rincon:RINCON_B8E93797E25601400‘); // Spiele von Schlafzimmer
?>

Wie ist dann der Trick um einen Slave wieder aus der Gruppe raus zu kommen? Mit RemoveMember komme ich genau wie mit AddMember nicht weiter…

Hi Luca,

dafür gibt es einen eigenen Befehl „BecomeCoordinatorOfStandaloneGroup()“. Wenn du das auf dem Master aufrufst, wird die komplette Gruppe aufgelöst, wenn du es auf einem Slave aufrufst, wird der einzelne Player aus der Gruppe gelöst.

Du müsstest mal schauen, wie RemoveMember umgesetzt wurde. Dieser Befehl braucht nur eine 0 als Parameter, und wird auf dem rauszutrennenden Player ausgeführt…

Sonst poste für mich mal bitte den Inhalt von RemoveMember…

Grüße
Reiner

Moin,
in der PHPSonos Doku steht folgendes, oder was meinst du mit Inhalt von Remove Member?

Sring function PHPSonos::RemoveMember($MemberID) [line 682]

Function Parameters:
string $MemberID LocalUUID/ Rincon of Player to remove

Removes a Member from an existing ZoneGroup (a single player is also considered an existing group and the action will result in muting the player)

Device: urn:schemas-upnp-org:device:ZonePlayer:1
WSDL: http://play.er.i.p:1400/xml/zone_player.xml
Service: urn:upnp-org:serviceId:GroupManagement
Returns: for now the sendPacketAnswer

Link Wiki

TODO br 20110909 return $this->sendPacket($content); this Line was commented out; i dont understand why… changed this

Access public

Gruß

Hi Luca,

ich meinte den echten Quelltext dazu :slight_smile:
Also deine Datei PHPSonos.inc durchsuchen nach RemoveMember, und den kompletten Funktionsblock (bis zur nächsten Funktion im Quelltext) hier posten…

Grüße
Reiner

Moin,
sorry, dann hoffe ich das das hier das richtige ist :slight_smile:

public function RemoveMember($MemberID) // added br

  {

$header=‚POST /GroupManagement/Control HTTP/1.1
SOAPACTION: „urn:schemas-upnp-org:service:GroupManagement:1#RemoveMember“
CONTENT-TYPE: text/xml; charset=„utf-8“
HOST: ‚.$this->address.‘:1400‘;
$xml=’<?xml version=„1.0“ encoding=„utf-8“?><s:Envelope s:encodingStyle=„http://schemas.xmlsoap.org/soap/encoding/“ xmlns:s=„http://schemas.xmlsoap.org/soap/envelope/“>
<s:Body><u:RemoveMember xmlns:u=„urn:schemas-upnp-org:service:GroupManagement:1“><MemberID>’ . $MemberID . ‚</MemberID>
</u:RemoveMember></s:Body></s:Envelope>‘;
$content=$header . ’
Content-Length: ‚. strlen($xml) .‘

'. $xml;
return $this->sendPacket($content);

}

Hi Luca,

das sieht gut aus…

versuch mal, den folgenden Abschnitt in deine Datei einzufügen:

public function BecomeCoordinatorOfStandaloneGroup()
{
$header=‚POST /AVTransport/Control HTTP/1.1
SOAPACTION: „urn:schemas-upnp-org:service:AVTransport:1#BecomeCoordinatorOfStandaloneGroup“
CONTENT-TYPE: text/xml; charset=„utf-8“
HOST: ‚.$this->address.‘:1400‘;
$xml=’<?xml version=„1.0“ encoding=„utf-8“?><s:Envelope s:encodingStyle=„http://schemas.xmlsoap.org/soap/encoding/“ xmlns:s=„http://schemas.xmlsoap.org/soap/envelope/“>
<s:Body><u:BecomeCoordinatorOfStandaloneGroup xmlns:u=„urn:schemas-upnp-org:service:AVTransport:1“><InstanceID>0</InstanceID>
</u:BecomeCoordinatorOfStandaloneGroup></s:Body></s:Envelope>’;
$content=$header . ’
Content-Length: ‚. strlen($xml) .‘

'. $xml;
return $this->sendPacket($content);
}

Wenn ich mich nicht vertan habe, dann könnte das so gehen… Wenn es nicht geht, dann kopiere dir als Vorlage vielleicht den Rahmen von „SetAVTransportURI“, und ersetze den Kern durch den Aufruf von „BecomeCoordinatorOfStandaloneGroup“. Oder vergleiche mal die Unterschiede…

Grüße
Reiner

Moin,
mit einfügen in die Sonos PHP Datei ging es nicht, habe den Dienst danach neu gestartet, oder muss beim Aufruf ein Parameter in die Klammer? Habe () gesetzt.

Hier alternativ der Quelltext zu SetAVTransportURI, ich blicke da leider nicht durch…

/**

  • Sets Av Transport URI
    • <b>NOTE:</b> Main SOAP method to set play URI - this is the plain SetAVTransportURI
    • <b>Device:</b> urn:schemas-upnp-org:device:MediaRenderer:1
    • <b>WSDL:</b> fill in
    • <b>Service:</b> urn:schemas-upnp-org:service:AVTransport:1
    • <b>Returns:</b> sendpacket return
  • @param string $tspuri Transport URI
  • @param string $MetaData (optional for MetaData)
  • @return String
    */
    public function SetAVTransportURI($tspuri,$MetaData="")
    {

$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: ‚.$this->address.‘:1400
CONTENT-LENGTH: ‚.(342+strlen(htmlspecialchars($tspuri))+strlen($MetaData)).‘
CONTENT-TYPE: text/xml; charset=„utf-8“
SOAPACTION: „urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI“

<s:Envelope xmlns:s=„http://schemas.xmlsoap.org/soap/envelope/“ s:encodingStyle=„http://schemas.xmlsoap.org/soap/encoding/“><s:Body><u:SetAVTransportURI xmlns:u=„urn:schemas-upnp-org:service:AVTransport:1“><InstanceID>0</InstanceID><CurrentURI>’.htmlspecialchars($tspuri).’</CurrentURI><CurrentURIMetaData>’.$MetaData.’.</CurrentURIMetaData></u:SetAVTransportURI></s:Body></s:Envelope>’;

  $this-&gt;sendPacket($content);

}

Hi Luca,

ich kann das leider hier nicht testen oder ausführen… deswegen musst du da etwas rumprobieren.

Hier nochmal ein Versuch auf Basis von SetAVTransportURI:

public function BecomeCoordinatorOfStandaloneGroup()
{
$xml=’<s:Envelope xmlns:s=„http://schemas.xmlsoap.org/soap/envelope/“ s:encodingStyle=„http://schemas.xmlsoap.org/soap/encoding/“><s:Body><u:BecomeCoordinatorOfStandaloneGroup xmlns:u=„urn:schemas-upnp-org:service:AVTransport:1“><InstanceID>0</InstanceID></u:BecomeCoordinatorOfStandaloneGroup></s:Body></s:Envelope>’;

$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: ‚.$this->address.‘:1400
CONTENT-LENGTH: ‚.strlen($xml).‘
CONTENT-TYPE: text/xml; charset=„utf-8“
SOAPACTION: „urn:schemas-upnp-org:service:AVTransport:1#BecomeCoordinatorOfStandaloneGroup“

'.$xml;

$this->sendPacket($content);
}

Einen Parameter braucht diese Funktion nicht. Sie wird ja auf der Instanz des Players ausgeführt, der entfernt werden soll…

Am Besten du kopierst sie hinter RemoveMember in die Klassendatei. Wenn sie funktioniert, solltest du noch den Kommentarblock über die Funktionsdefinition eintragen…

Und du musst bestimmt den Webserver, der diese Klasse verwendet, neustarten… aber ich kenne da den Rahmen nicht, und kann da gar nicht helfen…

Versuch mal, wie es mit der Version aussieht…

Grüße
Reiner

Abend!

Ich nehme einen Player wie folgt aus einer Gruppe heraus:

$room = $this->GetRoom($rooms[$i]);
$sonos[$i] = new PHPSonos($room->IPAddr);
$sonos[$i]->SetAVTransportURI("");

…ist nur ein Auszug aus meinem Code, aber ich mit dem Hinweis auf SetAVTransportURI("") solltest du weiterkommen :slight_smile: Damit wird der jeweilige Player wieder ein „Einzelkämpfer“ :smiley:

Grüße,
Chris

Hallo.

Mein Name ist Marc und ich bin neu hier in dem Forum.
Da ich selbst Sonos Lautsprecher besitze und eine Hager Domovea Visualisierung, möchte ich nun gerne über diese meine Sonos Player steuern. Mittels PHP sollte dies ja funktionieren. Leider bin ich ein Anfänger was PHP angeht. Ich habe nun schon drei Tage lang versucht meine Player anzusteuern, aber ich bekomme es nicht hin. Bitte helft mir weiter. Gibts sowas wie eine Schritt für Schritt Anleitung? Über eure Hilfe wäre ich sehr dankbar.

Danke an rleins und Bayaro, jetzt läufts!

Hi Stocki!

Hab dich net so recht verstanden…hast du IPS im Einsatz? Wenn ja, dann nimm einfach die IPSLibrary mit IPSSonos. Ist wohl der einfachste Weg seine Sonos Player ins IPS einzubinden.

Wenn du kein IPS im Einsatz hast > hier im Forum finden sich immer wieder Scripte zum Ansteuern der Sonos Boxen, da kannst du dir raussuchen was du benötigst.

Grüße,
Chris

Hallo Bayaro,

ich habe kein IPS in Benutzung. Ich würde meine Sonos Player gern mittels Script ansteuern. Aber ich komme einfach nicht weiter.
Kannst du mir das bitte Step für Step erklären. Muss ich die Sonos.php Dateien irgendwo hin speichern (Dateien als Link angehängt)?

DjMomo/sonos · GitHub

Vielen Dank im Vorraus.
:slight_smile: