Sonos Modul

Guten Abend in die Runde! Ich weiß noch nicht genau, ob ich mit meinem Wunsch hier richtig bin, aber ich hätte da einen Feature Request :slight_smile:
Ich habe unter anderem eine Sonos Roam SL. Das Modell gibt es zwar noch nicht in der Modell-Liste (wird als ‘Roam SL’ erkannt), als Modell ‘Roam 2’ funktioniert sie aber trotzdem. Da das Gerät einen Akku hat und somit nicht permanent mit Strom versorgt wird, ist das Gerät wirklich nicht zu erreichen, wenn man es ausschaltet. Sprich der Versuch, einen Befehl gegen das Gerät auszuführen, führt nach Millisekunden zu einer Fehlermeldung. Das kann ich zwar abfangen, aber ich empfinde das trotzdem als unelegant. Deshalb frage ich aktuell erst die IP Adresse des Geräts mit sys_ping() ab, bevor ich einen Befehl ausführe. Leider hat das den Nachteil, dass ich beim sys_ping() die IP Adresse kennen muss bzw. hart im Code codiere. Gibt es da vielleicht eine Möglichkeit, dass für die Roam-Modelle eine zusätzliche Bool-Variable eingeführt wird, in der alle X Sekunden die Erreichbarkeit geprüft wird? Dann könnte ich auf deren Status prüfen…

VG

Die IP Adresse ist doch im Sonos Objekt.

Hallo,

Ist ja schon gut, ich habe „Roam SL“ gerade hinzugefügt.

Aber genau das ist doch, was ich in dem Modul mache.

Die Host (oder die IP) is an der Instanz als Property ‚IPAddress‘ abgelegt.
Und immer wenn mit der Box gesprochen werden soll passiert folgendes:

  • check auf „vanished“ (siehe unten) → wenn ja „throw new Exception“
  • Properties ( ‚IPAddress‘ und ‚TimeOut‘) auslesen
  • Hostnamen in IP umwandeln
  • Sys_Ping($ip, $timeout) ; Wenn nicht erreichbar, ein zweites Mal versuchen; dann „throw new Exception“
  • danach wird erst die Box angesprochen.

Nun ja, und wenn ich einen Fehler feststelle, muss ich ihn rausgeben.
Und das Mittel der Wahl ist nunmal eine Exception.

Ehrlich gesagt finde ich das alles andere als unelegant.
In einem ordentlichen script gehört Fehlerhandling dazu. Und somit sollte jeder Sonos Call in einen try/catch block rein.
Dann kann man selber entscheiden, was man macht.

Beim update grouping kommt ein „vanished“ zurück. Wenn das auf true sitzt, setze ich das Attribute ‚Vanished‘ aud true.
Leider dauert das immer ein wenig, bis es im sonos System gesetzt wird und das Grouping frage ich auch relativ selten (alle 2 Minuten) ab…

Klar könnte ich im Update Status (läuft alle 5 sekunden) der einzelnen Boxen eine solche variable setzen.
Aktuell mache ich da folgendes:

        try {
            $sonos = $this->getSonosAccess(false);
        } catch (Exception $e) {
            return;
        }

Aber da hätte ich mehr angst vor false positives, wegen eines instabilen WLans.

Gruß,
Thorsten

Ich hab’ die IP jetzt mittels IPS_GetObject() in dem Attribut ‘ObjectSummary’ gefunden. Muss zwar noch etwas zurechgetrimmt werden, aber das passt schon. Vielen Dank!

Vielen Dank! :slight_smile:

Der Punkt ist berechtigt. Ich hab’ jetzt deinen Vorschlag mit dem try/catch genommen, hätte ich auch selber drauf kommen können….

Ich habe jetzt mein Sonos Setup um einen Arc Ultra erweitert. Im Grunde funktioniert alles so, wie ich es erwartet/erhofft habe. Danke nochmals für das Modul.

Aber eine Frage hätte ich da noch: Kann man irgendwie in IPS erkennen, ob der Arc aktuell wirklich etwas wieder gibt?

Ich sehe, wenn der TV an ist und der Arc spielt keinen wirklichen unterschied in den Daten dazu, das der TV aus ist. Es wird immer “PLAY” im Status angezeigt. Auch “gerade läuft” oder dergl. ändert sich nicht. Die Sonos App erkennt es (zeigt es durch ein Icon an).

SNS_updateStatus usw. hat leider nichts gebracht.

Kann man ansonsten Streaming (irgendwas) und HDMI als Zuspielung unterscheiden?

Ich versuche gerade, mir das Bild eines abgespielten Radiosenders anzeigen zu lassen. Leider bleibt das Bild leer.

Die Sender habe ich in der Splitter Instanz eingelesen und dort stimmen auch die Bild URLs:

Will ich nun auf einen Sender umschalten, dann wird zwar das Medienobjekt geändert,

aber der Inhalt nicht gesetzt. Auch existiert die Datei media/41787.jpg nicht.

Hat jemand eine Idee, was ich falsch mache, bzw. was falsch laufen könnte?

Im Debug finde ich leider keinen Hinweis:

Wird es den in der Konsole angezeigt?

Das kann korrekt sein, sofern das Medienobjekt den Cache nutzt und du Symcon seit dem anlegen nicht mehr (sauber) beendet hast.

Auf die Datei würde ich eh nicht was geben, sondern ausschließlich mit IPS_GetMediaContent arbeiten.
Michael

Danke für deine Unterstützung!

In der Konsole wird das Bild auch nicht angezeigt.

Inzwischen bin ich etwas weiter gekommen. Bei einem anderen Sender (1Live) funktioniert es.:open_mouth:

Auffällig ist, dass die in der Variablen CoverUrl hinterlegte url bei 1Live “https://cdn-profiles.tunein.com/s25260/images/logod.png?t=1” funktioniert. Die bei eingestelltem WDR2 hinterlegte “https://cdn-profiles.tunein.com/s99169/images/logod.png?t=1” dagegen nicht:

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>VW7KEZ3XR2XY160C</RequestId>
<HostId>lAmqRTtZRs8sqWz3o55i35N+jqZ/odF6S9or6gaKtNEyxr1PsZR3GMESQD5vzZagLi5GlCy9RG8=</HostId>
</Error>

Im Splitter ist dagegen “http://cdn-radiotime-logos.tunein.com/s99169q.png” hinterlegt. Die funktioniert, wird aber wohl nicht genommen.

Das gleiche Verhalten habe ich auch und auch damals schon mal hier geschrieben. Gab leider keine Lösung zu.

Wäre super wenn wir das hinbekommen.

Bekomme bei bestimmten Logos auch immer das “AccessDenied”

Ich habe es mir mal intensiver angesehen.
Ich vermute inzwischen, dass in der SonosPlayer/module.php die Funktion UpdateStatus noch nicht ganz korrekt arbeitet.
Dort wird nämlich wenn der Player nicht Mitglied einer Gruppe ist, eine zuvor ermittelte $image Information wieder überschrieben.

Wenn ich die Zeilen ab 2454 auskommentiere, funktioniert es bei mir:

...
                            if ($stationID && $stationID[0] == 's') {
                                /*
                                if (@GetValueString($vidStationID) == $stationID) {
                                    $image = GetValueString($vidCoverURL);
                                } else {
                                    $image = 'https://cdn-profiles.tunein.com/' . $stationID . '/images/logod.png?t=1';
                                }
                                */
                                $playing = '<div><b>' . $positionInfo['streamContent'] . '</b></div><div>&nbsp;</div><div>' . $mediaInfo['title'] . '</div>';
                            } else {
...

Wenn der Player aber Mitglied einer Gruppe ist, dann wird wohl die Mediendatei grundsätzlich nicht aktualisiert.

Vielleicht könnte sich das @Kugelberg einmal ansehen.

Seit dem letzten Update (IPS oder Sonos) habe ich selbst beim Coordinator keine Medienkachel mehr.

Bin ich eigentlich der Einzige, der Sonos mit der Kachel Visu nutzt?

@Dr.Niels was genau sind die Kriterien, wann die Visu eine Medienkachel anbietet? Müssen da bestimmte Variablen eines bestim,ten Profils vorhanden sein?

Nö, hab die Player auch in Kacheln, aber leider größtenteils ohne Cover :wink:

Ja, ist alles in der Doku beschrieben :wink:

1 „Gefällt mir“

… hast du das letzte Update installiert?

Update vom Modul? Ja bin eigentlich aktuell, Symcon auf letzte stable

Eines davon. Bei mir funktioniert es nicht mehr seit meinen letzten updates.

Gerade nochmal geschaut, Sonos-Modul ist die letzte stable (2.8) und IPS ebenfalls letzte 8.1 stable vom 03.09.2025

Damit alles schick bei mir…