PHP Sonos (Klasse zum Ansteuern einzelner Player)

Also nun mein Senf dazu :wink:
1.) Von mir aus können wir das „leer“ weglassen dann aber einheitlich bei allen variablen.
2.) Die Erweiterung der Parameter macht nur dann Sinn, wenn wir auch wissen wie diese vernütig eingesetzt werden können. Soweit ich mich erinnern kann hatte ich keine vernüftige Möglichkeit gefunden z.B. den Filter zu nutzen.
Wenn die Abfrage funktioniert ohne das die Parameter dabei sind ist es mir wurscht. Wenn Du mir dann noch zeigen kannst, wie die Parameter vernüftig zum einsatz kommen bin ich total dafür :wink:
3.) Die umbenennung ist für mich ok würde das aber ein wenig von iamking abhängig machen, der hat die schließlich eingebaut…
Gruß
Ta Lun

hallo,

@ bengie: umbenennen von GetAlarmTime in ListAlarms ist ok.
Aber bitte folgende Inhalte ausbessern (copy, paste):

$attr = $xmlr->Alarm[$i]->attributes();
            $liste[$i]['ID'] = (string)$attr['ID'];
            $liste[$i]['StartTime'] = (string)$attr['StartTime'];
            $liste[$i]['Duration'] = (string)$attr['Duration'];
            $liste[$i]['Recurrence'] = (string)$attr['Recurrence'];
            $liste[$i]['Enabled'] = (string)$attr['Enabled'];
            $liste[$i]['RoomUUID'] = (string)$attr['RoomUUID'];
            $liste[$i]['ProgramURI'] = (string)$attr['ProgramURI'];
            $liste[$i]['ProgramMetaData'] = (string)$attr['ProgramMetaData'];
            $liste[$i]['PlayMode'] = (string)$attr['PlayMode'];
            $liste[$i]['Volume'] = (string)$attr['Volume'];
            $liste[$i]['IncludeLinkedZones'] = (string)$attr['IncludeLinkedZones'];

Es sind die Felder „ProgramURI“, „ProgramMetaData“, „PlayMode“, „Volume“, „IncludeLinkedZones“ hinzugekommen. Die werden für die unten gezeigte Funktion noch benötigt.

Hier die Funktion zum ändern eines bestehenden Alarms:

public function UpdateAlarm($id, $startzeit, $duration, $welchetage, $an, $roomid, $programm, $programmeta, $playmode, $volume, $linkedzone)
{
	$payload = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body><u:UpdateAlarm xmlns:u="urn:schemas-upnp-org:service:AlarmClock:1">
<ID>'.$id.'</ID>
<StartLocalTime>'.$startzeit.'</StartLocalTime>
<Duration>'.$duration.'</Duration>
<Recurrence>'.$welchetage.'</Recurrence>
<Enabled>'.$an.'</Enabled>
<RoomUUID>'.$roomid.'</RoomUUID>
<ProgramURI>'.htmlspecialchars($programm).'</ProgramURI>
<ProgramMetaData>'.htmlspecialchars($programmeta).'</ProgramMetaData>
<PlayMode>'.$playmode.'</PlayMode>
<Volume>'.$volume.'</Volume>
<IncludeLinkedZones>'.$linkedzone.'</IncludeLinkedZones>
</u:updateAlarm></s:Body></s:Envelope>';


$content='POST /AlarmClock/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: '.strlen($payload).'
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AlarmClock:1#UpdateAlarm"

'.$payload;

		$this->sendPacket($content);
	}

die ich so anspreche:

$sonos->UpdateAlarm("$id", "$starttime", "$duration", "$welchetage", "$an", "$roomid", "$programm", "$programmeta", "$playmode", "$volume", "$linkedzone");

So wie ich das lese, habt ihr eine bestimmte vorgehensweise wie Variablen zu benennen sind. Könnt ihr also einfach anpassen.

Die schreibweise der Funktion hab ich einfach von einer bestehenden Funktion abgeschrieben (ich glaub von McFly).

@TaLun: Ich glaube ich habe verstanden wie du die Funktion ListAlarms angepasst hast. Danke nochmal für die Hilfe.

grüße
iamking

Ich passe das dann, wie oben beschrieben an - aber ich brauch noch Zeit um mir den Code mal in Ruhe ansehen zu können!

Eigentlich bin ich auch nicht der offizielle Wächter oder der Programmierer der PHP Klasse, sondern ich entwickle diese für meine Zwecke weiter und versuche lediglich zu verhindern, dass es viele verschiedene Versionen davon gibt oder führe diese ggf. zusammen.

Für das was ihr macht, wäre GitHub ein super Service, den ihr nutzen könntet. Es kann eine Hauptversion geben, jeder kann seine Änderungen lokal hinzufügen, und ein oder mehrere Maintainer können diese Änderung wieder in die Hauptversion „mergen“.

paresy

Hallo Parsey,

da muß ich mich erstmal einlesen. Danke für den Tipp.

Hallo zusammen,
ich habe jetzt die geposteten/ besprochen Änderungen eingebaut.

Wenn ich keine neuen Bugs eingebaut habe, sollte es bei Euch wie vorher laufen… :cool: ??

Viele Grüße, Benjamin

PHPSonos.inc_test.zip (8.84 KB)

Hallo zusammen,

ich versuche mich gerde etwas in das Thema Sonos einzuarbeiten.
Bekomme jedoch gleich folgendes Problem:

include ("PHPSonos.inc.php");
$sonos = new PHPSonos("192.168.90.191"); //Sonos ZP IPAdresse
$sonos->AddToQueue("x-file-cifs:\\192.168.90.102\fritz.nas\Musik\1.mp3"); //Datei hinzufügen

Fehlermeldung:


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/14.5-40190c (ZPS5)
Connection: close

s:ClientUPnPError' in C:\IP-Symcon\scripts\PHPSonos.inc.php:1437
Stack trace:
#0 C:\IP-Symcon\scripts\PHPSonos.inc.php(1036): PHPSonos->sendPacket('POST /MediaRend...')
#1 C:\IP-Symcon\scripts\19308.ips.php(14): PHPSonos->AddToQueue('x-file-cifs:\19...')
#2 {main}
  thrown in C:\IP-Symcon\scripts\PHPSonos.inc.php on line 1437

kann jemad helfen ??

LG
Jürgen

Deine Slashes sind in die falsche Richtung :slight_smile:

paresy

habe die GetSonosPlaylist anpassen müssen.
Durch die mitgelieferte Raute ist eine Verarbeitung in einem Browser nicht möglich daher habe ich das entsprechend angepasst:

    //Liefert ein Array mit allen Sonos Wiedergabelisten und deren Aufrufinformationen
    public function GetSonosPlaylists()
    {
        $header='POST /MediaServer/ContentDirectory/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"
CONTENT-TYPE: text/xml; charset="utf-8"
HOST: '.$this->address.':1400';
$xml='<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:Browse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1"><ObjectID>SQ:</ObjectID><BrowseFlag>BrowseDirectChildren</BrowseFlag><Filter></Filter><StartingIndex>0</StartingIndex><RequestedCount>100</RequestedCount><SortCriteria></SortCriteria></u:Browse>
</s:Body>
</s:Envelope>';
$content=$header . '
Content-Length: '. strlen($xml) .'

'. $xml;

    $returnContent = $this->sendPacket($content);
    $returnContent = substr($returnContent, stripos($returnContent, '<'));
        $returnContent = substr($returnContent, 0, strrpos($returnContent, '>') + 4);
        $returnContent = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25"), array("<", ">", "\"", "&", ":", "/", "%"), $returnContent);

        $xml = new SimpleXMLElement($returnContent);
        $liste = array();
        for($i=0,$size=count($xml);$i<$size;$i++)
        {
            $attr = $xml->container[$i]->attributes();
            $liste[$i]['id'] = (string)$attr['id'];
            $title = $xml->container[$i];
            $title = $title->xpath('dc:title');
            $liste[$i]['title'] = (string)$title[0];
            $liste[$i]['typ'] = "Sonos";
            $liste[$i]['file'] = urlencode((string)$xml->container[$i]->res);
        }


return $liste;
    }

Hoffe das ist soweit ok.

Browse habe ich um folgendes erweitert:

$resattr = $aktrow->res->attributes();
									if(isset($resattr['duration'])){
		          			$liste[$i]['duration']=(string)$resattr['duration'];
		          		}else{
		          			$liste[$i]['duration']="leer";
		          		}

Wenn man die Metadaten rausholt bekommt man u.a. die Laufzeit mitgeliefert, die nun auch als return mit ausgegeben wird.

Hi bengie,

ich bin total neu in der Sonos-Welt, hab die Wiki-Seite durchgeackert und bin nun bei der Test Sonos-Klasse gelandet.

Ich bekomme hier alle paar Minuten eine Fehlermeldung:


IPS-Err-PHP  2011-07-10 18:42:58.176  Notice: Undefined variable: MetaData
   Error in Script C:\IP-Symcon\scripts\PHPSonos.inc.php on Line 984
   10 in IPSLogger.ips.php (call IPSLogger_Out)
   20 in IPSLogger_PhpErrorHandler.ips.php (call IPSLogger_Err)
  984 in PHPSonos.inc.php (call IPSLogger_PhpErrorHandler)
   20 in 55574.ips.php (call SetRadio)


ich hab mal in den Code geschaut, aber bis ich den verstanden habe wird’s noch ein paar Tage dauern (entspannt hat mich allerdings der Kommentar in Code: // NOTEBR: diese F. ist aktuell noch buggy). Daher die Frage: ist das ein Bug oder liegt’s an meinem Code?

Hallo Raketenschnecke,

welche Aktion führst du aus, wenn der Fehler kommt?
SetRadio?

Ich habe es auch gerade versucht mit der neuen Klasse. Bei mir das gleiche.
Ich hab damals noch eine weitere Radiofunktion gefunden (von McFly). Diese funktioniert bei mir.


public function SetRadio($radio, $title)
{
	$payload = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><CurrentURI>'.htmlspecialchars($radio).'</CurrentURI><CurrentURIMetaData><DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="R:0/0/0" parentID="R:0/0" restricted="true"><dc:title>'.htmlspecialchars($title).'</dc:title><upnp:class>object.item.audioItem.audioBroadcast</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">SA_RINCON65031_</desc></item></DIDL-Lite></CurrentURIMetaData></u:SetAVTransportURI></s:Body></s:Envelope>';


$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: '.strlen($payload).'
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"

'.$payload;

		$this->sendPacket($content);
	}


Ansprechen kann man die so:


$sonos->SetRadio("x-rincon-mp3radio://streams.br-online.de/bayern3_2.asx", "Bayern 3");
$sonos->Play();

@bengie: evtl kann man das bei der nächsten Version austauschen.
den rest werde ich jetzt testen, da ich mit dem update auf 2.4 aufgrund meiner „anfängerprogrammierkenntnisse“ doch einige probleme hatte. sollten nun aber behoben sein.

gruß
iamking

Hallo zusammen,
ich habe den Fehler gefunden, denke ich.

Es muss $MetaData= und nicht $Metadata heißen.
Außerdem habe ich einige htmlspecialchars Aufrufe entfernt.

:smiley:

	public function SetRadio($radio,$Name="IP-Symcon Radio")
	{
	$MetaData="<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="R:0/0/0" parentID="R:0/0" restricted="true"><dc:title>".$Name."</dc:title><upnp:class>object.item.audioItem.audioBroadcast</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">SA_RINCON65031_</desc></item></DIDL-Lite>";

 	$this->SetAVTransportURI($radio,$MetaData);

	}

	public function SetAVTransportURI($tspuri,$MetaData="")
	{

$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: '.(342+strlen(htmlspecialchars($tspuri))+strlen($MetaData)).'
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><CurrentURI>'.htmlspecialchars($tspuri).'</CurrentURI><CurrentURIMetaData>'.$MetaData.'.</CurrentURIMetaData></u:SetAVTransportURI></s:Body></s:Envelope>';

		$this->sendPacket($content);
	}

Bei mir läuft´s jetzt -bei Euch auch?

Edit: Danke für die Rückmeldung, Raketenschnecke und Iamking! Das ist dann auch im nächsten ZIP.

Grüße, Benjamin

Hallo Talun!

… ist bei mir drin. Du hattest nur das urlencode für das File hinzugefügt, oder?

Browse habe ich um folgendes erweitert:

$resattr = $aktrow->res->attributes();
									if(isset($resattr['duration'])){
		          			$liste[$i]['duration']=(string)$resattr['duration'];
		          		}else{
		          			$liste[$i]['duration']="leer";
		          		}

Wenn man die Metadaten rausholt bekommt man u.a. die Laufzeit mitgeliefert, die nun auch als return mit ausgegeben wird.

Die zweite Erweiterung (browse) klappt bei mir nicht, ich bekomme immer „leer“ zurück. Kannst Du mir nochmal die komplette Browse Funktion posten oder mir senden?

Grüße, Benjamin

hi iamking, genau so wie du es beschreibst steuer ich meine S5 an.

ich probier jetzt mal die Änderungen von Bengie

Update:bengie, scheint zu funktionieren, danke sehr :slight_smile:

hi bengie,

leider gehts bei mir nicht.
ich hab eine fehlermeldung:

fatal error: cannot redeclare PHPSonos::SetAVTransportURI() in D:\IP-Symcon\scripts\PHPSonos.inc.php on line 1006

ich habe auch meinen ip-symcon-befehl geändert, und zwar ohne den Titel des Senders, aber auch hier, ohne Erfolg.

Hier meine Befehlszeile:

$sonos->SetRadio("x-rincon-mp3radio://streams.br-online.de/bayern3_2.asx");
$sonos->Play();

EDIT: Geht, ich hatte den Cache wohl nicht richtig sauber, und hatte eine Kombi aus neu und alt, nach einem Restart vom FF klappts nun!

Iamking,

dann klappts jetzt nach Deinem Edit bzw. FF reload?!
Ich habe auch noch nie so viel Bayern 3 im Norden gehört, wie heute :smiley: :cool:

Der Aufruf sollte eigentlich mit oder ohne Übergabe des Titels klappen. Wenn Du keinen Titel übergeben hast, wird jetzt „IP-Symcon Radio“ angezeigt, ansonsten Bayern 3 oder Dein Sender. :loveips:

Grüße ,Benjamin

Hallo Benjamin,

ja klappt einwandfrei. Danke.

aber du hast ja jetzt den Streamlink zu Bayern3, dann kannst du das noch öfters hören :smiley:

schöne grüße aus Ingolstadt

(Off Topic)
Auf dem Weg zum Urlaub hören wir oft Bayern 3 und danach fast noch mehr Ö3 (3?, denke schon). Danke für das Urlaubsfeeling! :smiley:

Viele Grüße, Benjamin

na dann machen wirs doch perfekt:

mms://apasf.apa.at/OE3_Live_Audio :smiley:

für ip-symcon mußt du mms:// weglassen…

greets iamking

Der Thread ist nun aufgeteilt in PHPSonos und br_sonos.

Hier im PHPSonos Thread soll primär die Weiterentwicklung der PHPSonos-Klasse, allgemein, besprochen werden.

Meine Routinen für IPS, br_sonos und nur IPS betreffende Information und Diskussionen können im Thread http://www.ip-symcon.de/forum/f53/br_sonos-14938/#post125861 erfolgen.

Die Wiki Artikel PHPSonos und br_sonos sind nun getrennt und im Hinblick auf die zunehmende Aufmerksamkeit auf unsere Entwicklungen, nach Möglichkeit auch zweisprachig (german/english) verfasst.

[i]This Thread got seperated to PHPSonos and the IPS specific functions released as br_sonos.

THIS PHPSonos Thread is the ressource to discuss and publish PHP/SOAP stuff for sonos integration.

My personal routines -only valid for IPS-, br_sonos, and routines only valid for IPs Homeautomation use will be discussed here: http://www.ip-symcon.de/forum/f53/br_sonos-14938/#post125861

Wiki articles for PHPSonos and br_sonos have been seperated and edited to reflect international attention on our sonos developement work.[/i]

Viele Grüße / Regards,
Benjamin