Archiv des ehemaligen Wiki
Die Inhalte sind seit Januar 2016 archivert und somit nicht mehr auf dem aktuellsten Stand

PHPSonos

Allgemein / Overview

Die PHPSonos Klasse wurde von Paresy zuerst im Thread Einzelne Sonos Player ansteuern veröffentlicht und später in einer aktualisierten Fassung im Thread PHP Sonos (Klasse zum Ansteuern einzelner Player) als Klasse zur Verfügung gestellt.

Verschiedene IPS Benutzer haben die Klasse inzwischen erweitert oder im zuletzt genannten Thread Hinweise zum Handling ausgetauscht.

Paresy released his first version of PHPsonos in this forum thread Einzelne Sonos Player ansteuern. He later build a class and rereleased his routines in this thread: PHP Sonos (Klasse zum Ansteuern einzelner Player).

There is a growing community of sonos enthusiasts supporting and developing PHPSONOS - we share knowledge and developements in this thread PHP Sonos (Klasse zum Ansteuern einzelner Player)

Hilfreiche Links für Entwickler / useful links for developers

Travelmarx on exploring Sonos Travelmarx post on extracting playlists Intel dev Tools Original Thread for PHPSonos Tood´s clarifications on STP

Links to your Devices (examples for developers):

http://your.sonos.i.p:1400/status (Cool!!)
http://your.sonos.i.p:1400/support/review
http://your.sonos.i.p:1400/xml/zone_player.xml
http://your.sonos.i.p:1400/advconfig.htm

Sonos Dokumentation / Sonos documentation

Im Quellcode wurde bei den neueren Veröffentlichungen eine Inline Dokumentation hinzugefügt. Eine aktuelle Dokumentation kann jederzeit über den phpDocumentor generiert werden. In Verbindung mit IPS 2.5 sollte man dafür mindestens die Version 1.4.4 einsetzen, welche nicht in den News beworben wird, aber über die Seite "Downloads" verfügbar ist.

Historie / History

Installation

Die Datei der Klasse muss in IPS (bzw. das Skript) eigebunden werden. Es ist ggf. von Vorteil dies unter einem besonderen Namen durchzuführen um diesen später wieder verwenden zu können - Ich speichere die PHPsonos.inc.php z.B. meist unter genau diesem Namen

The Class file has to be included in your IPS and/or PHP scripts. Just use PHPSonos in a way similar to SOAP, and you get the expected behaviour. We implement functions mainly based on the upnp bahaviour.

Konfiguration / Configuration

Die PHPSonos Klasse selber, bedarf keiner weiteren Konfiguration!

Weiterer Quellcode aus dem Umfeld der Heimautomatisierung oder zum auffangen der Rückmeldungen benötigt ggf. Parameter. Die Benennungen der PHP SONOS orientieren sich an den UPNP / SOAP Namen!

Names, functions and parameters will always try to follow the UPNP and SOAP reality! There is no need for a special configuration.

Download / Forum / Aktuellste Version

http://www.ip-symcon.de/forum/threads/7676-PHP-Sonos-(Klasse-zum-Ansteuern-einzelner-Player)

WICHTIG

Hiho, ich hatte mich ja etwas zurückgezogen von der PHPSonos Bastelei. Im Wiki wurden die letzten Download Links ja leider auf den Thread im Forum umgebogen. Viele Probleme hier sind auf die Verwendung einer alten Version z.B. aus dem 1. Post zurückzuführen.

Die letzten von mir veröffentlichten Downloads waren:
phpsonos: http://www.ip-symcon.de/forum/attachment.php?attachmentid=15305&d=1328464753
Doku: http://www.ip-symcon.de/forum/attachment.php?attachmentid=15306&d=1328464761
Mein Testskript: http://www.ip-symcon.de/forum/attachment.php?attachmentid=15308&d=1328471587
Forenpost dazu mit weiteren Infos: http://www.ip-symcon.de/forum/threads/7676-PHP-Sonos-%28Klasse-zum-Ansteuern-einzelner-Player%29?p=150811#post150811
br_sonos GUI: http://www.ip-symcon.de/forum/threads/14938-br_sonos?p=133623#post133623

Wenn ich mal Zeit finde, zippe ich es nochmal neu zusammen, so dass auch von mir in der Zwischenzeit vorgenommene Bugfixes drin sind. Mit den o.g. solltet Ihr aber prinzipiell starten, statt denen aus dem 1. Post! Ich hoffe das hilft Euch erst mal weiter.
Lg, Benjamin

Beispiele /Examples

Bei längeren Beispielen wurde teilweise nur auf den Post im Forum verlinkt. For complex examples there is only a link to the forum post.

Radiosender abspielen / Play radio

$sonos->SetRadio("x-rincon-mp3radio://players.creacast.com/creacast/klassik/playlist.pls", "Klassik Radio"); 

MP3 abspielen / Play MP3

//Neue MP3 abspielen / play mp3
$sonos->ClearQueue(); //Playlist löschen / delete pl
$sonos->AddToQueue("x-file-cifs://ipsserver/Public/test.mp3"); //Datei hinzufügen
//Playlist auswählen (Nötig, wenn Radio vorher ausgewählt war) / select pl - this is needed after playin radio
$sonos->SetQueue("x-rincon-queue:RINCON_"."HIER DIE MAC DES PLAYERS ZB: FFEEDDCCBBAA"."01400#0"); 
$sonos->Play();

Abfrage von einfachen Statusinformationen / Getting the status

$sonos->Stop(); 
$volume = $sonos->GetVolume(); // gibt die Lautstärke als Integer zurück 
$mute = $sonos->GetMute(); // gibt ein bool zurück: TRUE -> MUTE an, FALSE -> MUTE aus 

$shuffleRepeat = $sonos->GetTransportSettings(); 
// gibt ein Array zurück mit den keys 
// "shuffle" und "repeat", welche jewils bool-Werte enthalten 
// returns an array with shuffle or repeat

$status = $sonos->GetTransportInfo(); // gibt den aktuellen Status 
// des Sonos-Players als Integer zurück, 1: PLAYING, 2: PAUSED, 3: STOPPED 
// status as integer; see above

$posInfo = $sonos->GetPositionInfo(); // gibt ein Array mit 
// den Informationen zum aktuellen Titel 
// array with information to our actual title

IPS Routinen zum Auslesen und Steuern / Abfrage des Covers von Schablone / Getting the cover image

Kontrolle eines einzelnen Players - Schablones Beispiel aus dem Thread

IPS Skript zum Steuern der Lautstärke über eine Variable

include("PHPSonos.inc.php"); 
$Volume = GetValueInteger(49317 /*[.Sound\.Control\iMP_Volume]*/); 
$sonos = new PHPSonos("192.168.2.24"); //Sonos ZP IPAdresse 
$sonos->SetVolume($Volume); //0-100 in %  

IPS Skript zum Steuern der Lautstärke über Taster

Achtung, muss für verschiedene von IPS unterstützte Systeme ggf. angepasst werden:

include("PHPSonos.inc.php"); 
//Hier die Variable einfügen mit der aktuellen Lautstärke!!!! 
$Volume = GetValueInteger(11111 /*SONOS LAUTSTÄRKE AKTUELL*/); 
//Player IP-Adresse eintragen!!!! 
$sonos = new PHPSonos("XXX.XXX.X.XXX"); //Sonos ZP IPAdresse 
switch ($IPS_SENDER) 
{ 
case "Variable": 
    if($IPS_EVENT == "12345") // <--Ereignis erstellen mit Variable deines PLUS-Tasters 
    und Ausführen bei Variable Aktualisierung und die ID hier eintragen 
    { 
        $Volume_Plus = ($Volume+5); 
        $sonos->SetVolume($Volume_Plus); 
    } 
    if($IPS_EVENT == "54321") // <--Ereignis erstellen mit Variable deines MINUS-Tasters 
    und Ausführen bei Variable Aktualisierung und die ID hier eintragen 
    { 
        $Volume_Minus = ($Volume-5); 
        $sonos->SetVolume($Volume_Minus); 
    } 
    break; 
} 

Auslesen und schalten der weißen LED / Switching the white LED

echo "\n LED: " . $sonos->GetLEDState() . "\n"; 
$sonos->SetLEDState(true); 
echo "\n LED: " . $sonos->GetLEDState() . "\n"; 
IPS_Sleep(600); 
$sonos->SetLEDState(false); 
echo "\n LED: " . $sonos->GetLEDState() . "\n"; 
IPS_Sleep(600); 
$sonos->SetLEDState("On"); 
echo "\n LED: " . $sonos->GetLEDState() . "\n"; 

Auslesen von ZonePlayer Attributen und Info / Getting Zoneplayer Atributes and Info

$ZoneAttributes = $sonos->GetZoneAttributes(); 
print_r( $ZoneAttributes); 
$ZoneInfo = $sonos->GetZoneInfo(); 
print_r( $ZoneInfo); 

Hinzufügen und entfernen von Zonen zu einer Gruppe / Zonegroup control

Beispiel von bengie aus dem Forenthread

Umschalten Crossfade / Setting Crossfade

echo "GetCrossfadeMode: ". $sonos->GetCrossfadeMode() . "\n"; 
IPS_Sleep(1000); 
echo "SetCrossfadeMode true: ". $sonos->SetCrossfadeMode(true) . "\n"; 
echo "GetCrossfadeMode: ". $sonos->GetCrossfadeMode() . "\n"; 
IPS_Sleep(1000); 
echo "SetCrossfadeMode false: ". $sonos->SetCrossfadeMode(false) . "\n"; 
echo "GetCrossfadeMode: ". $sonos->GetCrossfadeMode() . "\n"; 

Abspielen eines Signals am Audioeingang / Playing a signal at the sonos´s analog input

$sonos->SetAVTransportURI("x-rincon-stream:RINCON_000E5832231C01400");  

("-stream" leitet hier auf den Input des Geräts) / ("-stream" is the key to the input)

Meldungsausgabe mit IPS / Example for IPS-announcements

Beispiel aus Forum

Playlisten / Playlists

Get SONOS PL

$sonoslists=$sonos->GetSONOSPlaylists();
print_r($sonoslists);

Imported Playlists

$arrpl=$sonos->GetImportedPlaylists();
print_r($arrpl)

Save SONOS PL

$sonos->SaveQueue("Test");

Get specific PL (Browse)

$browseliste = $sonos->Browse("SQ:53","c");
print_r($browseliste);

Edit SONOS PL

$sonoslists=$sonos->GetSONOSPlaylists();
print_r($sonoslists);
foreach($sonoslists as $sonoslist)
{
    if ($sonoslist['title']=='Test') $id=$sonoslist['id'];
}
echo $id . "\n"; // If you don´t submit id to edit a playlist, you´ll get duplicate playlists!
$sonos->SaveQueue("Test",$id);

Print titles of current playlist to IPS htmlbox

$sonoscurrentlist=$sonos->GetCurrentPlaylist(); 
$title=""; 
foreach($sonoscurrentlist as $sonoslist) 
{ 
    $title.=($sonoslist ['title'])."<br>"; 
    //   .= ist anhängen! 
} 
SetValueString (24524 /*[Zentrale Steuerung\Includes\br_sonos\all_titles_test]*/, $title);  

For more information look at this forum post.

Alarms

Alarme auslesen / Get alarms

print_r($sonos->ListAlarms());

IPS Steuerung mit Webfront Integration und Setup Skripten (br_sonos) / Complete solution for IPS with zonegroup and webfront Integration

Br sonos

Mehr dazu hier im Wiki / More at the following wiki page:
br_sonos

FAQ

Wie kann ich die Rincon eines Players oder die IP rausfinden / How to get the rincon of my player

HTTP

Du kannst die Rincon_* z.B. über folgenden Aufruf rausfinden, wenn Du die IP kennst. / you may get the rincon of your player via this http request

 http://ip-des-players:1400/xml/zone_player.xml

Windows

Einfacher geht´s auch unter Windows in der Netzwerkumgebung: Rechtsklick auf den Player -> Eigenschaften./
In MS Windows it´s even easier - you just have to right click on the upnp player object network environment and select "Preferences".

PHPSonos

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/
Further more it is possible to use PHPSonos Method GetZoneInfo(); and calculate the Rincon from the macaddr. like this :

$arrzoneplayers[$IP]['Rincon']="RINCON_".implode("",explode(":",$ZoneInfo['MACAddress']))."01400"; 

Wie kann eine Radio URL rausfinden/ How to get a working radio url

Homepage / Tunein

Die Radio URL bildest Du aus den Informationen von der Homepage eines Senders. Sonos selbst benutzt Radiotime/
Tunein welches auch eine Soap und OPML API anbietet (aktuelle PHPSonos Versionen haben einen API Key integriert um diese Informationen abfragen zu können).

You may get the information from the homepage of your favorite station. Sonos has a partnertship with radiotime/
Tunein which also offers SOAP and OPML APIs (newer PHPSonos versions include an apikey).

UPNP / PHPSonos

Oder Du liest den String mit dem Intel Tool "DeviceSpy" aus dem Gerät aus (GetPositionInfo) bzw. nutzt die gleichnamige PHPSonos Methode./
You may spy the URL using the Intel DeviceSpy Tool using the Soap Method "GetPositionInfo". With PHPsonos in place it is also possible to use this method of the class.

Sniffer

Ein Netzwerksniffer ginge sonst natürlich auch./
A network sniffer does also work.

Probleme mit mehreren Sonos Zp über LAN / Problems with more than one sonos connected via LAN

Brauche ich einen extra Switch. Nein das kann natürlich auch der gleiche Switch sein, aber es kann nicht jeder Switch STP(deswegen der Hinweis).

Ich vermute den Grund für diese Notwendigkeit in einem Netzwerkloop (es gibt dazu auch Diskussionen im SONOS Forum), welches das STP durch selektives Abschalten von diesen Loops natürlich verhindern kann.

Auslöser ist diese nette Funktion: Die Ports an den Sonos Geräten sind wie eine WLan Bridge nutzbar. Du kannst quasi als Verlängerung Deines Lans einfach etwas an einem x beliebigen ZP anschließen und das Gerät ist dann über das WLAN der Sonos Geräte in Deinem LAN (nicht sonderlich fix, aber es klappt).

If you connect more than one Sonos ZP to your Lan you must use a STP (Spanning Tree) enabled Switch!

Es gibt von Todd ein Posting zur Klarstellung wie Sonos und STP arbeiten (Sonos Support Team):/
Please read todd´s (member of the official Support Team) clarifications on sonos and STP use:

Todd´s (SONOS) clarifications on STP and SONOS