PHP Sonos (Klasse zum Ansteuern einzelner Player)

Nicht verweifeln, ich brauche auch immer ein wenig Bedenkzeit um eine Info aus dem Forum für mich umzusetzen oder auszuprobieren :rolleyes:!

Ich hoffe so etwas wird vertändlicher wenn die PHPSonos Doku besser wird (Wiki + Output aus dem Documentor).

Grüße, Benjamin

(Ein Beispiel zur möglichen Doku findest Du im Anhang)

documentation.pdf (88.8 KB)

Da hast du dir ja richtig viel Arbeit gemacht. Jedoch ist es als Laie wie ich einer bin doppelt schwer, wenn man der englischen Sprache nicht mächtig ist.

Grüße

Naja, ich habe bisher für ca. die Hälfte der Klasse entsprechende erste Kommentare (bei weitem noch nicht vollständig) in den Quellcode gebaut um daraus automatisch so ein PDF erzeugen zu können. Vieles macht phpdoc automatisch, ich musste mich eher mal einarbeiten und verstehen wie das funktioniert.

An einigen Stellen sind auch bereits Links zu Foren oder Wikiartikeln eingebaut, welche ja wenn man vom Forum spricht immer deutsch oder beim Wiki deutsch und english sind.

Ich versuche jetzt noch einmal über die restliche PHPSonos drüberzugehen und vielleicht noch ein zweites mal mit ergänzenden Informationen und dann den Quellcode mit den Kommentaren und ein PDF zu veröffentlichen. Vielleicht finden sich dann noch weitere User (?) die das ergänzen und die Dokumentation wird automatisch immer besser und besser… :smiley:

Viele Grüße, Benjamin

[TEST Documentation]

Hallo,
als Anhang mal ein Zip mit der aktualisierten Klasse bereichtert um Kommentare die hoffententlich auch automatische PHPDoc Dateien auswerfern.

Ein Beispieloutput ist als documentation.pdf dabei (kann sich aber auch jetzt jeder selbst generieren).

Falls sich Jemand mit phpdoc auskennt, bin ich für jeden Hinweis dankbar, wie man mit der Inline Dokumentationen besser arbeiten kann.

Bis auf die Änderungen beim Entfernen einer Zone, gibt es in dieser Datei bzw. in der Klasse funktional keine Änderungen!

Viele Grüße, Benjamin

phpsonos-doc-test.zip (120 KB)

Hab hier mal getestet aber irgendwie bringt mir
SetAvtransportUri immer einen Fehler wenn ich die var[$radio][„res“] einsetzte
Hat hier schon jemand eine Lösung ?

Gruß Bruno

Hi Bruno,
falls Du das Problem mit einer URL „x-sonosapi-stream…“ hast (so sehen die über die interne Radiofunktion angelegten aus in „res“), kann ich das Prob. nachvollziehen.


// klappt nicht
$sonos->SetRadio($browselist[0]['res']);
// eigentlich gleich - klappt 
$sonos->SetRadio("x-sonosapi-stream:s90495?sid=254&flags=32");

Ich denke es ist ein encoding Problem, aber ich konnte das Problem leider bisher (1,5 h :mad:) noch … nicht beheben.
Grüße, Benjamin

Ja genau so
3h und keine Ahnung warum :mad:

Also weiter suchen und Testen
Gruß Bruno

Hallo Bruno,
so klappt´s:

// Play
$sonos->SetRadio(urldecode($browselist[0]['res']));
$sonos->Play();

:slight_smile:
Grüße, Benjamin

Hallo Benjamin,
das ist ja interessant. Habe natürlich sofort versucht das bei mir umzusetzen. Aber wie gewöhnlich klappt das bei mir nicht richtig, da ich nicht genau weis, wo diese Zeilen hin gehören. Habe ein neues Script erstellt:

<?

if($IPS_SENDER == "WebFront")
{
   SetValue($IPS_VARIABLE, $IPS_VALUE);
   
   require ("functions.inc.php"); // use PHPSonos.inc.php here
	// Player has no configured input
	$sonos = new PHPSonos("192.168.2.134"); //Sonos ZP IPAdresse
	
    // Play
	$sonos->SetRadio(urldecode($browselist[0]['res']));
	$sonos->Play();
}

?>

Dieses Script habe ich der Variablen „Radio“ als Actionscript zugeordnet und bekomme im Webfront bei Klick auf eine Radiostation eine Fehlermeldung.

Hallo Jürgen

Du must zuerst das Skript von hier aufrufen

Ach Ja
Danke Benjamin jetzt gehts:)

Gruß Bruno

Hallo Bruno,
hatte ja vorher schon das von dir genannte Script ausgeführt. Dadurch wurde mir ja die Favoritenliste in die Variable geschrieben. Damit im WF bei Klick auf einen Favoriten dieser auch abgespielt wird, habe ich dieses von mir gepostete Script erstellt und als Actionscript für die Variable „Radio“ hinterlegt. Das produziert jedoch die von mir gezeigte Fehlermeldung. In der Fehlermeldung wird das Script 32305.ips.php (das von mir oben gepostete Script) bei line 12 beanstandet. Das ist folgende Zeile: $sonos->SetRadio(urldecode($browselist[0][‚res‘]));

Grüße, Jürgen

Hallo Ihr Zwei,
ich habe das für mich (in Verbindung mit br_sonos) ein wenig aufgebohrt.

Das von mir zuerst gepostet Skript müsst Ihr nur ausführen, wenn sich die Radiosender mal ändern oder z.B. per Timer nur täglich.

Das beigefügte Skript (prinzipiell ist es br_sonos_update.php, aber etwas zusammengedampft) hängt Ihr über „bei Variablenaktualisierung“ an die Radio Variablen und es schaltet dann automatisch den richtigen Zoneplayer (falls die Zonen verknüpft sind den Coordinator oder hart den Aktuellen - ist konfigurierbar). :smiley:

Es reicht ürbigens eine DataID für alle Zonen, welche dann im Skript zu hinterlegen ist. Die Auswahlvariable muss aber pro Kategorie/ Zone vorhanden sein (muss jedoch nicht im Skript angepasst werden; ein Skript für alle Zonen).

Viele Grüße, Benjamin

br_sonos_radiofav_update.php.txt (1.84 KB)

Hallo Benjamin, Bruno,
das hier ist ja ganz großes Kino!!:smiley: Funktioniert jetzt tadellos. Hat zwar etwas gedauert, bis ich gerafft habe, dass die Variable $RadioFavSelID direkt ins Hauptverzeichnis der Zonen rein muss. Sonst weiß das Script ja gar nicht, welcher Player angesprochen werden muss.
:smiley: Nochmals vielen Dank; weiter so. :smiley:

Grüße, Jürgen

Hallo zusammen

Erst einmal, herzlichen Dank! Ich habe mir eine iPhone Webapp mit dem PHPSonos Script gebaut - funktioniert soweit perfekt.

Wie kann ich auf einer S5 Boxe die IP Adresse des Masters holen?

Besten Dank!
Gruess

erläuter mal was du genau meinst
:confused:

Hallo!

Besten Dank für deine Antwort. Sagen wir, meine Wohnzimmer S5 ist Slave vom TV-Zimmer. Wenn ich nun auf dem Wohnzimmer bin, habe ich eine Chance, wie ich die IP-Adresse vom TV-Zimmer erhalten kann?

Gruess

hm, ich bin mir sicher ich hab deine Frage nicht verstanden, aber ich antworte trotzdem mal:

Die Sonos-Klasse in diesem Thread setzt voraus das du die IP der anzusteuernden SONOS in das Script einträgst. Man kann das natürlich auch in eine Variable auslagern.
Also liest man die IP nicht irgendwo aus (zumindest nicht im Kontext dieses Threads) sondern man weiß diese vorher und trägt diese ins Script/Variable ein.

Vielleicht beschreibst Du einfach mal was du erreichen möchtest.

Ja, das ist mir bewusst. Ich möchte von einem Sonos-Gerät (dessen IP ich eingetragen habe, wie von dir beschrieben) wissen, sofern gesetzt, wer der Master ist.

Wenn ich dem Gang die Küche zuweise, ist m.W. der Gang der Master der Küche.

Ich habe mir eine iPhone-Webapp gebaut und gehe nun auf die Küche - erhalte dort aber keine Daten, da nicht Master. Nun möchte ich die IP vom Gang „erhalten“ (oder wenigstens der Name oder sonstwas - ich kann die Zuordnung IP-Unique ID ja selber machen). Damit möchte ich dann auf der Detailseite der Küche auf den Gang weiterleiten.

Also, idealerweise machst Du einen Subscribe und erhälst die Informationen dann als Event zurück (sobald sich die Zonen Topologie ändert). Die Subscribe Funktion ist in PHPSonos bereits implementiert - die Auswertung mittels Registervariablen derzeit in IPS noch nicht (wobei ich ein wenig Beispielcode habe). Funktionierenden Beispielcode zum Umgang mit der Antwort ohne IPS findest Du in diesem Thread (ein Artikel von talun; find eich just nicht auf die schnelle).

Ansonsten ist es auch möglich an Hand von Indizien in den Rückgabewerten von vielen Methoden auf den Master (richtig: Coordinator) einer Zone zu schließen. z.B. spielt der „Slave“ die „Rincon ID“ des Coordinators (Renderers) ab, wenn Du GetPositionInfo abfragst. So mache ich es derzeit noch im Paket „br_sonos“ (Thread und Wikiartikel ist ebenfalls hier zu finden).

Beispiel (Ausschnitt):

$posInfo = $sonos->GetPositionInfo();                     // gibt ein Array mit den Informationen zum aktuellen Titel zurück (Keys: position, duration, artist, title, album, albumArtist, albumTrackNumber)
if (strstr($posInfo["trackURI"],"x-rincon:")){ // Detection Zone Master or not

	// TrackUri to ZoneplayerIP
	preg_match("/^x-rincon:(?P<Rincon>\w+)/i", $posInfo["trackURI"], $match); //Got real RIncon
	// print_r($match);
   //echo $arrzoneplayers[$match['Rincon']]['IPAddress']."!!!!!!!!!!!!"; // DEBUG
	$curCoord=$match['Rincon'];

Von der ID auf die IP kannst Du ja lt. Deinem Post selbst schließen - dann sollte Dir das o.g. erstmal weiter helfen. :slight_smile:

Veile Grüße, Benjamin

Super Benjamin, vielen Dank! Ich habe mir mithilfe eines assoziativen Arrays weitergeholfen.

Noch eine Frage: Wie kann ich in Sonos eine definierte Playliste abspielen? Nehmen wir an, ich habe eine Liste „Background Sounds“ - besteht die Möglichkeit, diese auf einer Boxe abzuspielen? Und wenn ja, kann ich dieser dann noch Slaves anhängen?

Beste Grüsse
Nicola