a) Hier bist du im IP SYMCON Forum
b) Du kannst einen eigenen Thread aufmachen und genauer beschreiben, wo genau dein Problem ist, dann hilft dir vlt. jemand, aber einfach hier anmelden und eine Copy & Paste Anleitung fordern > DaumenRunter
Vor allem hast du selbst schon eine mögliche PHP Class mit einer guten Beschreibung verlinkt. Das ist ja schon quasi Copy&Paste. Mit Faulheit kommt man nicht weit und beliebt macht man sich so auch nicht unbedingt
In Post #393 wird auf die Befehle „Set/Get Group Volume“ hingewiesen. Leider scheint diese Funktion in meiner PHPSonos gar nicht implementiert zu sein.
Ich habe jetzt schon längere Zeit mit Wireshark verbracht, um eine Idee davon zu bekommen, wie man sowas anpacken könnte - musste mir aber gerade eingestehen, dass ich da wohl keinen Durchblick habe… :rolleyes:
Hat evtl. jemand ein paar Codezeilen für mich, die ich verwenden kann, um die Gruppenvolume zu setzen?
Kurz gesagt, einfach die Gruppen-Member alle einzeln auf Lautstärke X setzen, durch eine Funktion mit foreach oder sowas. Oder von jedem einzelnen Member die Lautstärke auslesen und um z.B. 10 erhöhen.
der Post stammt von mir. Und ja, den Befehl gibt es in der Klasse noch nicht. Ich habe lediglich das Konzept (und die Befehlsnamen-/parameter) beschrieben, da ich die Klasse hier gar nicht verwende.
Ich würde auf die Sonos-eigene Funktionalität für die Gruppenlautstärke zurückgreifen. Das ist im Prinzip nicht kompliziert, du musst dir nur die von mir beschriebenen Befehle in der Klasse umsetzen (oder vielleicht hat es es schon jemand anderes gemacht, und kann es posten). Ich kann hier immer nur ungetesteten Code posten, der leider nicht immer auf Anhieb funktioniert, da ich hier momentan noch nicht mal PHP vorliegen habe…
Kurz nochmal zum Verständnis:
Wenn du im Sonos-Controller bei einer Gruppe auf den Lautstärkebalken tippst, wird „SnapshotGroupVolume“ ausgeführt, womit also die Lautstärkeverhältnisse, wie sie aktuell in der Gruppe vorliegen, gespeichert werden.
Wenn du dann die Gruppenlautstärke veränderst wird „SetGroupVolume“ ausgeführt, welches dann alle Player im gespeicherten Verhältnis zueinander verändert. Natürlich kannst du auch die Lautstärke an einem Player verändern, was zu einer Anpassung der Gruppenlautstärke führt.
Mit „GetGroupVolume“ kannst du dir die aktuell gesetzte Laustärke holen, um ein Gefühl dafür zu bekommen, welche Lautstärke beim Setzen überhaupt sinnvoll ist. Beim Controller passiert das automatisch dadurch, dass der Slider ja an einer bestimmten Stelle steht, und du ihn von dort verschiebst…
Wow! Vielen Dank für die schnellen, hilfreichen Antworten, Reiner und Chris!!!
Mit Hilfe des Programs Device Spy habe ich den ganzen Sachverhalt endlich mal kapiert!
Mit bisschen rumprobieren und abkupfern konnte ich das Skript nun auch erfolgreich erweitern:
ich setze PHPSonos.inc.php seit langer Zeit erfolgreich ein. Nun habe ich mein Sonos upgedate und die Funktion GetSonosPlaylists schein nicht zu funktionieren.
In diesem Bereich bricht das PHP ab und echo „7=…“ wird nicht mehr angezeigt:
Dieses Thema ist bekannt und wurde auch schon an einigen Stellen „bearbeitet“ Siehe z.B. im IPSSonos Thread. Dort gibt es eine überarbeite Version der PHPSonos, welche mit Sonos ab Version 6 wieder funktioniert.
Alternativ gibt es verschiedene Projekte, um Sonos zu steuern (SymconSonos (IPS4 Modul), SonosBY (Skript)).
vielen Dank für die schnelle Reaktion. Ich hatte vorher im Forum gestöbert, aber leider nicht den letzten Stand des Skriptes PHPSonos.inc.php gefunden.
Nun habe ich das Skript von Deinem Link geladen und unter PHPSonos3.inc.php. Es hat 2371 Zeilen und fängt wie folgt an:
if(array_key_exists($zone, $zones))
{
$sonos = new PHPSonos($zones[$zone]); //Sonos ZP IPAdresse
switch($do)
{
case ‚SpielPlaylist1‘:
$PlaylistName = „Playlist1“;
foreach ($sonos->GetSONOSPlaylists() as $sonoslist){
if ($sonoslist[‚title‘]==$PlaylistName){
$PlaylistFILE= $sonoslist[‚file‘];
break;
}
}
$sonos->ClearQueue();
$sonos->AddtoQueue("$PlaylistFILE");
$sonos->SetQueue(„x-rincon-queue:RINCON_“.„gelöscht“.„01400#0“);
$sonos->Play();
break;
case 'SpielPlaylist2':
…
Mit dem „alten“ Skript PHPSonos2.inc.php funktioniert alles für mich Notwendige bis auf die Funktion GetSONOSPlaylists(). Diese Funktion bricht irgendwie ab.
wie bereits von Chris erwähnt: Du verwendest PHPSonos, und das hat hier einen eigenen Thread.
Kurz um:
Ich verwende eine andere Methode um Soap aufzurufen. Ich ekomme dann die Soap antwort als Array und nicht als xml zurück. Mit der Antwort mache ich folgendes:
foreach ((new SimpleXMLElement($sonos->BrowseContentDirectory('SQ:')['Result']))->container as $container) {
if ($container->xpath('dc:title')[0] == $name){
$uri = (string)$container->res;
break;
}
}
Sprich:
Das Soap XML enthält ein weiteres XML in dem Tag „Result“. Das sieht so aus:
bis zur Sonor-Version 5.5 ging die Funktion GetSonosPlaylist bei mir. Die Funktion GetSonosPlaylists() in PHPSonos.inc.php ist bei mir wie folgt aufgebaut:
//Liefert ein Array mit allen Sonos Wiedergabelisten und deren Aufrufinformationen
public function GetSonosPlaylists()
{
$header='POST /MediaServer/ContentDirectory/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"
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:Browse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1"><ObjectID>SQ:</ObjectID><BrowseFlag>BrowseDirectChildren</BrowseFlag><Filter></Filter><StartingIndex>0</StartingIndex><RequestedCount>100</RequestedCount><SortCriteria></SortCriteria></u:Browse>
</s:Body>
</s:Envelope>';
$content=$header . '
Content-Length: '. strlen($xml) .'
'. $xml;
echo "header=";
print_r($xml);
$returnContent = $this->sendPacket($content);
echo "Content=";
print_r($content);
echo "<br>";
echo "returnContent=";
print_r($returnContent);
echo "<br>";
echo "Danach";
Es kommt gar kein Ergebnis zurück, so dass ich m.E. an der Sonos-Abfrage etwas geändert haben muss.
Damit habe ich mein „SonosBY“ gebaut und getestet. Da werden alle UPnP Geräte im Netzwerk gescannt und du kannst alle Funktionen sehen und testen Wenn du einen Befehl testen willst, einfach drauf gehen, INVOKE machen und mit F12 (oder rechte Maustaste und „Show Paket Capture“) kannst du dann die XML die er gesendet hat und die Antwort anschauen und sehen wo etwas schief laufen könnte.
Ab Sonos v6 war doch noch das Thema mit den zu großen Rückgaben, die dann in einzelne Chunks aufgeteilt werden…vlt. ist auch da das Problem zu suchen? Weil Sonos gibt immer etwas über UPnP zurück…selbst wenn man „Mist“ anfragt, dann kommt halt ein Fehler zurück.
Habe mich aber nicht wirklich mit PHPSonos beschäftigt, weil es mir persönlich zu schwer verständlich war vom Code. Vielleicht wird da was „falsches“ als Antwort auch verworfen.
vielen Dank für Deine guten Tips. Mit DeviceSpy konnte ich nachvollziehen, dass die SOAP-Action
POST /MediaServer/ContentDirectory/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"
noch funktioniert und sinnvolle Playlisten zurück gibt.
Dann habe ich mir das Senden und Empfangen in PHPSonos.inc.php angeschaut und einen Debug-Modus aktiviert. Die Antwort sieht gut aus und es wird alles bis zum </DIDL-Lite> ausgegeben. Dennoch verarbeitet PHPSonos.inc.php es nicht und ich vermute Formatänderungen im Rückgabestring. Das muss ich mir detailliert anschauen.