Sonos Modul

Hallo,

das geht auch.

Du kannst im Splitter in die Liste mit den Radiosendern manuell einen einfügen.
Sobald das geschehen ist, kannst Du ihn über SNS_SetRadio() ansprechen.

Reicht das nicht?

Gruß,
Thorsten

Moin Thorsten,

ich importiere mit der Instanz immer nur die Sonos-Favoriten, denn davon habe ich nur ein paar (<20). Für meine Lieblingsalben nutze ich aber die gespeicherten Playlisten in Sonos. Die kann ich mit SNS_SetPlaylist auch prima abspielen, alles gut.

Aber kannst du mir verraten, wie ich die gespeichrten Playlisten abfragen kann ? In der „alten Klasse“ ging das mal. Über das Variablenprofil kann ich aber nicht, da ja aus oben genannten Gründen ich nur die Favoriten importiere. Das wäre praktisch, denn ich möchte so ein paar Dutzend kleine RFID Karten mit Coverbildchen machen und die dann nur noch an den Schrank halten.

Kannst du oder jemand mir da weiterhelfen ?

und btw: könnte man bei bestimmten Funktionen wie SNS_SetPlaylist den Fehler abfragen ? Ich bekomme als Rückgabewert immer ein false, falls die PLaylist nicht existiert oder Sonos unerreichbar ist (ich schalte die nachts oder im Urlaub aus) schmeißt mir die Instanz eine Exception. Klar, das kann man mit try{} abfangen, aber im Modul wäre das natürlich schicker.

Vielen Dank,
Tom

Hallo,

Ich bin mit nicht ganz sicher ob ich Dich richtig verstanden habe, aber dieses Script gibt die alles aus, was ich starten könnte. Die drei Sektionen entsprechenden dann dem „Import Playlists“ im Splitter…

<?

if(file_exists('../modules/SymconSonos/Sonos/sonosAccess.php')){
  include_once '../modules/SymconSonos/Sonos/sonosAccess.php';
}elseif(file_exists('../modules/Sonos/libs/sonosAccess.php')){
  include_once '../modules/Sonos/libs/sonosAccess.php';
}elseif(file_exists('../modules/.store/de.kugelberg.sonos/libs/sonosAccess.php')){
  include_once '../modules/.store/de.kugelberg.sonos/libs/sonosAccess.php';
}else{
    die('sonosAccess.php not found');
}

$replaceFrom = ['/\.m3u$/','/\.M3U$/','/_/'];
$replaceTo   = ['','',' '];

// enter your IP here
  $ip = '192.168.1.10';
// 

$sonos = new SonosAccess($ip);

print "saved:\n";
foreach ((new SimpleXMLElement($sonos->BrowseContentDirectory('SQ:')['Result']))->container as $container) {
   print "- \"" . $container->xpath('dc:title')[0] ."\"\n";
}

print "\nimported:\n";
foreach ((new SimpleXMLElement($sonos->BrowseContentDirectory('A:PLAYLISTS')['Result']))->container as $container) {
  print "- \"" . preg_replace($replaceFrom, $replaceTo, $container->xpath('dc:title')[0]) . "\"\n";
}

print "\nfavories:\n";
foreach ((new SimpleXMLElement($sonos->BrowseContentDirectory('FV:2')['Result']))->item as $item) {
print "- \"" . preg_replace($replaceFrom, $replaceTo, $item->xpath('dc:title')[0]) . "\"\n";
}

Die Funktion SetPlaylist macht eigentlich genau das Gleiche und schaut ob das was ich hier ausgegeben habe (also zwischen den Anführungszeichen) gefunden wird.
Wenn ja, wird es gesetzt.

Nun ja, da scheiden sich die Geister.
Wenn Du etwas setzen willst, was es nicht gibt, dann ist das meiner Meinung nach schon eine Exception wert.
Auch wenn Du einen Player ansteuerst, der nicht erreichbar ist.

Welches Verhalten würdest Du Dir denn vorstellen?

Gruß,
Thorsten

Vielen Dank für den Code, das hilft ungemein weiter. Genau das meinte ich.

Zu den Exceptions:
ich würde mir wünschen, dass z.B. SNS_SetPlaylist(…) mir true oder false zurückgibt - je nachdem, ob die Playlist gefunden wurde oder nicht. Das wäre im Codeteil nur etwas einfacher, denn ich kann dann einfach entsprechend reagieren.

Wenn ich z.B. eine Playlist auswähle und nur starten möchte, wenn die Playlist existiert, dann mache ich das so:

            try{
                SNS_SetPlaylist(22146,$treffer['Playlist']);
            }
            catch (Exception $e) {
                if ($_IPS['SENDER'] == 'Execute') echo 'Exception abgefangen: ',  $e->getCode().": ".$e->getMessage(), "\n";
                exit;
            } finally {
                SNS_Play(22146);
            }

denn die sonos soll auch nur Radau machen, wenn die PL auch existiert und die Sonos auch eingeschaltet ist. Ich müsste eigtl. jeden SNS_ Befehl mit try so capseln, um die Exceptions auszublenden, oder ? Die zernageln mir nämlich immer das Webfront. Ich weiß nicht, ob ich die Exceptions generell unterdrücken kann - das geht wohl auch - aber eigtl. möchte ich ja darauf ja reagieren, oben in dem Beispiel eben nur die Sonos starten, wenn das Laden der PL ging. Sonst spielt die die Playlist meiner Frau und mein Morgen ist dahin…

Da dachte ich, so etwas wie:

if (SNS_SetPlaylist(22146,$treffer[‚Playlist‘])) SNS_Play(22146);

wäre ganz nett, aber die SNS_ Befehle geben leider immer ein false zurück, auch wenn die Playlist da ist.

Ich weiß gar nicht, wie die anderen die Exceptions abfangen. Geht es geschickter?

Hallo Thorsten,

ich hoffe, ich werde nicht zu penetrant, aber gerade macht es Spaß, mit deinem Modul neue Features zu proggen. Boldy prog, where …

Zum Thema: Ich hätte da noch aktuelle Wünsche, vielleicht kannst du die noch bei Gelegenheit aufnehmen. Es sind Funktionen, die ich zwar aus der Klasse auch aufrufen kann, aber schöner ist es natürlich in deinem Modul.

  1. Die Funktion GetPositionInfo() aus der class liefert u.a. auch die TrackNUMMER aus der Playlist. Könntest du die noch bei den detailed Infos als Integer aufnehmen ?

  2. Außerdem gibt die Klasse noch ein Settrack(…) her. Es wäre toll, wenn es auch eine Fkt. SNS_SetTrack(…) gäbe.

Zum Hintergrund: Ich möchte bei der Auswahl einer Playlist gerne dort weiterspielen, wo ich zuletzt aufgehört habe. Das ist auch für Hörbücher sehr praktisch.

Natürlich helfe ich auch gerne mit und erstelle einen pull request, wenn du das möchtest.

Hallo,
ich bin fast am verzweifeln. Seit tagen versuche ich mp3-Files über die Sonos One oder auch Beam abzuspielen, es gelingt mir einfach nicht. Mittlerweile habe ich festgestellt, das wenn das Fernsehen über die Boxen läuft und ein mp3-File startet das dann die betroffene Box die Fernsehübertragung aussetzt und nach Ende der mp3-Nachricht wieder startet??? Vom mp3-File ist aber nichts zu hören. Es gibt aber auch keine Fehlermeldungen. Ich habe schon mehrere Möglichkeiten versucht, aber alles ohne Erfolg.

<? //SNS_PlayFiles(47871, '["http://172.16.1.198:377/MP3/Meldung.mp3"]', "60"); //SNS_PlayFiles(47871, json_encode(Array("//172.16.1.198/MP3/Meldung.mp3")), 60); //SNS_PlayFiles(47871 /*[Sonos\Hobbyraum]*/, json_encode(Array( POLLY_saveMP3(38870 /*[AWSPolly\Polly]*/, "Hier ist der Text")), 50 )); //SNS_PlayFiles(47871,json_encode( Array("http://172.16.1.198:3777/MP3/Meldung.mp3", "60")));// // SNS_PlayFiles(47871, "[\"http://172.16.1.198:3777/MP3/Meldung.mp3\"]","30"); Ich habe schon mehrfach alles gelöscht und neu installiert und habe dadurch in der Gruppenauswahl mehrere Boxen drin owohl ich nur 3 Stück habe!

Hallo zusammen,

irgendwie stehe ich gerade auf dem Schlauch und komme mit der Doku nicht weiter…
Wie finde ich heraus welche Mitglieder es in einer Gruppe gibt bzw. wie deren InstanceID lautet?

Gemäß Doku sollte es eine Variable „GroupMembers“ geben, diese gibt es bei jedoch nicht, genauso wie die Variable „Coordinator“

kann mir hier jemand auf die Sprünge helfen?

Gruß, Adrian

Habe gerade gesehen es gibt 2 Sonos Module, beim neuen steht dabei die beiden Variablen wurden als Attribute modelliert, was bedeutet das, bzw. wie komme ich an die Informationen in den Attributen dran?

Gruß,

Hallo,

das hört sich für mich stark danach an, als wenn die SONOS Boxen nicht auf http://172.16.1.198:3777/MP3/Meldung.mp3 zugreifen können.
Hast Du mal verifiziert, dass das geht? Es muss ohne Passwort möglich sein.

Manchmal hilft es auch die SONOS App bei dem Versuch geöffnet zu haben, denn dann werden evtl. noch Fehlermeldungen ausgegeben…

Gruß,
Thorsten

Hallo,

Dies auszulesen geht derzeit nur über die Funktion alexaResponse( ), die aber eigentlich dazu gedacht ist von Alexa konsumiert zu werden…

Die größere Frage ist für mich aber eher, wozu Du dies brauchst…
Vielleicht kann man Dein gewünschtes Ziel auch anders erreichen.

Gruß,
Thorsten

Hallo Thorsten,

ich möchte auslesen wer in einer Gruppe ist um herauszufinden an wen ich das Koordinator recht weiter geben kann um den Koordinator aus der Gruppe zu entfernen.

Mit SetGroup kann ich nur member entfernen.

Gruß

Hallo Thorsten,
ich habe es jetzt nochmal versucht und die App auf dem Tablett an gehabt. Hier erscheint aber die auszugende Datei, ist aber nicht zu hören!

SNS_PlayFiles(26513, ‚[„http://xxx.xxx.1.98:3777/C:/MP3/Meldung.mp3“]‘, „60“);


Es gibt keine Fehlermeldung.

Danke Alfred

Hallo,

also das sieht mir doch sehr seltsam aus.
Du hast unter dem Webserver ein Verzeichnis „C:“?!
Falls das ein Windows Host ist, geht das meines Erachtens garnicht.

Was passiert denn, wenn Du die URL „http://xxx.xxx.1.98:3777/C:/MP3/Meldung.mp3“ in einen Browser Deiner Wahl (am besten auf einem anderen Rechner als Deinem IPS Host) eingibst? Öffnet sich dann die Datei?

Es kann natürlich nur das abgespielt werden, was auch erreicht werden kann…

Gruß,
Thorsten

Hay, habs mal probiert! Ohne „C:“ erhalte ich folgende Meldung:
Mp3

Wenn ich die Datei direkt anklicke, wird diese aber auf dem Rechner ausgegeben?

Alfred

Hallo,

ich habe mal eine neue Version im Beta bereitgestellt.

Ist beides enthalten.
Es gibt jetzt eine Variable „Track“, die automatisch gefüllt wird. Allerdings steht da z.B: bei einem Stream dann eine 1 drin…
Mit SNS_SetTrack(>ObjectID<, >Track<) kann man jetzt zu einem Track springen.

Hierfür gibt es jetzt die Funktion SNS_GetMembers( >ObjectID< );, die ein JSON Array mit allen Membern zurückliefert.

Wenn ihr mir Rückmeldung gebt, dass es gefällt, packe ich es in die Stable.

Gruß,
Thorsten

Hallo,

Du musst einen Link haben, auf den die Sonos Boxen zugreifen können. Und die machen eigentlich nix anderes, als der Browser.

Du hast unter Deinem Installationsverzeichnis von Symcon ein Verzeichnis „webfront“.

Bei mir habe ich darunter die Verzeichnisstruktur „webfront/user/sonos/temperatur“ angelegt.
In diesem Verzeichnis liegen ganz viele MP3 Dateien.
Die kann ich mit

SNS_PlayFiles(34403, "[\"http://nas.fritz.box:3777/user/sonos/temperatur/".GetValuefloat(23851).".mp3\"]","+5");

abspielen.
=> mach Dich doch mal auf die Suche nach dem webfront Verzeichnis bei Dir, lege da eine Datei ab und versuch es nochmal.

Gruß,
Thorsten

Habs jetzt mehrmals versucht, komme aber zu keiner Ausgabe…

Was hast du denn genau ausprobiert?

Der Vorschlag von Torsten war ja, eine Datei zum Test ins Webfront/User Verzeichnis zu legen und die in der Sonos App abzuspielen.

Wenn das klappt, dann geht es auch über SNS_PlayFiles.

Hallo zusammen,

@Kugelberg die Funktion klappt super danke :slight_smile:

Ich versuche aktuell über einen Taster einen Player aus einer Gruppe zu nehmen, hierzu habe ich mir 2 Funktionen angelegt:

function isCoordinator($devices)
{
    foreach ($devices as $value)

    {
        $Coordinator = SNS_IsCoordinator($value);
                if ($Coordinator == true)
        {
            $test = $value;
            //IPS_LogMessage("SONOS-Control", "Es wurde eine aktive Sonos Gruppe gefunden, Koordinator der Gruppe ist " .IPS_GetName($activeGroup));
            return $test;
            break;
        }
}
}



function leaveGroup($devices, $player)


{

    $Coordinator = isCoordinator($devices);
    $members = SNS_GetMembers($Coordinator);
    $list = json_decode($members, true);
    $newCoordinator = $list[0];
    SNS_DelegateGroupCoordinationTo($Coordinator, $newCoordinator, 0);
}

Das klappt soweit ganz gut, allerdings wenn nur noch 2 Player in der Gruppe sind bekomme ich folgenden Fehler im Skript:

Fatal error:  Uncaught TypeError: asort() expects parameter 1 to be array, null given in /var/lib/symcon/modules/.store/de.kugelberg.sonos/SonosPlayer/module.php:1136
Stack trace:
#0 /var/lib/symcon/modules/.store/de.kugelberg.sonos/SonosPlayer/module.php(1136): asort(NULL)
#1 /var/lib/symcon/scripts/__generated.inc.php(3247): SonosPlayer-&gt;DelegateGroupCoordinationTo(28721, false)
#2 /var/lib/symcon/scripts/29064.ips.php(84): SNS_DelegateGroupCoordinationTo(15723, 28721, 0)
#3 /var/lib/symcon/scripts/29064.ips.php(14): leaveGroup(Array, 15723)
#4 {main}
  thrown in /var/lib/symcon/modules/.store/de.kugelberg.sonos/SonosPlayer/module.php on line 1136

Weiß jemand wo mein Fehler liegt, oder hat Verbesserungsvorschläge zu den Funktionen?

Grüße,

Hallo,

jupp, definitiv ein Fehler bei mir.
Wenn man ein Array sortiert, sollte man auch dafür sorgen, dass es da ist…

Habe ihn grade behoben und im Beta gepublished.
=> Mach mal ein Update, dann sollte er weg sein.

Gruß,
Thorsten