wäre es möglich, für die Neulinge und ev. PHP Einsteiger mal kurz einen Einstieg in die Verwendung der PHPSonos Klasse zu geben.
Ich habe im IPS Baum eine neue Kategorie „Sonos“ angelegt und die Klasse als Script mit dem vorgegebenen Dateinamen gespeichert.
Jetzt will ich ohne Webfrontbenutzung einfach meinen Hauptplayer mit der IP 10.3.2.10 mit einem weiteren Player mit der IP 10.3.2.12 zu einer Gruppe verbinden, dann eine definierte Lautstärke einstellen und dann SmartRadio Augsburg abspielen.
Gebt mir bitte nur mal einen Tip, wie ich die Einzelteile in einem Script verbinde.
ich denke, am sinnvollsten ist es wenn du diesen Thread nebst den WIKI-Beiträgen von bengie durchhühnerst, Schritt für Schritt bengie’s Lösung (die ziemlich gut gelöst ist und auch -bis auf Kleinigkeiten - sehr gut funktioniert) implementierst. Diese Lösung ist eine Weiterentwicklung der Sonos-Klasse und beinhaltet deutlich mehr „User-Interface-Funktionen“ -> quasi näher an einer fertigen Lösung.
Dann sollte auch recht schnell klar werden wie das ganze fúnktioniert. Fragen werden in diesem Thread auch gern beantworet.
Hi Raketenschnecke,
die Dinger habe ich doch schon durchgearbeitet. Für mich stellt sich gerade die Frage, wo ich die RINCON herbekomme oder auch den String zum richtigen Radiosender finde…
Ansonsten, liege ich mit dem Script so einigermaßen richtig? Kann es erst heute Abend testen.
Zonen verbinden
Lautstärke einstellen
I-Net Radiosender einstellen und abspielen
Gr, Stromer
Anbei mal meine zusammenkopierte Version.
<?
include("PHPSonos.inc.php");
// SonosMaster 10.3.2.51
// SonosSlave 10.3.2.52
// Get Script Parent
$ParentID=(int)br_objParent ($IPS_SELF);
// Talk to Coord
$sonos = new PHPSonos("10.3.2.51"); //Sonos ZP IP Adresse Wohnzimmer
/* ****************************** ZONEATTR AND INFO EXAMPLE ***********************************
$ZoneAttributes = $sonos->GetZoneAttributes();
print_r( $ZoneAttributes);
$ZoneInfo = $sonos->GetZoneInfo();
print_r( $ZoneInfo);
// ******************************* /ZONEATTR AND INFO EXAMPLE ************************************/
/* ****************************** AddMember EXAMPLE****************************/
$AddMember = $sonos->AddMember("RINCON_000E5825411201400");
echo "
DEBUG AddMember:
";
print_r( $AddMember);
// Talk to slave
$sonos = new PHPSonos("10.3.2.52"); //Slave Sonos ZP IP Address Sonos Schlafzimmer
echo "
";
$ret = $sonos->SetAVTransportURI("x-rincon:" . "RINCON_000E5832FB5C01400");
echo "
DEBUG SetAVTransportURI to "."x-rincon:" . "RINCON_000E5832FB5C01400" ."
";
// Playing starts
//IPS_Sleep(1000);
//* ****************************** RemoveMember EXAMPLE****************************
// Talk to Coord
// $sonos = new PHPSonos("10.3.2.51"); //Sonos ZP IPAdresse
// $RemoveMember = $sonos->RemoveMember("RINCON_000E5825411201400");
// echo "
DEBUG RemoveMember:
";
// print_r( $RemoveMember);
// Talk to slave
// $sonos = new PHPSonos("10.3.2.52"); //Slave Sonos ZP IPAddress
// needed for stop of playback on Slave
// $sonos->SetAVTransportURI("");
// echo "
DEBUG SetAVTransportURI to NONE
";
//Playing stops
// ****************************** /AddMember and RemoveMember EXAMPLE****************************//
// Steuern der Lautstärke über eine Variable
$Volume = GetValueInteger(49317 /*[.Sound\.Control\iMP_Volume]*/ );
$sonos = new PHPSonos("10.3.2.51"); //Sonos ZP IPAdresse Wohnzimmer
$sonos->SetVolume($Volume); //0-100 in %
Radiosender abspielen / Play radio
$sonos->SetRadio("x-rincon-mp3radio://players.creacast.com/creacast/klassik/playlist.pls", "Klassik Radio");
>?
Hallo Stromer,
Du solltest Dir die br_sonos Sachen (setzen auf die PHPSonos Klasse auf) mal ansehen, da Sie auch automatisch den Status der Zonen mitschreiben und Du sehr einfach an die passenden Infos wie z.B. die Rincon kommst (stehen schon in einer Variable).
Wenn Du ohne br_sonos die Rincon haben willst, erhälst Du Sie wie unter Wiki: PHPSonos -> siehe FAQ beschrieben.
Außerdem könntest Du über die Methode GetZoneInfo(); die MAC abfragen und daraus die RINCON ableiten.
Br_sonos macht das im Setup Z.B. so:
Die Radio URL bildest Du aus den Informationen von der Homepage eines Senders. Oder Du liest den String mit dem Intel Tool DeviceSpy aus dem Gerät aus (GetPositionInfo) bzw. nutzt die gleichnamige PHPSonos Methode.
Ein Netzwerksniffer ginge sonst natürlich auch.
Ansonsten, liege ich mit dem Script so einigermaßen richtig? Kann es erst heute Abend testen.
Zonen verbinden
Lautstärke einstellen
I-Net Radiosender einstellen und abspielen
Ja, ich denke Dein geposteter Code wird funktionieren, wenn die Rincons stimmen.
Du musst noch diese Zeile entfernen (nicht notwendig, stammt aus br_ips / br_sonos)
$ParentID=(int)br_objParent ($IPS_SELF);
Wobei ich bisher immer zuerst spielende Zonen hatte und dann die Addmember Methode ausgeführt habe - sollte aber kein Unterschied machen.
Viele Grüße und Viel Spaß, Benjamin
[Edit]: Die Infos aus diesem Beitrag sind jetzt auch ins Wiki eingebaut
Hi Bengie,
habe jetzt erst Deine Anfrage gesehen. Bin z.Zt. leider nur selten dazu gekommen an der Klasse weiter zu arbeiten.
Ich poste am Ende mal die Browse Funktion.
Ich habe vorher noch eine Frage. Wie kann ich die ZonePlayer ermitteln?
Z.Zt. habe ich eine Konfigurationsdatei, die sämtliche Geräte fest eingetragen hat. Bei mir sind aber nicht immer alle Geräte an und ich möchte nun ermitteln, welche Geräte an sind bzw. im Sonos-System bekannt.
Der Desktop Kontroller macht das ja auch sehr flott aber im wireshark kann ich nicht wirklich erkennen, wie er das macht.
Hast Du da eine Idee?
Hier nun die Browse funktion, wie ich sie verwende:
Der Controller nutzt das SSDP Protokoll. Dabei senden die Sonos ZP eine Nachricht an einen Controlpoint (Controller) bzw. man kann durch senden einer Nachricht die Geräte (ZP) zur Antwort ermuntern.
Ich brauche das bisher nicht, daher habe ich mir noch keine Gedanken zur Umsetzung mit PHP gemacht. Im Wireshark habe ich die Requests aber schon gesehen.
Ich hoffe das hilft Dir weiter und ich schreibe nichts, was Du schon kennst.
Hier nun die Browse funktion, wie ich sie verwende:
damit nach den vielen Monaten auch mal eine nicht als „Test“ markierte Klasse zugänglich ist, veröffentliche ich die nun seit einiger Zeit genutze Klasse mit unseren Änderungen (welche so bis auf die Kommentare auch im br_sonos.zip sein sollte).
Bei der Entwicklung gab es teilweise ein Vor- und Zurück und ich habe versucht zumindest einen Teil davon über die Historie im Vergleich zur letzten Version abzubilden.
Historie:
- 110328 - br corrected titel to title and other things...
- 110328 - br added optional parameter id to SaveQueue
- 110406 - br edited Seek to accept UPNP Unit parameter as option (sec. arg is Target then)
- 110406 - br edited GetPositionInfo to also reflect UPNP return value names
- 110406 - br fixed non valid soap request in seek()
- 110406 - br added return of CurrentURI and CurrentUriMetaData to GetMediaInfo (Current File or QUEUE)
This info is needed to restart a queue, pl or radiostation
- 110407 - br consolidated SetRadio, SetQueue and SetAVTransportURI
two last now also support MetaData as optional, 2nd parameter; SetRadio supports the name of a radiostation as an optional second parameter
- 110529 - br GetMediaInfo now returns Radio station in the array, key is title
- 110529 - ta lun added browse functions
- 110529 - br fixed problem with missing parentid in browse()
- 110529 - iamking added GetAlarmTime()
- 110529 - ta lun fixed misc bugs and GetAlarmTime() now returns an array
- 110530 - br edited Browse() to reflect upnp possibilities
- 110601 - br renamed GetAlarmtime to ListAlarms to reflect upnp Names
- 110601 - iamking improved ListAlarms - added ProgramURI, ProgramMetaData, PlayMode, Volume, IncludeLinkedZones
- 110614 - br added parameters to Browse / http://110530www.ip-symcon.de/forum/f53/php-sonos-klasse-ansteuern-einzelner-player-7676/index10.html#post120977
- 110627 - talun edited GetSonosPlaylists: urlencode file
- 110711 - br fixed Problems in SetAVTransportUri
TODO/BUG - 110819 - br/talun TODO edit Browse to return duration
Für mich pers. ist mein nächstes Todo: die Änderungen in der Browse Funktion von Ta Lun zu sichten, testen und einzubauen. Außerdem werde ich wohl mal Routinen zum Auslesen der Daten der ZP Eingänge bauen (da man diese ja leicht ansprechen kann, möchte ich ja auch wissen wie mein Input benannt ist).
Ansonsten sind Subcribes und die Suche nach ZP im Netz (mit PHP) natürlich sehr spannend.
[EDIT: Wiki ist jetzt aktualisiert. bitte Info, wenn Ihr eine Idee habt wie man an die Bilder der Radiosender kommt bzw. wo bisher das Problem ist.]
Hallo,
habe im SONOS-Forum jetzt den Hinweis bekommen, dass die Quelle der Radiostationen von Radiotime.com kommt und dass es dort auch eine [b]API[/b] gibt. Kann persönlich leider nicht viel damit anfangen; vielleicht hilft es euch aber weiter.
Nachträglich/ per PHPSonos, kann man die Stationid rausfinden per GetMediaInfo als CurrentURI und diese dann zum bilden des o.g. OPML Aufrufs verwenden.
Wenn man per PHPSonos die Stream URL setzt:
Wird erstmal kein Logo (auch nicht beim Original Controller angezeigt), sondern nur die per Metadata an den Set TransportUri übergebenen Infos (da setzen wir derzeit nur „Title“).
Also müsste man in diesem Fall wohl die Logo Url beim SetAVTransportUri mitgeben:
<upnp:albumArtURI>http://</upnp:albumArtURI>
… um Sie dann später per GetPositionInfo zu erhalten…
Ein schöner Ansatzpunkt - ich muss noch genauer testen, aber tausend Dank für die interessanten Infos!!
Die Infos kannst Du auch im Sonos Forum gerne verlinken.
Array
(
[0] => Array
(
[id] => SQ:3
[title] => Enya cd 1
[typ] => Sonos
[file] => file%3A%2F%2F%2Fjffs%2Fsettings%2Fsavedqueues.rsq%233
)
[1] => Array
(
[id] => SQ:2
[title] => Enya cd 2
[typ] => Sonos
[file] => file%3A%2F%2F%2Fjffs%2Fsettings%2Fsavedqueues.rsq%232
)
[2] => Array
(
[id] => SQ:4
[title] => Enya cd 3
[typ] => Sonos
[file] => file%3A%2F%2F%2Fjffs%2Fsettings%2Fsavedqueues.rsq%234
)
[3] => Array
(
[id] => SQ:5
[title] => Harry Potter
[typ] => Sonos
[file] => file%3A%2F%2F%2Fjffs%2Fsettings%2Fsavedqueues.rsq%235
)
[4] => Array
(
[id] => SQ:7
[title] => Rock and Roll
[typ] => Sonos
[file] => file%3A%2F%2F%2Fjffs%2Fsettings%2Fsavedqueues.rsq%237
)
[5] => Array
(
[id] => SQ:53
[title] => Test
[typ] => Sonos
[file] => file%3A%2F%2F%2Fjffs%2Fsettings%2Fsavedqueues.rsq%2353
)
)
===============================================================
Fatal error: Uncaught exception 'Exception' with message 'Error sending command: HTTP/1.1 400 Bad Request
Content-type: text/html
Connection: close
Error 400Error 400Bad Request' in C:\IP-Symcon\scripts\PHPSonos.inc.php:1446
Stack trace:
#0 C:\IP-Symcon\scripts\PHPSonos.inc.php(1315): PHPSonos->sendPacket('POST /MediaServ...')
#1 C:\IP-Symcon\scripts\288br_sonos_test.php(168): PHPSonos->Browse('SQ:53', 'c')
#2 {main}
thrown in C:\IP-Symcon\scripts\PHPSonos.inc.php on line 1446
Die SQ:53 sollte es ja nach der o.g. Ausgabe geben? Hab ich das Falsch übergeben oder habe ich beim einbauen der zusätzlichen Parameter einen Fehler gemacht?
ich versteh nur Bahnhof Verfolge das Thema aber mit brennendem Interesse, was mich am interessiert ist eine Anzeige- und Auswahlfunktion der Musik-Quellen. Ich sehe: Ihr kommt voran:)
Hallo Benjamin,
habe Deinen Code „GetAudioInput“ mal bei mir in die PHPSonos eingefügt und dann abgefragt. Bei mir kommt dann jedoch ein Timeout: „Fatal error: Maximum execution time of 30 seconds exceeded in [Sonos\SONOSLibs\PHPSonos.inc.php] on line 1411“ Das ist bei mir die Zeile „$buffer = fgets($fp,128);“
Ich habe das gleiche gemacht wie Du habe mir mit GetSonosPlaylists die Playlist ausgegeben und habe mal meine höchste ID genommen und diese aufgerufen. Mal mit den Parameter „c“ mal ohne und jedes mal funktioniert es.
Ich hänge mal meine Klasse mit dran. Bitte teste das einmal damit.
Ich glaube ich hatte das wieder Rückgängig gemacht aber ich hatte beim Event rumgespiele auch mit den funktionen
XMLsendPacket
und
sendPacket
gespielt, da diese sonst zu Timeouts führten (in den ersten test jedenfalls)
Hoffe Du findest was und wir können wieder auf einer Klasse aufsetzen.
Hum, ich habe es jetzt mit Deiner Browse Funktion probiert und es klappt!
Das merkwürdige ist das mir der Totalcommander Dateivergleich bei der Browse Funktion und den sendpacket Funktionen keinen Unterschied zwischen unseren Funktionen anzeigt.
Naja, ich habe jetzt Deine Browse Funktion in die Klasse kopiert.
Aber „Duration“ ist bei mir immer „leer“ (wie ja in Deiner Ausgabe auch). Bekommst Du da in irgendeiner Konstellation eine Länge zurück???
Edit: zu GetAudioInputAttributes (ich habe die Funktion bei mir nochmal umbenannt, so dass sie dem UPNP Namen entspricht):
Die Ausgabe „Line-In“ und kein zugeordnetes Bild erhälst Du immer wenn für diesen ZP kein Eingang definiert/konfiguriert wurde.