SONOS PHP Class

Für alle die es interessiert, hier eine SONOS PHP Klasse die alle Möglichkeiten der Player unterstüzt.
Die Datei ist nur mit den notwendigen Beschreibungen versehen, aber ich denke alle die in PHP Programmieren werden damit klar kommen.
Übrigens: Wer es noch nicht wusste… es ist bei den meisten Upnp Playern,devices ect. möglich einen Event Callback zu übergeben mit es es dann möglich den IPS Status zu aktuallisieren wenn es nötig ist und nicht sekündlich ein Script zur Abfrage zu starten.
Fragen dazu ?

Hier ein kleines Beispiel zu Sonos Klasse:


<?
include('Sonos.class.php');
$ip='192.168.1.2:1400';
$p=new SonosUpnpDevice($ip);
print_r( $p->GetServiceNames());
//print_r ($p->GetServiceFunctionNames('AVTransport'));
//$p->Stop();
//$p->Play();
$r=$p->CallService('AVTransport','RegisterEventCallback',array('http://192.168.112.100:9999',60));
print_r($r);
?>

Über Rückmeldungen würde ich mich freuen.:slight_smile:
cu Xaver
PS: Ich habe entsprechende php classen auch für Samsung TV, Plex, Sony Verstärker ect.

Sonos.class.zip (18.1 KB)

Hi Xaver,

Respekt! Das sieht sehr vielversprechend und professionell aus.

Bislang benutzte ich die PHPSonos Klasse, würde aber gerne von den zyklischen Statusabfragen wegkommen.

Kannst du mir mit einem Beispiel auf die Sprünge helfen, wie ich in IPS einen „Event Callback“ übergeben kann? Oder ist das bereits die Zeile
<PHP>$r=$p->CallService(‚AVTransport‘,‚RegisterEventCallback‘ ,array(‚http://192.168.112.100:9999‘,60));</PHP>
? Das ist die, die ich noch nicht verstehe …

Ich würde mich gerne einmal daran versuchen.

Viele Grüße

Burkhard

Über die Klasse des Samy würde ich mich freuen.
Da hatte ich irgendwann (aus Unlust zu Dlna/upnp und soap) mal aufgehört und somit fehlt mir das Callback für Lautstärke/Mute.
Michael

…ich habe heute eine PHP Klasse programmiert die das meiste erledigt. Ich bin noch am schreiben eines Install scripts. denke ich werde es morgen :wink: später posten
… auch eine kleine Anleitung wird folgen
… und ein paar kleine fehler in der sonos.class.php wurden behoben.
…und jetzt schau ich zu Abwechslung mal nen Film an g
cu
Xaver

Bitte schön
die bereits erwähnten kleinen Bugfixes sind hier schon enthalten
Samsung.class.zip (7.31 KB)

cu
Xaver

Hat etwas länger gedauert, aber nun ist der Anfang geschafft. Das Archiv enthällt alle Dateien die du benötigst.
Installation:

  1. auf deinem IPS Server ein Verzeichnis ‚sonos‘ im Ordner scripts erstellen.
  2. Alle Dateien des Archivs in den Ordner kopieren
  3. Inder Konsole ein neues script erstellen mit dem Inhalt:

<?
  include 'sonos\sonos.ips.install.php'; 
  IPSSonos_Install(28958 /*[Anfaang]*/); // <- hier die ObjectId des Stammverzeichnis wo du die SONOS Objecte erstellen möchtest. Wen 0 Angegeben dann wird alles im Hauptbaum erstellt,.
?>

  1. mit dem oben genannten Script werden im ersten durchlauf alle benötigten Objecte in IPS angelegt
  2. danach den Master konfigurieren, das heist einfach nur den Wert im SONOS Objectbaum den Wert für Master Device Host auf eine IP deines SONOS systems setzten. Vorzugsweise einen Player der immer erreichbar ist.
  3. danach das Installscript nochmal starten, dann werden alle gefundenen Player erstellt.

Soweit So Gut :slight_smile:
Nun zum, wohl, wichtigsten, Die Event Benachrichtigungen der Player !
Dazu must Du unter SONOS Konfiguration den Eintag ‚Adresse für Event Callback‘ ausfüllen.
Das Install-Script legt erstellt dazu in IPS einen ServerSocket der auf dem eigestellten PORT 9999 auch Ereignisse wartet.Jeder gefundene Player/Device erhällt dazu zwei Scripte die den Callback Event starten und beenden.
Der Wert ‚Refreshzeit für Event Callback in sek.‘ besagt , dass dein Device/Player xxx sekunden lang seine Änderungen sendet danach muss der Callback neu ausgefürt werden.
Im Klartext, hast du den Callback mit 60 gestartet , werden nur 60 sekunden vom Player Infos gesendet.

ACHTUNG! Dies ist (noch) kein Produktives System, sondern stellt nur ein Grundgerüst für den Aufbau zu Verfügung,

cu.
Xaver

Zu Anmerkung: Die Tools enthalten 5-6 Funktionen aus dem IPSInstaller, da ich nicht weiß ob ein Anwender die IPSTools installiert hat hab ich mir erlaubt die Funktionen zu übernehmen :wink:

sonos.ips.v1.zip (30.1 KB)

Hallo, ich habe jetzt versucht nach deiner Anleitung die Sonos Klasse zu installieren.
Jedoch bekomme ich einen Fehler.

SONOS_INSTALL: Create Profiles
SONOS_INSTALL: Create Root
Created Category SONOS=52993
SONOS_INSTALL: Create Scripts
Created Category scripts=22048
Created Script SonosActionScript=20184
Created Script SonosEventScript=41619
Created Script SonosConfigScript=45316
Created Script SonosSplitterScript=20388
Created Script SonosConfigInc=13059
Created Script SonosCommand=50610
Created Script SonosTranslation=56530
Created Script SonosDefines=22894
SONOS_INSTALL: Create Config
Created Category configcat=36502

Fatal error:  Call to undefined function Get_IdentByName() in [Objekt #50610 existiert nicht] on line 160
Abort Processing during Fatal-Error: Call to undefined function Get_IdentByName()
   Error in Script C:\IP-Symcon\scripts\sonos\sonos.ips.commands.php on Line 160

Ok hab den Fehler behoben , neue Dateien sind hier…

sonos-ips.v2.zip (29.5 KB)

Das ging aber schnell.

So beim ersten Ausführen der Installation folgenden Medldungen.

SONOS_INSTALL: Create Profiles
SONOS_INSTALL: Create Root
Created Category SONOS=24821
SONOS_INSTALL: Create Scripts
Created Category scripts=49137
Created Script SonosActionScript=35522
Created Script SonosEventScript=29185
Created Script SonosConfigScript=58353
Created Script SonosSplitterScript=31608
Created Script SonosConfigInc=59596
Created Script SonosCommand=47954
Created Script SonosTranslation=40030
Created Script SonosDefines=58942
SONOS_INSTALL: Create Config
Created Category configcat=41908

Warning:  Cannot auto-convert to Integer from Variant. Error: Invalid argument in [Objekt #47954 existiert nicht] on line 173
Created VariableId device=42906
Created VariableId master=59903
Created VariableId callback=24071
Created VariableId callbacktime=48656
SONOS_INSTALL: Create Device Category
Created Category devcat=41559
SONOS_INSTALL: Create WebFront Category
Created Category webfront=25499
Created Category zonecat=51632
Created Category statecat=24651
Created VariableId zsel=13151
Created Instance zstate=45873, ModuleID={485D0419-BE97-4548-AA9C-C083EB82E61E}
Created Category devopt=39513
Created Instance devopts=59777, ModuleID={485D0419-BE97-4548-AA9C-C083EB82E61E}
Created Instance devdev=47605, ModuleID={485D0419-BE97-4548-AA9C-C083EB82E61E}
SONOS_INSTALL: Create Event Listen Server on Port: 9999
SONOS_INSTALL: Create Event Splitter Instance
Created Instance SONOS_SPLITTER=11625, ModuleID={F3855B3C-7CD6-47CA-97AB-E66D346C037F}
Created VariableId CLIENTS=30857
Created VariableId AUTOCREATE=58988
Created VariableId AUTOCREATECATID=52730
SONOS_INSTALL: Write Config file => sonos.ips.config.inc
IPSSonos_UpdateZoneInfos
SONOS_INSTALL: Discover Player => Please enter a adress for Master Device Host and try again
SONOS_INSTALL: Finishd ok

Beim zweiten Ausführen der Installation.

SONOS_INSTALL: Create Profiles
SONOS_INSTALL: Create Root
SONOS_INSTALL: Create Scripts
SONOS_INSTALL: Create Config
SONOS_INSTALL: Create Device Category
SONOS_INSTALL: Create WebFront Category
SONOS_INSTALL: Create Event Listen Server on Port: 9999
SONOS_INSTALL: Create Event Splitter Instance
SONOS_INSTALL: Write Config file => sonos.ips.config.inc
IPSSonos_UpdateZoneInfos

Warning:  Ident darf nur aus Buchstaben und Zahlen bestehen in [SONOS\Scripte\Sonos Command Script] on line 145
Created Category 000xxxxxxxx001400:0=13966

Ich habe ein Sonos Play3 und drei Play1 verbunden über die Bridge im einsatz.

[

Gib mal Bitte http://ip-des-player:1400/status/topology ein und schick mir die Antwort,
Ich habe hier keine Bridge laufen, ich muß mal sehen wie die zonen bei dir aufgebaut sind.
Kannst mir auch unter x.bauer@tier-freunde.net schreiben falls es hier zu lang wird.
cu Xaver

Hier eine geänderte Datei bitte damit mal ausprobieren,
sonos.ips.commands.zip (3.41 KB)

Habe mal ein Screenshot gemacht.

Habe die Datei ausgetauscht.

erstes Ausführen der Installation

SONOS_INSTALL: Create Profiles
SONOS_INSTALL: Create Root
Created Category SONOS=52229
SONOS_INSTALL: Create Scripts
Created Category scripts=29029
Created Script SonosActionScript=38363
Created Script SonosEventScript=46780
Created Script SonosConfigScript=30648
Created Script SonosSplitterScript=36884
Created Script SonosConfigInc=58815
Created Script SonosCommand=11056
Created Script SonosTranslation=44702
Created Script SonosDefines=36036
SONOS_INSTALL: Create Config
Created Category configcat=22238

Warning:  Cannot auto-convert to Integer from Variant. Error: Invalid argument in [Objekt #11056 existiert nicht] on line 173
Created VariableId device=36403
Created VariableId master=12351
Created VariableId callback=25185
Created VariableId callbacktime=57335
SONOS_INSTALL: Create Device Category
Created Category devcat=29281
SONOS_INSTALL: Create WebFront Category
Created Category webfront=16685
Created Category zonecat=13556
Created Category statecat=14114
Created VariableId zsel=47012
Created Instance zstate=19542, ModuleID={485D0419-BE97-4548-AA9C-C083EB82E61E}
Created Category devopt=21484
Created Instance devopts=39202, ModuleID={485D0419-BE97-4548-AA9C-C083EB82E61E}
Created Instance devdev=34437, ModuleID={485D0419-BE97-4548-AA9C-C083EB82E61E}
SONOS_INSTALL: Create Event Listen Server on Port: 9999
Created Instance ips_sonos_server=39984, ModuleID={8062CF2B-600E-41D6-AD4B-1BA66C32D6ED}
SONOS_INSTALL: Create Event Splitter Instance
Created Instance SONOS_SPLITTER=58602, ModuleID={F3855B3C-7CD6-47CA-97AB-E66D346C037F}
Created VariableId CLIENTS=38269
Created VariableId AUTOCREATE=44835
Created VariableId AUTOCREATECATID=57390
SONOS_INSTALL: Write Config file => sonos.ips.config.inc
IPSSonos_UpdateZoneInfos
SONOS_INSTALL: Discover Player => Please enter a adress for Master Device Host and try again
SONOS_INSTALL: Finishd ok

zweites Ausführen der Installation

SONOS_INSTALL: Create Profiles
SONOS_INSTALL: Create Root
SONOS_INSTALL: Create Scripts
SONOS_INSTALL: Create Config
SONOS_INSTALL: Create Device Category
SONOS_INSTALL: Create WebFront Category
SONOS_INSTALL: Create Event Listen Server on Port: 9999
SONOS_INSTALL: Create Event Splitter Instance
SONOS_INSTALL: Write Config file => sonos.ips.config.inc
IPSSonos_UpdateZoneInfos
Created Category 000xxxxxx74001400:0=22299

Im Objektbaum hat sich nichts geändert

Dein Zone Infos sehen wie meine aus, daher bin ich erstmal überfragt, Das ist das leid der Programmierer. Beim einen gehts , beim anderen nicht :frowning:
Ich werde die Sonos Classe um eine Debug funktion erweitern, da ich sonst zu viele infos brauche, und diese dann hier posten,

cu
Xaver

Softbar

Ich finde die SONOS PHP Class sehr gelungen und würde die SW gerne einsetzen.
Die Funktionsaufrufe funktionieren auch ohne Probleme aber es ist halt wichtig das eine richtige Initiierung der SONOS Infrastruktur durchgeführt wird. Dieses Problem dürfte jeder Anwender haben.

Ich habe excellente Erfahrungen mit dem Projekt Exporter von Raketenschnecke gemacht und ich bin überzeugt das eine Basis Installation die mit Hilfe des Exporters zu Verfügung gestellt wird ein Minimum an Abhängigkeiten mit sich bringt und ein Maximum an Flexibilität.

Beste Grüße

Artur

Danke Artur…

Mein Problem ist einfach… ich wills immer komfortabler machen und ich denke jetzt es wird an der Zeit sein auf das wesentliche zu konzentirieren. Das da wäre… keine großen installer ect zu basteln sondern nur die UNITS zu Verfügung zu stellen und jeder User kann und darf daraus basteln was er will.

Den ProjektExporter hab ich natürlich gestern mal angeschaut und auch mit RaketenSchnecke selbst kurz kommuniziert. Stimmt die arbeit des ProjektExporters ist Prima, werde ich für das FrontEnd gut brauchen, aber sonst ist die Installation ja ein klacks.

Alle gefundenen Player werden eben nicht per Hand sondern mit der Funktion IPSSonos_UpdateZoneInfos() automatisch angelegt und da gibts wohl noch mit der Ident noch einen Haken. Bei mir klappts ohne Probleme.

Aber wie erwähnt möchte ich dies in Zukunft den Usern überlassen, helfe natürlich sehr gerne bei Fragen und Problemen weiter.

cu Xaver

Hallo Xaver,

ich habe mich nun auch an der Installation versucht.

Der erste Durchlauf des Installscripts war auch soweit erfolgreich:

SONOS_INSTALL: Create Profiles
SONOS_INSTALL: Create Root
Created Category SONOS=31385
SONOS_INSTALL: Create Scripts
Created Category scripts=28732
Created Script SonosActionScript=32613
Created Script SonosEventScript=48809
Created Script SonosConfigScript=32410
Created Script SonosSplitterScript=17765
Created Script SonosConfigInc=18549
Created Script SonosCommand=38433
Created Script SonosTranslation=11420
Created Script SonosDefines=22083
SONOS_INSTALL: Create Config
Created Category configcat=12385

Warning:  Cannot auto-convert to Integer from Variant. Error: Invalid argument in [CCU\Scripts\SONOS\SONOS\Scripte\Sonos Command Script] on line 173
Created VariableId device=44463
Created VariableId master=54915
Created VariableId callback=50110
Created VariableId callbacktime=20886
SONOS_INSTALL: Create Device Category
Created Category devcat=11738
SONOS_INSTALL: Create WebFront Category
Created Category webfront=27923
Created Category zonecat=18442
Created Category statecat=24622
Created VariableId zsel=18317
Created Instance zstate=37299, ModuleID={485D0419-BE97-4548-AA9C-C083EB82E61E}
Created Category devopt=29781
Created Instance devopts=14729, ModuleID={485D0419-BE97-4548-AA9C-C083EB82E61E}
Created Instance devdev=45154, ModuleID={485D0419-BE97-4548-AA9C-C083EB82E61E}
SONOS_INSTALL: Create Event Listen Server on Port: 9999
Created Instance ips_sonos_server=50764, ModuleID={8062CF2B-600E-41D6-AD4B-1BA66C32D6ED}
SONOS_INSTALL: Create Event Splitter Instance
Created Instance SONOS_SPLITTER=25675, ModuleID={F3855B3C-7CD6-47CA-97AB-E66D346C037F}
Created VariableId CLIENTS=53193
Created VariableId AUTOCREATE=11783
Created VariableId AUTOCREATECATID=47532
SONOS_INSTALL: Write Config file => sonos.ips.config.inc
IPSSonos_UpdateZoneInfos
SONOS_INSTALL: Discover Player => Please enter a adress for Master Device Host and try again
SONOS_INSTALL: Finishd ok

Die Warning auf Zeile 173 hat hoffentlich keine Nebenwirkungen.

Dann habe ich die Adresse des Masters eingegeben und das Script ein zweites mal aufgerufen:

SONOS_INSTALL: Create Profiles
SONOS_INSTALL: Create Root
SONOS_INSTALL: Create Scripts
SONOS_INSTALL: Create Config
SONOS_INSTALL: Create Device Category
SONOS_INSTALL: Create WebFront Category
SONOS_INSTALL: Create Event Listen Server on Port: 9999
SONOS_INSTALL: Create Event Splitter Instance
SONOS_INSTALL: Write Config file => sonos.ips.config.inc
IPSSonos_UpdateZoneInfos
Created Category 000E5831FF8401400:339=31593

Anschließend ist aber das Script als fehlerhaft markiert und im Objektbaum tauchen keine Geräte auf:

Als Player verwende ich einen PLAY:3, zwei PLAY:5, einen CONNECT:AMP und einen CONNECT.

Hast du eine Idee, was ich eventuell falsch mache?

Viele Grüße

Burkhard

Ja dies wird , wie bei dem vorherigen tester, an der funktion ‚IPSSonos_UpdateZoneInfos‘ liegern. Dort muss aus der playerident der ‚:‘ raus gefiltert werden. Seltsam nur das es bei mir funktioniert.
mich würde mal interessieren wie deine xml antwortdatei aus dem aufruf von http://player:1400/status/topology
aussieht besser noch ich brauche die mal als datei, nicht als screen. Nur zum testen dann wird die wieder gelöscht. Damit kann ich dein Problem mit sicherheit lokalisieren, bzw beheben.
cu
Xaver

Du hast eine Email.

Gruß

Burkhard

Hallo Xaver,

ich habe bereits etwas herausgefunden.

In „Sonos Command Script“ kommt es zu einem Fehler auf Zeile 122:

			$PlayerId = @CreateDummyInstance($ident, VAR_PlayerCategoryId, $position);

da es die Methode CreateDummyInstance nicht gibt. Stattdessen muss es wohl IPSSonos_CreateDummyInstance heißen.
Nach der Änderung legt er ein Gerät an. Aber sollten es nicht alle sein?

Gruß

Burkhard