PHP Sonos (Klasse zum Ansteuern einzelner Player)

irgend etwas scheint an der Sonos Play:3 anders zu sein: hab gestern eine in mein System integriert und bekomme seit dem im Minutentakt folgende Fehlermeldung:


Warning: filemtime() [<a href='function.filemtime'>function.filemtime</a>]: stat failed for C:\IP-Symcon\\webfront\user\Album_cover_Küche.jpg
   Error in Script C:\IP-Symcon\scripts\br_sonos.inc.php on Line 399

Habt Ihr ne Idee wie man das beheben kann?

Nachtrag: Fehlermeldung nur dann wenn die Sonos Radio wiedergibt (NDR2) - hier wird kein Cover angezeigt. bei MP3’s passt alles

habs gelöst: hab ein vorhandenes Album-Cover-Pic im Ordner Webfront/user kopiert und in „Album_cover_Küche.jpg“ umbenannt, Fehlermeldung taucht nicht mehr auf.

Evtl. ein Problem mit deutschen Sonderzeichen?

Das war ein Textvergleich. Werden da Zeilenumbrüche ggfs. nicht erkannt?

Das wäre meine Vermutung. Zeilenumbrüche werden von vielen Editoren gleich behandelt auch, wenn diese nicht gleich sein müssen.

[b]Achtung: der häufige Abruf ohne und / oder evtl. auch mit Serial führt anscheinend zur Blockierung durch den Anbieter!!! :eek: Jedenfalls erhalte ich im offiziellen Controller keine Auswahl der Stationen mehr.

Das Problem lässt sich durch den Wechsel der ggf. dynamischen IP beheben. Ich denke ich verschiebe die Abfrage aus der getposinfo in br_sonos_read um bei Radiotime bedarfsorientierter (seltener) nachzufragen.

Test also auf eigenes Risiko!!!
[/b]

Hi, ich habe jetzt das Radiotime Senderlogo. Die albumArtURI wird in der GetpositionInfo reingepatched. Danke an Immergut für die Infos!

Wer mag, kann ja mal testen. Die von Martin entwickelten Routinen zum auslesen des Covers bzw. die in br_sonos verwendeten lesen das Cover noch nicht korrekt aus, aber der String steht korrekt in CoverURI.

Grüße, Benjamin


- 110821 - br/talun edited Browse to return duration 
- 110821 - br added GetAudioInputAttributes
- 110828 - br added Radiotime Radio Cover for GetPositionInfo

Phpsonos.inc.php.zip (10.4 KB)

!! TEST / QUICKFIX !!

Hallo,

die letzte offizielle Klasse hat per Getpositioninfo nicht mehr den korrekten „Track“ in der Queue zurückgegeben. Diese Information wird u.a. benötigt um Meldungen mit IPS auszugeben und danach an dieser Stelle die Musik weiter abzuspielen (eine Frage per PM zum Meldungsausgabe Beispiel hat mich darauf aufmerksam gemacht). :wink:

Die Radiotime Abfrage ist ebenfalls aus der Getpositioninfo entfernt und nun als Methode „RadiotimeGetNowPlaying“ (nur direkt) ansprechbar (damit sich Niemand ohne seinen besonderen Wunsch selbst aussperren kann). :smiley:

- 110530 - br edited Browse() to reflect upnp possibilities
- 110601 - br renamed GetAlarmtime to ListAlarms to reflect upnp Names
- 110601 - iamking improved ListAlarms - added ProgramURI, ProgramMetaData, PlayMode, Volume, IncludeLinkedZones
- 110614 - br added parameters to Browse / http://www.ip-symcon.de/forum/f53/php-sonos-klasse-ansteuern-einzelner-player-7676/index10.html#post120977
- 110627 - talun edited GetSonosPlaylists: urlencode file
- 110711 - br fixed Problems in SetAVTransportUri
- 110821 - br/talun edited Browse to return duration 
- 110821 - br added GetAudioInputAttributes
- 110828 - br added Radiotime Radio Cover for GetPositionInfo (patching´in Raditiome Cover URI)
- 110901 - br shifted Radiotime Functions from getpositioninfo to new Function RadiotimeGetNowPlaying (returns array)
- 110905 - br fixed Bug in getpositioninfo for getting the actual Track in a playlist (quickfix)

EDIT: Laut Rückmeldung ist das Problem mit der Tracknummer behoben. :smiley:

Grüße, Benjamin

PHPSonos.inc.zip (9.67 KB)

Hallo Jürgen,
Vielen Dank für die Rückmeldung! Ich hab just extra mal ein Sonos-Gerät ohne Input abgefragt um rauszufinden, ob es dann vielleicht zum Timeout kommt - ich konnte den Fehler nicht nachvollziehen. :confused:

// Player has no configured input
$sonos = new PHPSonos("192.168.0.115"); //Sonos ZP IPAdresse

$Inputs=$sonos->GetAudioInputAttributes();
print_r($Inputs);
//

Ausgabe:


Array
(
    [CurrentName] => Line-In
    [CurrentIcon] => dock
)

Hast Du das Problem noch oder hat sich das vielleicht erledigt??

EDIT: Welche Sonos FW hast Du?

Viele Grüße, Benjamin

Kurze Rückmeldung. Bei mir funktioniert alles. die neuen Funktionen habe ich nicht im Test. Ich kann aber die Klasse endlich wieder einfach austauschen und alles funktioniert…

Sehr geil…

:cool: Frank, Danke für Deine Rückmeldung!

Das liegt teilweise im Einflussbereich von tunein (Radio Dienstleister für Sonos).
Es gibt einen Austausch mit tunein und dieses Problem könnte eventuell für die Zukunft behoben werden. :smiley:

Mal schauen wie sich das entwickelt - mehr kann man bzw. ich dazu aktuell wohl nicht zuverlässig sagen… :cool:

Grüße, Benjamin

Hallo Benjamin,
habe deine neue „PhpSonos.inc.“ noch nicht versucht, da ich immer noch die Befürchtung hatte, dass ich in meinem Sonos-Controller keine Radiosender mehr auswählen kann. Besteht das Problem immernoch?
Wäre gut, wenn ich wüsste, welche Dateien ich von deiner neuen Klasse in meinem System ersetzen muss. Habe die ein oder andere Datei nach meinen Bedürfnissen abgeändert. Beim ersetzen aller Dateien aus deinem Zipfile müsste ich dann wieder alles korrigieren

Grüße, Jürgen

P.s.: Habe die neueste Sonos-Firmware, Datum der Klasse kann ich erst später nachschauen, da ich noch auf Arbeit bin.

Hallo Jürgen,

die Klasse aus dem letzten Beitrag (http://www.ip-symcon.de/forum/f53/php-sonos-klasse-ansteuern-einzelner-player-7676/index15.html#post131321) hat keine Radiotime Abfrage mehr im Getpositioninfo, damit kommt es nicht mehr zur Blockierung bei Radiotime, aber es werden natürlich auch keine RadioCover angezeigt (also alles wie vorher *g - Test sollte gefahrlos sein).

Es handelt sich beim dem Zip aus dem o.g. Beitrag auch nur um die PHPSonos Klasse (also die phpsonos.inc.php), die anderen Dateien (br_sonos) müsstest Du nicht austauschen.:wink:

Du kannst mir gerne mal schreiben, was Du so abgeändert hast, vielleicht baue ich das eine oder andere dann auch ein (wenn es br_sonos betrifft und nicht die Klasse im br_sonos Thread).? :smiley:
Ich hatte z.B. schon überlegt einen Crossfadeschalter einzubauen und diesen dann über eine Konfigurationsmöglichkeit (oder verstecken) An und Abschaltbar zu machen.

Viele Grüße, Benjamin

Hallo Benjamin,
habe soeben die neue Klasse vom 05.09.11 aufgespielt und die GetAudioInputAttributes erfolgreich ausgeführt. Funktioniert alles Bestens.

In deiner br_sonos.inc.php habe ich mittlerweile Crossfade und GetCurrentPlaylist integriert.

Grüße und mach weiter so,
Jürgen

[EDIT: Schalten im WF über die Variable http://www.ip-symcon.de/forum/f53/php-sonos-klasse-ansteuern-einzelner-player-7676/index18.html#post137417]

Hallo Jürgen,
hast Du beides direkt in die br_sonos_inc.php eingebaut und schreibst die Infos in die Kategorie des Raumes?

Ich habe inspiriert von Deiner Radioauswahl (ich nehme mal an Du pflegst die Liste aktuell manuell) mal mit dem automatischen Befüllen des Variablenprofils aus den Favoriten des Sonos Geräts gespielt:


// Sel (Integer)
$RadioFavSelID=(int)25828 /*[Musik\Boden\Radio]*/;
// Data var (String)
$RadioFavDataID=(int)36980 /*[Musik\Boden\RadioFavData]*/;
// Hide data var
IPS_SetHidden($RadioFavDataID,true);

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

	$VarProfileName="RadioFavSel";
	if (IPS_VariableProfileExists($VarProfileName)==true) {
	IPS_DeleteVariableProfile($VarProfileName);
	}
	IPS_CreateVariableProfile($VarProfileName,1);

	IPS_SetVariableCustomProfile($RadioFavSelID, $VarProfileName);

   $test=IPS_SetVariableCustomAction($RadioFavSelID, 45245 /*[Zentrale Steuerung\Includes\br_sonos\br_sonos_wf.php]*/ );
$browselist = $sonos->Browse("R:0/0","c");

// Safe off Data
SetValue($RadioFavDataID, serialize($browselist));

// DEBUG
print_r($browselist);

$position=0;
foreach($browselist as $radiofav)
{	IPS_SetVariableProfileAssociation($VarProfileName, $position, $radiofav['title'],"",-1);
	$position++; }

Das klappt auch ganz gut - auf Grund der Menge sieht es bei mir im WF aber irgendwie doof aus. Ich denke da muss irgendwas wie ein allgemeingültiges Popup mit PL, Song und Radioauswahl her (wobei ich nicht weiss wie dann die Iphone und Android Appdrauf reagieren, hum…). Vielleicht hilft Dir der Schnippsel bis dahin weiter.

Grüße, Benjamin

[EDIT: o.g. ist als Beispiel jetzt im Wiki Art. „br_sonos“]

Hallo Benjamin,
Crossfade und GetCurrentPlaylist habe ich direkt in br_sonos_inc.php integriert und schreibe es jeweils in eine Variable in den Sonos-Zonen.
Das mit den Radiostationen ist ja genial; werde es heute Nacht mal ausprobieren und berichten.

Danke und Grüße, Jürgen

Hallo Benjamin,
habe Dein Skript jetzt ausprobiert. Habe dafür ein neues Script erstellt und zwei Stringvariablen mit Namen Radio und RadioFavData. Habe die Variablen 25828, 36980 und 45245 aus Deinem Skript an meine Variablen angepasst. Nach ausführen des Skripts wird das Array erstellt und die Daten in die Variable RadioFavData geschrieben. Mehr passiert nicht. Die Variable Radio wird nicht aktualisiert und das Variablenprofil RadioFavSel wird auch nicht angelegt. Als br_sonos_wf.php (45245) habe ich die genommen, welche bei mir unter SONOSLibs erstellt wurde.

Grüße, Jürgen

Die Variable Radio muss vom Typ Integer sein - dann sollte es klappen. :smiley:

Ansonsten gebe ich Dir den Schnippsel mit ein paar Debug Ouput Zeilen.

Funktioniert einwandfrei. Aber wie bekomme ich jetzt Sonos dazu, selbständig den richtigen Sender abzuspielen?

(Das hab ich noch nicht gebaut… :p)

[EDIT: Lösung vorhanden http://www.ip-symcon.de/forum/f53/php-sonos-klasse-ansteuern-einzelner-player-7676/index18.html#post137417]

Prinzipiell sollte das so gehen: bei Aktualisierung der Variable Radio die DatenVariable per unserialize einlesen und dann die Sender Uri finden:

  • var[$radio][„res“] (denke ich)
  • und dann per SetAvtransportUri setzen.

Sorry… , bin gerade darin vertieft mit phpdoc und der Klasse zu experimentieren, damit die Dokumentation besser wird (HTML und PDF Doku automatisch generiert) - sonst hätte ich Dir fix ein Beispiel gebastelt.

Hilft das erstmal weiter (un/serialize und Array Routinen findest Du ja in br_sonos auch zu Hauf als Beispiel)?

Grüße, Benjamin

Bin also wirklich nicht fit in solchen Sachen. Werde es mal versuchen.

Danke, Jürgen