PHP Sonos (Klasse zum Ansteuern einzelner Player)

Hab auch keine Probleme! Pause-Funktion funzt wie sie soll!

Peter

Moin ,
wie bereits vor einigen Wochen gemeldet tritt diese Fehlermeldung auch bei mir auf, jedoch wenn ich „Play“ bei meinem Play:1 anwähle.
Die Funktion ist aber vorhanden.
Habe bereits einiges neu installiert und stundenlang den Fehler gesucht, leider keine Besserung.
Vielleicht kann jemand helfen.

Gruß Milf

sehr komisch… eben noch mal getestet. Jetzt funktioniert es. Einfach so wie früher auch. :rolleyes:

hmmm bei mir funktioniert nur Start und Stop per Script. Alles andere zum auslesen des Status usw. funktioniert nicht.
Ich bekomms nicht hin. Eine Fehlermeldung gibt es aber auch nicht beim ausführen.

Habe das hier drin und nix funzt :confused:

/*=============================================
skrSonos_Wohnen - Martin Heinzel - 16.11.2010
Version: 1.0

Beschreibung:
Dieses Script liest den Status des Sonos-Players im Wohnzimmer

Änderungen
----------
tt.mm.yyyy von Version x.x -> x.x

Berschreibung:

================================================*/

// Variablen Deklaration --------------------------------------

// ID's
//---------
$id_Volume = 54683  /*[SONOS_Scripte\Lautstärke]*/;
$id_Mute = 31412  /*[SONOS_Scripte\Stumm]*/;
$id_Shuffle = 48940 /*[.Sound\.Sonos_Wohnen\Shuffle_Sonos_Wohnen]*/;
$id_Repeat = 45377 /*[.Sound\.Sonos_Wohnen\Repeat_Sonos_Wohnen]*/;
$id_Status = 32971  /*[SONOS_Scripte\Status]*/;
$id_Position = 47043 /*[.Sound\.Sonos_Wohnen\Position_Sonos_Wohnen]*/;
$id_Duration = 56615 /*[.Sound\.Sonos_Wohnen\Duration_Sonos_Wohnen]*/;
$id_Artist = 46311  /*[SONOS_Scripte\Artist]*/;
$id_Titel = 15763  /*[SONOS_Scripte\Titel]*/;
$id_Album = 52282  /*[SONOS_Scripte\Album]*/
$id_AlbumArtist = 27807 /*[.Sound\.Sonos_Wohnen\AlbumArtist_Sonos_Wohnen]*/;
$id_AlbumTrackNum = 35985 /*[.Sound\.Sonos_Wohnen\AlbumTrackNum_Sonos_Wohnen]*/;
$id_CoverURI = 47568 /*[.Sound\.Sonos_Wohnen\CoverURI_Sonos_Wohnen]*/;

//-------------------------------------------------------------

//--------------------------- Main ----------------------------
//einbinden der Sonos Klasse
include("PHPSonos.inc.php");

//Player Wohnzimmer
$sonos = new PHPSonos("192.168.2.61"); //Sonos ZP IPAdresse

$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
$status = $sonos->GetTransportInfo();                     // gibt den aktuellen Status des Sonos-Players als Integer zurück, 1: PLAYING, 2: PAUSED, 3: STOPPED
$posInfo = $sonos->GetPositionInfo();                     // gibt ein Array mit den Informationen zum aktuellen Titel zurück (Keys: position, duration, artist, title, album, albumArtist, albumTrackNumber)
$MediaInfo = $sonos->GetMediaInfo();               // gibt den Namen der Radiostation zurück. Der key ist "titel"

// ablegen der Stati
SetValueInteger($id_Volume, $volume);
SetValueBoolean($id_Mute, $mute);
SetValueBoolean($id_Shuffle, $shuffleRepeat["shuffle"]);
SetValueBoolean($id_Repeat, $shuffleRepeat["repeat"]);
SetValueInteger($id_Status, $status);
SetValueString($id_Position, $posInfo["position"]);
SetValueString($id_Duration, $posInfo["duration"]);

// Wenn es keine "duration" gibt läuft ein Radiosender
// in diesem Fall ist der Interpret die Radiostation
if ($posInfo["duration"] != "")
{
    SetValueString($id_Artist, $posInfo["artist"]);
}
else
{
    SetValueString($id_Artist, $MediaInfo["title"]);
}

// Wenn es keine "duration" gibt läuft ein Radiosender
// in diesem Fall kommt der Titel von dem Radiosender
if ($posInfo["duration"] != "")
{
    SetValueString($id_Titel, $posInfo["title"]);
}
else
{
    SetValueString($id_Titel, $posInfo["streamContent"]);
}

SetValueString($id_Album, $posInfo["album"]);
SetValueString($id_AlbumArtist, $posInfo["albumArtist"]);
SetValueString($id_AlbumTrackNum, $posInfo["albumTrackNumber"]);
SetValueString($id_CoverURI, $posInfo["albumArtURI"]);

//---------------------- Main Ende ----------------------------

Jemand vielleicht einen Tip für mich ?

Hallo thezepter,

hat sich das Problem schon geklärt?
Ich sehe gerade das Du das Script
von mir genommen hast.

Bin spät dran sorry. :o

Hi Spacecraft,

ich fürchte, da muss noch etwas im Modul nachgebaut werden. Ich habe diese Funktion in meinem Modul für Fhem (Hausautomation auf Basis von Perl) gerade eingebaut (und kenne mich mit dem PHP-Modul nur am Rande aus).
Man benötigt die Ressource- und Metadata-Angabe aus der Browse-Anweisung für die Favoritenabfrage. Die „res“-Angabe hast du ja bereits, aber die Metadata musst du dir noch holen. Ich weiss jetzt nicht, wie einfach die Browse-Anweisung des Moduls erweiterbar ist, aber vielleicht ist das ja gar kein großer Aufwand.

In diesen Metadaten steht z.b. auch, ganz wichtig, die Referenz auf deine Spotify-ID drin, die notwendig ist, damit du Spotify-Titel oder Playlisten in Sonos in die Queue packen oder direkt abspielen kannst (das bedeutet, dass die Metadaten zunächst mal nur bei einem selbst funktionieren dürften).

Wenn du diese beiden Informationen hast, dann musst du nur noch AddURIToQueue am Player mit diesen beiden Informationsblöcken aufrufen, und die Liste landet hinten in der aktuellen Abspielliste (notfalls vorher leeren).
Auch dafür weiss ich jetzt nicht, ob der Befehl „AddToQueue“ die Metadaten bereits annehmen und auch 1:1 weiterreichen kann…

Ich weiss, das hilft dir jetzt auch nicht wirklich viel, aber da bislang gar keiner was dazu geschrieben hat, wollte ich dir wenigstens den prinzipiellen Weg aufzeigen, und dass es auch überhaupt gehen kann…

Grüße
Reiner

Kein Stress :wink: Erstmal frohes Neues !

Zum Thema: Nein, ich habe das Problem bis heute nicht lösen können.
Nur Start / Pause funktioniert bei mir. Was mach ich falsch ?!?!

Der einzige Unterschied. Ich nutze für Start / Pause ein anderes Script. Das funzt soweit.

<?


 if($IPS_SENDER == "WebFront")
{
   SetValue($IPS_VARIABLE, $IPS_VALUE);
}

switch($IPS_VALUE)
 {

  case 1:
include("PHPSonos.inc.php");

$sonos = new PHPSonos("192.168.2.61"); //Sonos ZP IPAdresse
//Grundfunktionen
//$sonos->Pause();
$sonos->Play();

  break;
  
    case 0:
include("PHPSonos.inc.php");

$sonos = new PHPSonos("192.168.2.61"); //Sonos ZP IPAdresse
//Grundfunktionen
$sonos->Pause();
//$sonos->Play();

  break;

 }


?>

Gruß
Christian

Hallo Christian,

bei mir funktioniert das alles noch so.
An dem Screenshot sehe ich das dein
Scripttimer nicht aktiv ist.

Kannst Du das mal machen?

Den hab ich nur gerade inaktiv, weil das eh nicht funktioniert. (Ist Absicht)
Wenn ich das Script per Hand ausführe passiert auch rein gar nichts. Keine Fehlermeldung oder ähnliches.

Hallo Christian,

probier das mal in einem neuen Script:


<?
//--------------------------- Main ----------------------------
//einbinden der Sonos Klasse
include("PHPSonos.inc.php");

//Player Wohnzimmer
$sonos = new PHPSonos("192.168.2.61"); //Sonos ZP IPAdresse

echo "Die Lautstaerke steht auf: ".$sonos->GetVolume()."%";                             // gibt die Lautstärke als Integer zurück
?>

Die Lautstaerke steht auf: 9%

Hmm Das geht…

Hallo Christian

dann probier das mal:


<?
/*=============================================
skrSonos_Wohnen - Martin Heinzel - 16.11.2010
Version: 1.0

Beschreibung:
Dieses Script liest den Status des Sonos-Players im Wohnzimmer

Änderungen
----------
tt.mm.yyyy von Version x.x -> x.x

Berschreibung:

================================================*/

// Variablen Deklaration --------------------------------------

// ID's
//---------
$id_Volume = 54683  /*[SONOS_Scripte\Lautstärke]*/;
$id_Mute = 31412  /*[SONOS_Scripte\Stumm]*/;
$id_Shuffle = 48940 /*[.Sound\.Sonos_Wohnen\Shuffle_Sonos_Wohnen]*/;
$id_Repeat = 45377 /*[.Sound\.Sonos_Wohnen\Repeat_Sonos_Wohnen]*/;
$id_Status = 32971  /*[SONOS_Scripte\Status]*/;
$id_Position = 47043 /*[.Sound\.Sonos_Wohnen\Position_Sonos_Wohnen]*/;
$id_Duration = 56615 /*[.Sound\.Sonos_Wohnen\Duration_Sonos_Wohnen]*/;
$id_Artist = 46311  /*[SONOS_Scripte\Artist]*/;
$id_Titel = 15763  /*[SONOS_Scripte\Titel]*/;
$id_Album = 52282  /*[SONOS_Scripte\Album]*/
$id_AlbumArtist = 27807 /*[.Sound\.Sonos_Wohnen\AlbumArtist_Sonos_Wohnen]*/;
$id_AlbumTrackNum = 35985 /*[.Sound\.Sonos_Wohnen\AlbumTrackNum_Sonos_Wohnen]*/;
$id_CoverURI = 47568 /*[.Sound\.Sonos_Wohnen\CoverURI_Sonos_Wohnen]*/;

//-------------------------------------------------------------

//--------------------------- Main ----------------------------
//einbinden der Sonos Klasse
include("PHPSonos.inc.php");

//Player Wohnzimmer
$sonos = new PHPSonos("192.168.2.61"); //Sonos ZP IPAdresse

$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
$status = $sonos->GetTransportInfo();                     // gibt den aktuellen Status des Sonos-Players als Integer zurück, 1: PLAYING, 2: PAUSED, 3: STOPPED
$posInfo = $sonos->GetPositionInfo();                     // gibt ein Array mit den Informationen zum aktuellen Titel zurück (Keys: position, duration, artist, title, album, albumArtist, albumTrackNumber)
$MediaInfo = $sonos->GetMediaInfo();               // gibt den Namen der Radiostation zurück. Der key ist "titel"

// ablegen der Stati
SetValueInteger($id_Volume, $volume);
SetValueBoolean($id_Mute, $mute);
SetValueBoolean($id_Shuffle, $shuffleRepeat["shuffle"]);
SetValueBoolean($id_Repeat, $shuffleRepeat["repeat"]);
SetValueInteger($id_Status, $status);
SetValueString($id_Position, $posInfo["position"]);
SetValueString($id_Duration, $posInfo["duration"]);

// Wenn es keine "duration" gibt läuft ein Radiosender
// in diesem Fall ist der Interpret die Radiostation
if ($posInfo["duration"] != "")
{
    SetValueString($id_Artist, $posInfo["artist"]);
}
else
{
    SetValueString($id_Artist, $MediaInfo["title"]);
}

// Wenn es keine "duration" gibt läuft ein Radiosender
// in diesem Fall kommt der Titel von dem Radiosender
if ($posInfo["duration"] != "")
{
    SetValueString($id_Titel, $posInfo["title"]);
}
else
{
    SetValueString($id_Titel, $posInfo["streamContent"]);
}

SetValueString($id_Album, $posInfo["album"]);
SetValueString($id_AlbumArtist, $posInfo["albumArtist"]);
SetValueString($id_AlbumTrackNum, $posInfo["albumTrackNumber"]);
SetValueString($id_CoverURI, $posInfo["albumArtURI"]);

//---------------------- Main Ende ----------------------------  
?>

Hallo Martin,

ich habe meinen Dummheitsfehler gefunden (habe warum auch immer… <? und > am Anfang und Ende vergessen) Sorry.

ABER: Bekomme trotzdem einen Fehler.

Parse error: syntax error, unexpected ‚include‘ (T_INCLUDE) in [SONOS_Scripte\Statusabfragen] on line 39
Abort Processing during Fatal-Error: syntax error, unexpected ‚include‘ (T_INCLUDE) Error in Script C:\IP-Symcon\scripts\29453.ips.php on Line 39

Zeile 39:

include("PHPSonos.inc.php");

Dürfte aber doch gar keinen Fehler produzieren. Die selbe Codezeile funktioniert doch auch im Script zuvor was wir mit der Lautstärke getestet hatten.

Es fehlt in Zeile ~30 (?) ein Semikolon am Ende, da das include vorher kommt, eben „unexpected“ :wink:

$id_Album = 52282  /*[SONOS_Scripte\Album]*/

Gruß
Bruno

Hallo,

hätte eine Frage zu der Funktion „$sonos->SetRadio“.

Wenn ich z.B. folgendes ausführe „$sonos->SetRadio(„x-rincon-mp3radio://audiostream.rtl.be/belrtl128“, „Bel RTL“);“ wird der angegebene Radiosender auch abgespielt und es wird der Radiosendername (BelRTL) den ich mit übergeben habe angezeigt.

Jedoch wird mir weder das Senderlogo noch der momentan laufende Titel angezeigt, den ich bei der Wahl über Tune-in immer angezeigt bekomme.

Gibt es eine Möglichkeit die „albumArtURI“ irgendwie mit zu übergeben damit wenigsten das Sendelogo mit angezeigt wird?

Gruß

Michael

Danke Bruno, das wars ! Also irgendwie ist „Programmieren“ nicht so mein Ding. Andauernd übersehe ich irgendwelche Sachen. :cool:

Hallo Michael,

bekanntes Problem!

Du musst das anders lösen.

Ich habe bei mir die Radiosender die ich höre unter „Meine Radiosender“ gespeichert.

Radiasender.png

In diesem Script übergebe ich die IP des Players und die Nummer (0 - 5) der Radiostation die ich spielen möchte.


<?
/*=============================================================
Radio Script - Martin Heinzel - 20.03.2012
Version: 0.1

Beschreibung:
Mit diesem Script wird ein Radiosender auf dem Player mit der angegebenen
IP-Adresse abgespielt.


Änderungen
----------

tt.mm.jjjj von Version x.x -> y.y

Beschreibung:

================================================================*/

// Variablen Deklaration --------------------------------------

// ID's
//--------------
$id_Player_IP              =  53796 /*[SONOSLibs\Radio\Player_IP]*/;
$id_Radio_No               =  27033 /*[SONOSLibs\Radio\Radio_No]*/;

// Variablen
//--------------
$Player_IP                 =  GetValueString($id_Player_IP);
$Radio_No                  =  GetValueInteger($id_Radio_No);

//-------------------------------------------------------------
include("PHPSonos.inc.php");
//--------------------------- Main ----------------------------

$sonos = new PHPSonos($Player_IP); //Sonos ZP IPAdresse
$browselist = $sonos->Browse("R:0/0","c");
$sonos->SetRadio(urldecode($browselist[$Radio_No]['res']));
$sonos->Play();

//------------------------- Main ENDE --------------------------

?>

Dann klappts auch mit der Nachbarin. :wink:

Hallo,

alles klar, werde das in den kommenden Tagen mal ausprobieren.

Vielen Dank

Michael

Hallo.

Gibt es eine Funktion die nach Sonos Player sucht und mir die IP’s ausgibt?
Ich habe mehere Sonos Player und die IP ändert sich ab und zu.

Danke.
BYE
Thomas

Hallo atmel!

Nein, so eine Funktion gibt es in der PHP Klasse nicht.
Du könntest ein entsprechendes SSDP Paket in dein Netzwerk senden und dann würdest Du auch deine Player finden, unabhängig von der aktuellen IP-Adresse.

Ich denke weniger Aufwand ist es den Playern eine feste IP zu geben.

Grundsätzlich ist die Lösung über SSDP interessant zu wissen!!