Diesmal als PHP Klasse, die ihr vorher in euren ‚scripts‘ Ordner kopieren müsst. Dann die IP-Adresse angeben und ihr könnt die einzelnen Befehle nutzen.
include("PHPSonos.inc.php");
$sonos = new PHPSonos("192.168.3.183"); //Sonos ZP IPAdresse
//Grundfunktionen
//$sonos->Pause();
//$sonos->Play();
//$sonos->Next();
//$sonos->Previous();
//$sonos->Rewind();
//$sonos->SetVolume(25); //0-100 in %
//$sonos->SetPlayMode("NORMAL"); //REPEAT_ALL, SHUFFLE, NORMAL
//$sonos->SetMute(false); //True = MUTE, False = KEIN MUTE
//Klassik Radio abspielen
//$sonos->SetRadio("x-rincon-mp3radio://players.creacast.com/creacast/klassik/playlist.pls");
//$sonos->Play();
//Neue MP3 abspielen
$sonos->ClearQueue(); //Playlist löschen
$sonos->AddToQueue("x-file-cifs://ipsserver/Public/test.mp3"); //Datei hinzufügen
$sonos->SetQueue("x-rincon-queue:RINCON_"."HIER DIE MAC DES PLAYERS ZB: FFEEDDCCBBAA"."01400#0"); //Playlist auswählen (Nötig, wenn Radio vorher ausgewählt war)
$sonos->Play();
//$sonos->SetTrack(1); //1-n
//$sonos->RemoveFromQueue(1); //1-n
$sonos->SetQueue(„x-rincon-queue:RINCON_“.„HIER DIE MAC DES PLAYERS ZB: FFEEDDCCBBAA“.„01400#0“)
noch etwas Recherche und Tipparbeit einsparen, in dem man sich die Mac-Adresse vom Sonos-System geben lässt.
Ruft man folgende URL auf:
http://<Ip-Adresse ZonePlayer>:1400/status/zp
bekommt man eine XML-Antwort mit Infos zum ZonePlayer. Hierbei ist dann auch die Mac-Adresse enthalten.
Die XML-Antwort schaut z.B. so aus:
Unter LocalUID findet sich der String, den man im $sonos->SetQueue Befehl braucht.
Den String kann man z.B. über folgendes Codeschnipsel bekommen:
$url = „http://“.<ipAdresse des ZonePlayers>.":1400/status/zp";
$xml = simpleXML_load_file($url);
$result = $xml->ZPInfo->LocalUID;
erst einmal Danke für das Bereitstellen der PHP Klasse!
Mir fehlte jedoch das Abfragen des aktuellen Status des Sonos-Players.
Daher habe ich die Klasse etwas erweitert:
include("PHPSonos.inc.php");
$sonos = new PHPSonos("192.168.3.183"); //Sonos ZP IPAdresse
$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
$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)
SetValueInteger($volumeID, $volume);
SetValueBoolean($muteID, $mute);
SetValueInteger($statusID, $status);
SetValueBoolean($repeatID, $shuffleRepeat["repeat"]);
SetValueBoolean($shuffleID, $shuffleRepeat["shuffle"]);
SetValueString($titleID, $posInfo["title"]);
SetValueString($artistID, $posInfo["artist"]);
SetValueString($albumID, $posInfo["album"]);
SetValueString($positionID, $posInfo["position"] . "/" . $posInfo["duration"]);
Gruß,
André
Edit:
PHP-Klasse angepasst:
AlbumArt hinzugefügt:
[INDENT]GetPositionInfo() gibt im Array mit dem Key „albumArtURI“ den URI zum Abruf des Covers vom Sonos zurück
Fehler abgefangen, wenn ein Track kein Album, etc. hat
[/INDENT]
Edit (25.07.2010):
Name vom Radiosender kann abgerufen werden: GetMediaInfo() gibt ein Array mit dem Key „title“ zurück, welches den Sendernamen enthält.
URI und Senderbeschreibung hinzugefügt: GetPositionInfo() gibt nun mit den zusätzlichen keys „URI“ und „streamContent“ die entsprechenden Informationen zurück.
Problem mit Sonderzeichen behoben (Text wird nun in ISO-8859-1 zurückgegeben)
@PeterChrisben:
Deine Fehlermeldungen sollten in meiner angepassten Datei nicht mehr vorkommen. Ich hatte nicht abgefangen, was passiert, wenn ein Track kein Album, keinen Album-Artist, etc. besitzt.
Außerdem habe ich den URI für das Cover hinzugefügt. Hier wird in etwa folgender String zurückgegeben:
Ich bin mir nur noch nicht ganz sicher, wie ich damit am besten weitermache. Zur Zeit habe ich es so gelöst, dass ich ein Medien-Objekt erstellt habe, welches auf die Datei „C:\IP-Symcon\media\AlbumArt.jpg“ zeigt. Außerdem speichere ich in einer String-Variable die URI zum Cover. Beim Ausführen meines Scripts zum Aktualisieren, überprüfe ich zunächst, ob sich das Cover geändert hat. Wenn ja, dann lade ich dies mit der Funktion changeAlbumArt.
Leider gibt es u.a. noch Probleme, wenn kein Cover vorhanden ist.
die neue Sonos Klasse ist ja super.
Gibt es auch die Möglichkeit im Radio-Modus des Players den Sendernamen, die kurze Programmbeschreibung, die URI des Senders und vielleicht weiter Infos abfragen?
@ andre: Erstmal 100 Dank für deinen schnellen Support! Ist echt Spitze!!
Ich benutze die Cover URL direkt für mein Dashboard! Einfach die URL als Link für ein Bild nehmen!!! Funktioniert wunderbar!
Ich hab zuvor auch mit einem Textparser gearbeitet und Sonosweb, aber das kann ich mir jetzt sparen! Danke nochmals.
Ich habe die Daten für den Radio-Modus in der Klasse hinzugefügt. Schau dir dazu mal meinen Edit-Kommentar an.
Gruß,
André
P.S.: Ich habe mich bei der Umsetzung nur an die Spezifikation gehalten. Falls jemand noch weitere Ergänzungen selber umsetzen möchte, kann dies mit Hilfe der folgenden Spezifikation relativ einfach geschehen:
Die Befehle sehen bei mir anders aus, da diese Befehle Werte vom Sonos abrufen und nicht nur welche setzen. Grundsätzlich ist es in meinem Beispiel so, dass ich erst die Werte abrufe und z.B. in $volume speichere und diese dann einer IPS-Variable mit der ID $volumeID zuweise. Die restlichen Befehle verhalten sich dann analog.
Hallo Andre,
ich habe gerade erst den Thread für die Sonos klasse gefunden und versuche sie bei mir einzubinden. Ich möchte einen Radiostream ( Bayern3) auf meinem Sonos System abspielen, bekomme es aber nicht hin. Kenne mich mit php nur wenig aus. Kanst Du mir DeinenBeitrag zu Sonos radio genauer erklären?
Viele Grüße,
Ralph