PHP Sonos (Klasse zum Ansteuern einzelner Player)

alles händisch.

Ich mache meine Dummheit mit Fleiß wieder gut. :wink:

Kommt man auch irgenwie an die Weckzeit von Sonso?

Lesend oder schreibend?

Ihr wisst bestimmt was ich will.

Meine IPS-RGB Strips sind auch auf dem Weg!!! :D:D

Ruft ihr die ganzen Sonos Werte eigentlich sekündlich ab, oder wie bekommt ihr automatisch - ohne Ereignis - die Daten in die Variablen ?

Versuche gerade auf Tasterdruck die Lautstärke immer +1 oder +2 zu erhöhen. Hat das jemand von euch realisiert ? Wie könnte das aussehen ?

Moin…

musst die Werte zyklisch abfragen. Ich mach das alle 3 Sekunden. Das reicht. Wenn ich einen Track weiter „Skip“ (übers Dashboard) wird sofort abgefragt, wegen dem Album Cover. Ist aber auch Wurst, im schlimmsten Fall würde es 3 Sek. dauern bis das neue Cover angezeigt wird!

Ich würde an deiner Stelle drauf verzichten nur plus 1 oder plus 2 per Tastendruck zu machen. Da drückst Du Dir ja einen Wolf!! Ich hab pro Tastendruck +5!! Das langt völlig!!!

Ich hab mir 2 einzelne Scripte für Laut und Leiser erstellt. Geht natürlich auch mit einem!!! Ich sach nur IPS_COMPONENT!!! :slight_smile:

Grüße aus der Nachbarschaft,

Peter

Ok, und das drückt nicht auf den Netzwerk Traffic oder belastet IPS hart ?

Kannst du die Skripte mal rauszaubern ? Ist ja super, das du das schon so gelöst hast.

Jupp… mach ich wenn ich @ home bin! Wird aber Spät heute, hab Spätschicht!! :slight_smile:

Benutzt Du die Sonos PHP Klasse schon?!

Nutze die Dateien und Befehle aus dem ersten Post dieses Threads als Basis.

Habe mir bisher eine „Play“ & „Pause“ Kombination als Skript geschrieben, um das ganze auf einem Taster nutzen zu können. Lese jetzt auch wie von dir empfohlen alle 3 Sekunden die Daten ein.

hätten sie vielleicht noch ein skriptchen für mich ? :o

Parallel nochmal die Frage an alle :

Mir macht diese ständige 3-sekündliche Abfrage der verschiedenen Sonos Variablen sorgen.

Bei 4 Sonos Zonen á mind. 5 Funktionen die alle 3 Sekunden abgerufen werden und zwar immer, ist das Gesund ?
Verursache ich massiven Netzwerk Traffic ? Hindere ich eventuell Sonos an einem Ruhezustand, den er sonst annehmen würde, wenn ich nicht ständig abfragen würde ? Belaste ich IPS erheblich ?

Oder gibt es sonst eine alternative mit diesen Sonos Watchdog Anwendungen oder ähnlichem ?

EDIT :

Wenn ich 3 verschiedene Variablen eines Zone Players 3 sekündlich abrufe, ist meine CPU Last dauerhaft 100%…

Jupp, hab ich gestern nicht mehr geschafft! War fix und foxy!!

Kommt aber noch!!

Das mit der Serverlast von 100% kommt mir bissel Spanisch vor!!

Hab bis heute keine Probleme gehabt!! Ich hab das Abfrage Script an meine Heim/Fort Variable und an meine " Nacht " Variable gekoppelt!
Darüber wird z.B auch mein Wlan abgeschaltet! Und wenn Wlan aus ist ist auch keiner mehr Wach!! :slight_smile:

Ich aktualisiere auch nur die Track und Album Variablen wenn diese sich ändern!! Ebenso das Cover!

Aber das sind 3 oder 4 Variablen von 50, 60 oder mehr!!

Schnief… Skript büdde… :wink:

Hallo Nico,

so mach ich das:


/*=============================================
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 = 58159 /*[.Sound\.Sonos_Wohnen\Volume_Sonos_Wohnen]*/;
$id_Mute = 16136 /*[.Sound\.Sonos_Wohnen\Mute_Sonos_Wohnen]*/;
$id_Shuffle = 48940 /*[.Sound\.Sonos_Wohnen\Shuffle_Sonos_Wohnen]*/;
$id_Repeat = 45377 /*[.Sound\.Sonos_Wohnen\Repeat_Sonos_Wohnen]*/;
$id_Status = 29766 /*[.Sound\.Sonos_Wohnen\Status_Sonos_Wohnen]*/;
$id_Position = 47043 /*[.Sound\.Sonos_Wohnen\Position_Sonos_Wohnen]*/;
$id_Duration = 56615 /*[.Sound\.Sonos_Wohnen\Duration_Sonos_Wohnen]*/;
$id_Artist = 38693 /*[.Sound\.Sonos_Wohnen\Artist_Sonos_Wohnen]*/;
$id_Titel = 31630 /*[.Sound\.Sonos_Wohnen\Titel_Sonos_Wohnen]*/;
$id_Album = 50827 /*[.Sound\.Sonos_Wohnen\Album_Sonos_Wohnen]*/;
$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.24"); //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 ----------------------------

Zum auslasen des Covers habe ich ein Script das so aussieht:


$id_URI 		= 47568 /*[.Sound\.Sonos_Wohnen\CoverURI_Sonos_Wohnen]*/;
$URI 			= GetValueString($id_URI);
$filename 	= IPS_GetKernelDir()."\\media\\Album_cover_Wohnen.jpg";
$CoverSize 	= 174;

getSonosCover($URI, $filename, $CoverSize)

Das ist die Funktion getSonosCover:


function getSonosCover($URI, $filename, $CoverSize)
{
/*=============================================
getSonosCover - Martin Heinzel - 19.11.2010
Version: 1.0

Beschreibung:
Mit dieser Funktion wird ein Cover mit Hilfe der von Sonos gelieferten URI
geladen und normiert auf jpg mit der in $CoverSize angegebenen Größe.
Das Cover wird dann unter "$filename" abgelegt.


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

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

Berschreibung:

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

//--------------------------- Main ----------------------------

//Wenn die URI leer ist wird ein leeres Cover erzeugt
if ($URI == "")
{
	$im 				= ImageCreate($CoverSize, $CoverSize);
	$back_color 	= ImageColorAllocate($im, 200, 255, 255);
	$black 			= ImageColorAllocate($im, 0  , 0  , 0  );
	$end_xy        = $CoverSize -10;
	ImageRectangle($im, 10, 10, $end_xy, $end_xy, $black);
	ImageString($im, 3, 20, 80, "kein Cover verfügbar", $black);
	Header('Content-Type: image/jpeg');
	ImageJPEG($im, $filename);
	return;
}

// Zwischenspeicher für das Cover "png"
$Cover_Stack_png = IPS_GetKernelDir()."\\media\\Cover_Stack.png";

// Wenn die Datei schon vorhanden ist dann löschen
if(file_exists($Cover_Stack_png))
{
	unlink  ($Cover_Stack_png);
}

// Zwischenspeicher für das Cover "jpg"
$Cover_Stack_jpg = IPS_GetKernelDir()."\\media\\Cover_Stack.jpg";

// Wenn die Datei schon vorhanden ist dann löschen
if(file_exists($Cover_Stack_jpg))
{
	unlink  ($Cover_Stack_jpg);
}

// Auslösen der Extension "png" oder "jpg"
$ImageEx = substr ($URI, -3 );

// Hat die URI einen Dateinamen muss die Adresse zerlegt werden
// sonst nicht
if ($ImageEx == "png" or $ImageEx == "jpg")
{
	// Bei der URI des Albumcovers wird die Adresse des Players mitgesendet.
	// das Trennzeichen für die Playeradresse und die Coveradresse ist ":1400"
	$CoverURI_arr = explode(":1400", $URI);
	// Die Adresse des Covers ist im zweiten Arrayelement also "1"
	$remoteImage = $CoverURI_arr[1];
	// zusammenstellen des lokalen Dateinamens
	$localImage = IPS_GetKernelDir()."\\media\\Cover_Stack.".$ImageEx;
}
else
{
	$remoteImage = $URI;
	// zusammenstellen des lokalen Dateinamens
	$localImage = $Cover_Stack_jpg;
}

// Bild Downloaden
$content = @file_get_contents($remoteImage);
if((strpos($http_response_header[0], "200") === false))
{
	 return;
}
file_put_contents( $localImage, $content );

// Informationen des geladenen Covers lesen
$picinfos=getimagesize($localImage);

// Einlesen des Covers als Image
if($ImageEx == "png")
{
	$oldpic = ImageCreateFromPNG($localImage);
}
else
{
	$oldpic = ImageCreateFromJPEG($localImage);
}

// Wenn das Cover bereits die passende Grösse hat -> kein Resize
if ($picinfos[0] <> $CoverSize)
{

	// Erzeuge ein neues Image von 174 x 174
	$newpic=imagecreatetruecolor($CoverSize, $CoverSize);

	// Resize das Image
	ImageCopyResized($newpic,$oldpic,0,0,0,0,$CoverSize,$CoverSize,$picinfos[0],$picinfos[1]);

	// Und ablegen
	ImageJPEG($newpic, $filename);
}
else
{
	// Und ablegen
	ImageJPEG($oldpic, $filename);
}

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

}


hast du auch ein skript mit dem du die Lautstärke per Tastendruck „hochtriggern“ kannst ?

Hallo Nico,

ich benutze noch das Dash. Da habe ich einen Slider auf eine Integer Variable.

Bei Änderung passiert das:


include("PHPSonos.inc.php");

//Variablen Deklaration
$Volume = GetValueInteger(49317 /*[.Sound\.Control\iMP_Volume]*/);

//Player Wohnzimmer
$sonos = new PHPSonos("192.168.2.24"); //Sonos ZP IPAdresse
$sonos->SetVolume($Volume); //0-100 in %

Nochmal zu dem Sonos Cover script. Ich lese alles wie Peter alle 2-3 Sekunden und schreibe den ganzen Spass in Variablen. Auch die Cover URI.

Die Variable der Cover URI hängt an dem separaten Script mit der SonosCover Funktion. Dieses Script wird nur bei Änderung der URI getriggert. Also wenn ein neues Cover von Sonos gesendet wird. Das laden usw. des Covers dauert etwas länger (ca. 1-3 Sekunden). Darum habe ich das ausgelagert.

Moin Roadster,

Erstmal fröhliche Weihnachten ( auch an den Rest der Bande hier ) :-)!!

Hab Dich nicht vergessen was das Script angeht! War bei mir nur sehr stressig die Tage!
Bin morgen wieder in Hamburg und dann Poste ich mal meinen Sonos-Kram!!

Hat sich inzwischen was an Deiner Serverlast getan!? Worauf hast Du
IPS denn laufen?!

@ Schablone : Benutzt Du die Slidervariable im Dashboard auf einem Touchscreen?! Wie ist die Bedienbarkeit? Auf meinem 10" Billig Touch war das die Hölle!!!

Grüße,

Peter

Hallo Peter, wie siehts denn aus ?? Benötige dringend immer noch das Skript… :frowning:

Gibts denn sonst niemand anders der seine Sonos Lautstärke per Taster hoch- und runtertriggert ?

Meine + / - Tasten benötigen eine Software Basis … http://www.ip-symcon.de/forum/f16/6-fach-taster-fuer-led-sonos-usw-12611/

Moin Nico…

ich dachte das löbbt bei Dir alles schon!!? :slight_smile: Schaut gut aus deine Tasterkonstruktion!! :wink:

Hier mal ein Script für Plus-Minus. So würde ich das machen!! Alle PHP-Cracks hier bitte nicht lachen!!

Du musst 2 Ereignisse erstellen die das Script bei VARIABLEN-AKTUALISIERUNG auslösen. Ein Ereignis für die PLUS-TASTEN-VARIABLE und das andere für die MINUS-TASTEN-VARIABLE. Die ID’s im Script eintragen.

Noch die IP und die VOLUME-Variable anpassen und ab dafür! Sollte dann funzen. Kann es leider gerade nicht testen!! :frowning:


<?

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;

}

?>

Das soll ne Anregung sein und nicht das Ultimative-Script. Geht bestimmt auch viel einfacher…bin aber ein PHP-Honk und kann es nicht besser!!!

Kannst ja mal berichten!!

Gruß,

Chris

Danke dir erstmal !

Und dann aktualisiert du auch die Volume Variable alle 3 Sekunden ?

Habe das jetzt auch so gestrickt, das die Variablen nur bei „Anwesend“ abgerufen werden.

Mal eine Frage oder ein Denkanstoss.

Bekommt man vom SONOS keine Rückmeldung über den Client-Socket, also

Client-Socket -> RegisterVariable

über den gerade abgesendeten Befehl.

Bei meinem Squeeze-Equipment bekommt ich immer eine Antwort die ich mit einem seperaten Antwortskript auswerte.

z.B. ich setzte die Lautstärke -> Squeeze führt aus -> Antwort von Squeeze über Client-Socket an RegVar -> und das Werte ich aus und schreibe die Antwort in die entsprechende Variable.

Bezüglich der Lastthematik mache ich mir weniger Gedanken. In einem bestimmten Fall und zwar dann wenn ein Titel läuft schickt mir die Squeeze alle 2 Sekunden Daten über den CSK -> RegVar und IPS verkraftet das anstandslos. Kommt aber wahrscheinlich auf den Server an :rolleyes:

Vielleicht wird meine Basis langsam einfach zu dünn :

VIA Esther Processor 1000 MHz, 960 MB RAM

Darauf läuft Windows Home Server, IPS und TeamViewer sowie ab und an aufgerufene Konfigurationssoftware.

WHS verwaltet selber nichts, ich nutze nur die Stabilität des Systems und den komfortablen Zugang über die „homeserver.com“ Adresse.

Wie schon gesagt stellt sich die Frage erst einmal was die SONOS so alles in den Raum (IPS) brüllt.

Anschließend kannst Du testen welchen Intervall dein System verträgt.