PHP Sonos (Klasse zum Ansteuern einzelner Player)

Brauche mal Unterstützung in Sachen Abfrage von SONOS „Volume“ und „Funktion“.
Ich mache aktuell alle 3 Sekunden eine Abfrage per Skript für jedes SONOS Gerät und zwar immer wenn der Hausmodus „Anwesend ist“.
Das heisst das jedes SONOS Gerät bei mir minütlich 40mal übers Netzwerk angepingt wird, mal 5 Geräte macht alleine 200 „Netzwerkbewegungen“ nur für das Abfragen der SONOS Stati. Gefühlt fandt ich das nie gut, merke jetzt aber erste Ausfälle.
Mein Küchen ZP100 schmeisst mir ständig anhängende Fehlermeldung aus. Die Funktionen die ich ausführen möchte werden aber trotzdem manchmal ausgeführt, manchmal nicht.
Zum Test habe ich die sekündliche Abfrage abgeschaltet, nach ein paar Minuten wieder probiert und es gibt KEINE Fehlermeldung mehr.

Anscheinend ist der ZP100 also von der Anzahl der Abfragen überfordert.

Ich sehe aber aktuell keine andere Möglichkeit, denn SONOS wird bei uns zu 80% über Wandtaster bedient und für das hochtriggern von VOLUME muss ich zwingend die Lautstärke regelmäßig abfragen.

Habt ihr einen anderen Workarround ? Ich möchte die Funktionen nicht mehr missen !

Sonos-Problem_15.02.2013.jpg

Hi RoadsterHH,

und wie wäre es, wenn du die Afrage der aktuellen Lautstärke erst dann machst, wenn du sie verändern möchtest?
Vielleicht hat Sonos in seiner V4.0 auch etwas eingebaut, was diese extrem häufige Abfrage verhindern soll… Ein echter Controller tut sowas nämlich gar nicht…

Desweiteren gäbe es noch die Möglichkeit, am SonosPlayer „SetRelativeVolume“ auszuführen. Dort kann man dann einen +/- Wert angeben, um den die Lautstärke verändert wird. Als Ergebnis erhält man die aktuell gültige Lautstärke zurück. Ich weiss jetzt aber nicht, ob so etwas bereits in der PHPSonos-Klasse enthalten ist. Das sollte aber u.U. einfach nachrüstbar sein…

Eine andere, deutlich komplexere, Lösung wäre das Anmelden am SonosPlayer für RenderingEvents. Da fallen alle Änderungen der Lautstärke und Bass usw. drunter. Da wird man dann informiert, wenn sich einer der Werte ändert. Das habe ich aber auch bei mir in der PHP-Erweiterung (siehe ein paar Posts weiter vorne) nicht drin. Dort wird nur auf Titeländerung reagiert.
Sowas habe ich gerade in meinem Sonos-Modul für meine FHEM-Steuerung eingebaut. Damit kann man dann auch schön Lautstärkegrenzen einstellen :slight_smile:

Grüße Reiner

Danke für den Tipp !

Habe ich so umgebaut und scheint zu funktionieren. Ich hatte die befürchtung das die Statusmeldung vom SONOS Player nicht schnell genug zurückkommt, bis die „Play oder Pause“ Abfrage kommt, aber es geht !
Damit bin ich was den Traffic anbelangt schon mal einen ganzen Schritt weiter.

Die gezeigte Fehlermeldung von einem meiner ZP´s geht leider trotzdem nicht weg.

Kann jemand den Fehler interpretieren ?

Hi,

ist der Player denn zufällig in einer Gruppe eingebunden?
Dann darf man, soweit ich weiss, sowas wie Play/Pause usw. nur an den GroupCoordinator senden…

Schonmal den Player neugestartet?
Manchmal bleiben da auch Reste von vorherigen Verbindungen, der erst spät aufgeräumt werden…

Also, ich kann dir da keine wirklichen Tipps mehr geben… Aber vielleicht hat jemand anderes noch eine Idee…

Grüße Reiner

Moin…

ich hab eine 2-sekündliche Abfrage bei meinem ZP100 und keine Probleme! Das Teil läuft den ganzen Tag, ausser der Tv ist an! :slight_smile: ( Auto-Off, hehe…)

Gruß,
Peter

Ich konnte es mittlerweile scheinbar eingrenzen :

der VOLUME_SET Befehl

<?

include("PHPSonos.inc.php");

//Hier die Variable einfügen mit der aktuellen Lautstärke!!!!
$Volume_Set = GetValueInteger(18974 /*SONOS LAUTSTÄRKE AKTUELL*/);

//Player IP-Adresse eintragen!!!!
$sonos = new PHPSonos("192.168.178.20"); //Sonos ZP IPAdresse



$sonos->SetVolume($Volume_Set);

?>

sowie der SET_RADIO Befehl scheinen nicht mehr richtig zu funktionieren ! Kann das jemand ab der 4.0 bestätigen ?

<?
include("PHPSonos.inc.php");

$sonos = new PHPSonos("192.168.178.20"); //Sonos ZP IPAdresse

$sonos->SetRadio("x-rincon-mp3radio://www.ndr.de/resources/metadaten/audio/m3u/n-joy.m3u", "N-Joy");
$sonos->Play();
//SetValueInteger (18974 /*[Ankleidezimmer\Sonos\Volume_Set]*/, 28);
?>

Moin Nico…

… kann ich nicht bestätigen! Gerade noch mal getestet! Funktioniert bestens!
Ist das Oben ein Auszug aus deinem Skript oder ein Beispiel?

Warum übergibst Du darin die aktuelle Lautstärke wieder an Sonos? Oder bedeutet „Aktuelle Lautstärke“ im Skript die „Neue“-aktuelle Lautstärke?

Gruß,
Peter

Ist die neue, von mir über IPS festgelegte Lautstärke !

… ich hab auch keine Ahnung was da los ist.

Ich krieg ´n Fön… :(:(:frowning:

War jetzt soweit das es nur noch eine Fehlermeldung bei „SetVolume“ gibt, dann plötzlich geht aber alles wieder nicht, mit besagter Fehlermeldung.

Habe bisher :
IP Adressen neu verteilt
Switch neugestartet
Router neugestartet
alle Sonos Geräte stromlos gemacht
IPS mehrfach neu gestartet
PHPSonos.inc.php mehrfach getauscht

Quasi immer mal wieder funktioniert das eine oder andere Skript nicht… mir absolut unverständlich und ich weiss auch nicht wo ich noch ansetzen soll.

Hast Du zum Zeitpunkt des Problems Player verknüpft? Also ne Gruppe gebildet?

Nein, alle Solo ! Alle via LAN verknüpft.

Kann keiner von Euch Spezies die Fehlermeldung interpretieren ?

Ist doch irgendwie bizarr, was schmeisst er mir denn da zurück ? Einmal geht der SetVolume und Radio Befehl wieder ohne Probleme, sofort danach wird er wieder nur mit fehlermeldung quittiert…

Problem behoben ! Firewall !

Hallo!

Verwende folgendes Skript zum abspielen einer Sprachmeldung bei einem Ereignis. Wenn ich mp3 in Playlisten höre funktioniert das auch ( Mp3 stoppt, Meldung wird ausgegeben, mp3 startet wieder).

<?
include("PHPSonos.inc.php");
$sonos = new PHPSonos("10.100.200.34"); //Sonos ZP IPAdresse





$vol=$sonos->GetVolume();
// Ramp down
$sonos->SetVolume($vol/100*40);
IPS_Sleep(100);
$sonos->SetVolume($vol/100*10);

// Saving off information
$oldpi = $sonos->GetPositionInfo();
$oldmi = $sonos->GetMediaInfo();

$oldti = $sonos->GetTransportInfo();

// Setting AVT to IPS-Meldung
$sonos->SetVolume($vol+20);
$sonos->SetAVTransportURI("x-file-cifs://Homeserver/Lieder I-Pod/doorbell.mp3");
$sonos->Play();

//$sonos->SetVolume($vol);

while ($sonos->GetTransportInfo()==1)
	{    
    IPS_Sleep(30); // Wait here for Meldung
	}



// Setting old queue
$sonos->SetAVTransportURI($oldmi['CurrentURI'],$oldmi['CurrentURIMetaData']);
try
	{
    // Seek TRack_Nr
    $sonos->Seek("TRACK_NR",$oldpi['Track']);
    // Seek REl_time
    $sonos->Seek("REL_TIME",$oldpi['RelTime']);
	}
	catch (Exception $e)
	{
    
	}
// Only play if old pi is PLAYING
if ($oldti==1) $sonos->Play();
$sonos->RampToVolume("AUTOPLAY_RAMP_TYPE",$vol) . "
";


?>

Wenn ich aber zuvor Radio höre, bekomme ich nach abspielen der Nachricht folgende Fehlermeldung und die Wiedergabe stoppt:

Fatal error:  Uncaught exception 'Exception' with message 'Error sending command: HTTP/1.1 500 Internal Server Error
CONTENT-LENGTH: 347
CONTENT-TYPE: text/xml; charset="utf-8"
EXT: 
Server: Linux UPnP/1.0 Sonos/21.4-61160c (ZP120)
Connection: close

s:ClientUPnPError' in C:\IP-Symcon\scripts\PHPSonos.inc.php:2308
Stack trace:
#0 C:\IP-Symcon\scripts\PHPSonos.inc.php(1674): PHPSonos->sendPacket('POST /MediaRend...')
#1 C:\IP-Symcon\scripts\37744.ips.php(36): PHPSonos->SetAVTransportURI('x-rincon-mp3rad...', '<DIDL-Lite xmln...')
#2 {main}
  thrown in C:\IP-Symcon\scripts\PHPSonos.inc.php on line 2308

Vielleicht kann mir hier jemand weiterhelfen…

Danke

Guten Tag,

das ist hier mein erster Forumpost. Ich bin durch ne Google suche auf euch gestossen und hab eine Frage und noch ne Info für alle Sonos Nutzer.

Zuerst zu meiner Frage:

Kann ich mir irgendwie die aktuellen Titelinformationen anzeigen lassen? Artist - Track oder sowas?

und die Info:

Ich arbeite grade an einer Sprachsteuerung für Sonos (iPhone 4S & 5 only)

Dafür wird ein RaspberryPi oder ein anderer immer eingeschalteter Linux pc benötigt.

darauf läuft SiriProxy und ein von mir geschriebenes Plugin welches auf Sprachbefehle die sonos php classe aufruft und somit play/pause und lauter/leiser beherrscht. Natürlich für mehrere Räume.

Vielleicht finden sich hier ein paar Interessierte Geister :slight_smile:

(natürlich free to use)

Hallo christianbre,
danke für das Skript. Hat mir weitergeholfen.
Probier mal das aus - funktioniert bei mir auch bei den Radiosendern!
(= nur ein Testskript)

 <?
include("PHPSonos.inc.php");
$sonos = new PHPSonos("xx.xx.xx.xx"); //Sonos ZP IPAdresse

$vol=$sonos->GetVolume();
// Ramp down
//$sonos->SetVolume($vol/100*40);
IPS_Sleep(100);
//$sonos->SetVolume($vol/100*10);

// Saving off information
$oldpi = $sonos->GetPositionInfo();
$oldmi = $sonos->GetMediaInfo();
$radio=(strpos($oldmi['CurrentURI'],"x-sonosapi-stream:")>0)===false;

$oldti = $sonos->GetTransportInfo();

// Setting AVT to IPS-Meldung
$sonos->SetVolume(75);
$sonos->SetAVTransportURI("x-file-cifs://....................mp3");
$sonos->Play();

//$sonos->SetVolume($vol);
while ($sonos->GetTransportInfo()==1)
    {
    IPS_Sleep(30); // Wait here for Meldung
    }

// Setting old queue
if ($radio) {
	$sonos->SetRadio($oldmi['CurrentURI']);
}
else {
	$sonos->SetAVTransportURI($oldmi['CurrentURI'],$oldmi['CurrentURIMetaData']);
}
try
    {
    // Seek TRack_Nr
    $sonos->Seek("TRACK_NR",$oldpi['Track']);
    // Seek REl_time
    $sonos->Seek("REL_TIME",$oldpi['RelTime']);
    }
    catch (Exception $e)
    {

    }
// Only play if old pi is PLAYING
if ($oldti==1) $sonos->Play();
//$sonos->RampToVolume("AUTOPLAY_RAMP_TYPE",$vol) . "
";
$sonos->SetVolume($vol);

?>

Gruß
Günter

Hallo Spawn!

Danke, das war genau das, was ich gesucht habe!
lg Christian

Hallo Zusammen,
die „Radio Favoriten“ konnten wir bereits auslesen, aber nun wurde ich auf die „Sonos Favoriten“ aufmerksam gemacht (können Titel, PL enthalten). Da ich diese bisher nicht selbst nutzte, hatte ich mir nie Gedanken gemacht wie man diese per UPNP auslesen kann.

Nach ein wenig probieren, die Lösung:
Parameter „ObjectID“ der Methode/ Funktion „Browse“ auf „FV:2“ setzen.

Beispiel:


$sonos = new PHPSonos("192.x.zz.yyy"); //Sonos ZP IPAdresse
$browselist = $sonos->Browse("FV:2","c");
// Beispiel Debug print
print_r($browselist);


Grüße, Benjamin

Vielen Dank für die Hilfe :slight_smile: Klappt super

Ich möchte gerne die aktuelle Ausgabe einer Sonos auf eine andere Sonos weitergeben, wenn man den Raum wechslt. Also ZP2 zu ZP1 zusamenfügen, dann ZP1 rausnehmen.

Dazu nutze ich folgendes Beispiel (Webront User Seite aus br_sonos)

<?
// Teststring:
//http://192.168.0.5:82/user/sonoscmd.php?sonosip=192.168.0.115&sonosid=RINCON_000E5832FB5C01400&cmd=RemoveMember&memberip=192.168.0.111&memberid=RINCON_000E5825411201400

//http://192.168.0.5:82/user/sonoscmd.php?sonosip=192.168.0.115&sonosid=RINCON_000E5832FB5C01400&cmd=AddMember&memberip=192.168.0.111&memberid=RINCON_000E5825411201400


require ("../../scripts/functions.inc.php"); // use PHPSonos.inc.php here

$sonosip=$_GET['sonosip'];
$sonosid=$_GET['sonosid'];
$cmd=$_GET['cmd'];
$memberip=$_GET['memberip'];
$memberid=$_GET['memberid'];



        if ($cmd == "RemoveMember") {
        // echo "$sonosip $sonosid $cmd $memberip $memberid $newcoordip";
          // Talk to Coord
          $sonos = new PHPSonos($sonosip); //Sonos ZP IPAdresse
          $RemoveMember = $sonos->RemoveMember($memberid);
          // Talk to slave
	  	
        	  	$sonos = new PHPSonos($memberip); //Slave Sonos ZP IPAddress
          		// needed for stop of playback on Slave
          		$sonos->SetAVTransportURI("");
          		//Playing stops
          		br_sonos_read_all();
		
	}
        if ($cmd == "AddMember") {
        // echo "$sonosip $sonosid $cmd $memberip $memberid";
          // Talk to Coord
          $sonos = new PHPSonos($sonosip); //Sonos ZP IPAdresse
          $AddMember = $sonos->AddMember($memberid);
          // Talk to slave
          $sonos = new PHPSonos($memberip); //Slave Sonos ZP IPAddress
          // needed to start playback on Slave
          $ret = $sonos->SetAVTransportURI("x-rincon:" . $sonosid);
          //Playing starts
          	br_sonos_read_all();
	}

?>

das verbindet die beiden Player wie erwartet, doch wenn ich dann den Master rausnehme, stoppt die Wiedergabe auf dem Slave. Verbinde ich das über die Sonos App, geht das aber problemlos. Fehlt da irgendwo ein Kommando?

Grüße,
Tom