br_sonos

Hallo bengie,

ich habe die br_sonos bei mir installiert. Besten Dank dafür.
Holy moly! Da steckt ja ne menge Arbeit drin.

Ich habe eine Frage am Rande. Wie machst Du es das man im WebFront
auf ein Wort klickt und damit ein Script startet? (wenn ich zwei Player verbinde).

Ich könnte diese Funktion gerade gut gebrauchen.

Für deine Hilfe besten Dank.

:smiley: Danke für die Blumen!

Ich habe eine Frage am Rande. Wie machst Du es das man im WebFront
auf ein Wort klickt und damit ein Script startet? (wenn ich zwei Player verbinde).

Ich könnte diese Funktion gerade gut gebrauchen.

Für deine Hilfe besten Dank.

  1. Du erstellst / nutzt eine HTMLBox
  2. Link analog folgendem erzeugen (achte auf JS onclick und das style setting)

$ZoneStatus = "<a href=\"Remove Switch Coord " . $arrzoneplayers[$curCoord]['CurrentZoneName']."\"  style=\"text-decoration:none; color:white;\" onclick=\"new Image().src = '/user/sonoscmd.php?Name=" . $arrzoneplayers[$curCoord]['CurrentZoneName'] . "&sonosip=" . $arrzoneplayers[$curCoord]['IP'] . "&sonosid=" . $arrzoneplayers[$curCoord]['Rincon'] .
							"&cmd=RemoveMember&memberip=" . $arrzoneplayers[$curCoord]['IP'] . "&memberid=".$arrzoneplayers[$curCoord]['Rincon']."'; return false;\"><b>" . $arrzoneplayers[$curCoord]['CurrentZoneName'] .
							"</b><img src='/user/icons/fixed/minus.png' height='10' width='10' border='0'> </a>";
  1. Ein Skript im User Verzeichnis anlegen, welches die Aktion entgegennimmt

<?
// Teststring für den Aufruf:
//http://192.168.0.5:82/user/sonoscmd.php?sonosip=192.168.0.115&sonosid=RINCON_000E5832FB5C01400&cmd=RemoveMember&memberip=192.168.0.111&memberid=RINCON_000E5825411201400

//http://192.168.0.5:82/user/sonoscmd.php?sonosip=192.168.0.115&sonosid=RINCON_000E5832FB5C01400&cmd=AddMember&memberip=192.168.0.111&memberid=RINCON_000E5825411201400

require ("../../scripts/functions.inc.php"); // use PHPSonos.inc.php here
        if ($cmd == "RemoveMember") {
     // action
	}
        if ($cmd == "AddMember") {
     // action
	}
?>

Viele Grüße, Benjamin

Super, besten Dank! :slight_smile:

Werde das mal auseinander bröseln.

hi bengie,

hast Recht: ich rufe das Script aus einem anderen Script auf. Habs jetzt abgestellt. Danke für den schnellen Support;)

Hallo Jürgen,
ich habe nochmal ein wenig geforscht, da ich Dein Problem in bestimmten Konstellationen fast komplett nachvollziehen konnte. Ich habe im Bereich der Konvertierung und dem Encoding Veränderungen eingebaut.

  1. Spiele bei Gelegenheit das beigefügte Archiv mal ein
  2. Lösche in den Räumen bitte alle Variablen außer SONOS_IP und das Skript br_sonos_zonesetup.
  3. Führe danach in jedem Raum nochmal ein zonesetup aus
  4. führe das br_sonos_setup nochmal abschließend aus

Ist das Problem behoben bzw. was hat sich verändert?

Grüße, Benjamin

br_sonos.zip (49.8 KB)

Hallo Benjamin,
ich muss Dir ein tolles Kompliment machen; jetzt passt alles und wird richtig dargestellt. Einzig die Darstellung im FF ist nicht ganz so schön wie im IE9. Aber damit kann ich gut leben, liegt wohl am FF.

:smiley: SUPER ARBEIT :smiley:

Grüße, Jürgen

Hallo Benjamin,

bei mir sind jetzt auch alle Probleme beseitigt.

Super. Besten Dank!!! :):):slight_smile:

Hallo Jürgen, hallo Martin,
Vielen Dank für Euer Feedback! :smiley: :o
Grüße, Benjamin

Hallo Benjamin,

ich habe br_sonos soeben installiert, funktionierte sofort :slight_smile:

Vielen Dank für die SUPER Arbeit.

Herzliche Grüße
Dieter

Hallo,
ist es eigentlich möglich, die vorhandenen Playlisten im WF anzuzeigen (ähnlich wie bei Ta Lun), um sie dann per Klick anzusehen oder abzuspielen?
Bekomme ja mit GetSONOSPlaylists die Playlisten angezeigt. Aber wie geht es dann weiter?

Grüße, Jürgen

Hallo Jürgen,
das ist aktuell nicht implementiert (in br_sonos) - prinzipiell aber möglich (da die Methoden ja in PHPSonos vorhanden sind). Ich überlege schon eine Weile wie ich das fürs Webfront platzsparend einbauen kann.

Aktuell favorisiere ich dafür einen oder mehrere Knöpfe einzubauen die ein Popup mit der aktuellen Queue (Auswahl Titel), allen PL (PL Auswahl) oder einer Liste der Radiosender aufmachen. Der Sonos spezifische Teil ist nicht so schwer, ich müsste mir nur mal angucken ob das mit einer Popup Funktion vom IPS Webfront geht, oder ob ich etwas eigenes bauen muss. Ich vermute es läuft dann auf eine Userseite oder eine HTMLBOX im Popup hinaus. Auffangen des Klicks würde ich dann über eine Userseite machen (wie auch für die Zonenauswahl - dafür hatte ich ja mal eine Beschreibung geposted).

Ich schaue mal ob es bei den Sqeezebox oder Itunes Skripten schon etwas gibt, das praktikabel ist - dauert aber definitiv noch bis ich da was „fertiges“ gebaut hab.

Viele Grüße, Benjamin

Hallo Benjamin,
hatte es mir so vorgestellt:

  1. Auslesen der Playlists mit GetSONOSPlaylists
  2. Automat. abspeichern der Playlisttitel in verschiedene Variablen (Var1=Playlist1, Var2=Playlist2, usw.) Nicht die Lieder, sondern nur die Titel der Playlisten speichern.
  3. Diese Variablen haben nur 2 Visualisierungen: 0=Playlist ansehen per Browse, 1=Playlist laden und abspielen.
  4. Bei Neuanlage einer Playlist über den Controller, sollte auch automatisch eine neue Variable angelegt werden, oder bei Löschung einer Playlist die Variable gelöscht werden.
    Dadurch bräuchte man nicht so viel Platz im WF um die Playlisten anzuzeigen.
    Bleibe aber schon bei Punkt 2 (abspeichern) hängen und bekomme die Titel nicht in einzelne Variablen.

Grüße, Jürgen

Hallo Jürgen,
das Auslesen, Anzeigen und Abspeichern sind ja schon sehr verschiedene Dinge. Wenn ich die Info mal Abfrage vom Gerät, weil es ein Benutzer sehen will geht das sehr fix.

Mir ging es eher um die Art der Visualisierung, das Handling im Script ist - denke ich- kein Problem und auch dynamisch generiert kein Problem (schnell genug).

Das „Parsen“ in einzelne Variablen ist manchmal recht trickreich - die PHPSonos Klasse sollte aber eigentlich die Infos als Array zurückgeben. Das kann man recht gut weiterverarbeiten. Was willst Du denn konkret machen (Beispiel)?

Grüße, Benjamin

Hallo Benjamin,
ich habe folgendes Script um die Playlists auszulesen:

require ("functions.inc.php"); // use PHPSonos.inc.php here
$sonos = new PHPSonos("192.168.2.135"); //Sonos ZP IPAdresse

$sonoslists=$sonos->GetSONOSPlaylists();
print_r($sonoslists);

Dadurch bekomme ich folgendes Array:

Array ( [0] => Array ( [id] => SQ:4 [title] => Die Toten Hosen1 [typ] => Sonos [file] => file%3A%2F%2F%2Fjffs%2Fsettings%2Fsavedqueues.rsq%234 ) 
[1] => Array ( [id] => SQ:3 [title] => Test [typ] => Sonos [file] => file%3A%2F%2F%2Fjffs%2Fsettings%2Fsavedqueues.rsq%233 ) 
[2] => Array ( [id] => SQ:12 [title] => Test_Jürgen [typ] => Sonos [file] => file%3A%2F%2F%2Fjffs%2Fsettings%2Fsavedqueues.rsq%2312 ) 
[3] => Array ( [id] => SQ:9 [title] => Test1 [typ] => Sonos [file] => file%3A%2F%2F%2Fjffs%2Fsettings%2Fsavedqueues.rsq%239 ) 
[4] => Array ( [id] => SQ:10 [title] => Test2 [typ] => Sonos [file] => file%3A%2F%2F%2Fjffs%2Fsettings%2Fsavedqueues.rsq%2310 ) ) 

Jetzt sollen automatisch Integervariablen angelegt werden mit den Namen
Die Toten Hosen1
Test
Test Jürgen
Test1
Test2

Diese Variablen werden dann wie im Bild dargestellt. Die Variablen sollen sich automatisch oder nach Scriptaufruf aktualisieren.
Drücke ich dann im WF auf den Button „Anzeigen“, soll per Browse-Befehl ein Popup mit den Liedtiteln der Playlist erscheinen; bei Play soll die Playlist als Currentplaylist geladen und gestartet werden.
Hoffe, ich habe mich einigermaßen verständlich ausgedrückt!

Grüße, Jürgen

wow, Jungs - das sieht sehr gut aus, Klasse Job! bin gespannt;)

Hallo Jürgen,
ist mir etwas schwergefallen das zu verstehen, weil ich es selbst anders gemacht hätte. Diese Lösung vergeudet eine Menge Variablen und es ist schwer das entfernen und löschen zu bauen, finde ich. Für br_sonos werde ich mir etwas anderes überlegen.

Egal, ich hab jetzt mal etwas gebaut für Dich:



// Profile anlegen
	$VarProfileName="pl_anz_play";
	if (IPS_VariableProfileExists($VarProfileName)==False) {
	IPS_CreateVariableProfile($VarProfileName,1);
			IPS_SetVariableProfileAssociation($VarProfileName, 0, "Anzeigen","",-1);
		   IPS_SetVariableProfileAssociation($VarProfileName, 1, "Play","",-1);

	}
// Listen einlesen
$sonoslists=$sonos->GetSONOSPlaylists();
// DEBUG ausgeben
print_r($sonoslists);
// ...wo sollen die ganzen Vars hin
$ParentID=(int)33498 /*[Test]*/; // ...wo sollen die ganzen Vars hin
// schön bei 1 anfangen
$position=1;
foreach($sonoslists as $sonoslist)
{
	$id = CreateVariableByName($ParentID, $sonoslist['title'],VAR_TYPE_INTEGER);
	// Profil zuweisen
	IPS_SetVariableCustomProfile($id, "pl_anz_play");
	IPS_SetPosition($id, ++$position);
   $test=IPS_SetVariableCustomAction($id, 45245 /*[Zentrale Steuerung\Includes\br_sonos\br_sonos_wf.php]*/); // action skript setzen
	SetValueInteger($id, -1); // Wert setzen auf -1
	$position++;

}


Ach, das „SetValueInteger($id, -1); // Wert setzen auf -1“ sorgt dafür, dass im Normalfall kein Knopf vorausgewählt ist.

Grüße, Benjamin

pl_wf2.png

Hi bengie,

ich hab mittlerweile Deine Lösung kompett bei mir integriert und meine bisherige rausgeworfen. Die automatische Steuerung meiner Boxen erledige ich fast ausschliesslich so das meine Scripte neue Werte in die Sonos-Vars reinschreiben um dadurch deine Scrpte auszulösen. Fast - bis auf eine Ausnahme: Volume steuere ich direkt über Funktionen aus der Sonos-Klasse (weil ich hier zeitlich synchron mehrere Boxen mit unterschiedlichen Lautstärken ansteuern will) . Was ich noch nicht verstanden habe: wie kann ich Deine Scripte dazu bringen das diese unmittelbar nach einer Volume-Änderung auch die IPS-Daten aktualisieren? Das Aufrufen der Scripte führte ja zu Fehlern… Haste ne Idee?

Cool! :cool:

Versuche mal …


require ("functions.inc.php");
br_sonos_read_all();

(Alle Zonen aktualisieren)
Oder:


require ("functions.inc.php");
br_sonos_read(46344);

(Zone deren IP in der IPS Variable mit der ID steht aktualisieren; ID der SONOS_IP halt)

EDIT: Wobei wenn Du Du die Volume Variablen der unterschiedlichen Zonen nach Deinem Regeln oder auch nur mit den Ziel Volumes befüllst, sollte das WF die Aktualisierung selbsttätig machen. Dann ruckelt nicht immer alles so wie beim br_sonos_read bzw. br_sonos_real_all. Ist vielleicht die schönere Variante.

Grüße, Benjamin

Hallo Benjamin,
vielen Dank für Deine Antwort. Werde es gleich mal versuchen. Wenn Du dann eine andere Lösung gefunden hast, werde ich wohl auch wieder umsteigen, denn Deine Sachen sind einfach spitze. So lange werde ich diese Übergangslösung nehmen.

Grüße, Jürgen

Hallo,
ich habe die durchgeführten Änderungen an der Klasse nach langer Zeit nun im PHPSonos Thread und im Wiki (nicht als Test) verlinkt / veröffentlicht (ich hoffe das passt jetzt alles erstmal und es hagelt nicht gleich Fehlerberichte).

[http://www.ip-symcon.de/forum/f53/php-sonos-klasse-ansteuern-einzelner-player-7676/index13.html#post129586 PHPSonos](http://www.ip-symcon.de/forum/f53/php-sonos-klasse-ansteuern-einzelner-player-7676/index13.html#post129586 PHPSonos)

Die von Euch verwendete Klasse aus dem letzten br_sonos.zip sollte eigentlich der dortigen Klasse entsprechen.

Grüße, Benjamin