Sonos Modul

Hallo Thorsten,

SNS_PlayFiles() pausiert ja die aktuelle Wiedergabe, spielt die mitgegebene Datei ab und setzt dann die Wiedergabe fort. Soweit funktioniert es auch perfekt.

Nun passiert es aber bei mir ab und zu, dass zwei SNS_PlayFiles() recht dicht hintereinander folgen. Ich habe es zwar mit Semaphoren abgesichert sodass sie sich nicht ins Gehege kommen sollten, aber dennoch passiert es dann, dass nach dem zweiten Abspielauftrag die Wiedergabe nicht wieder aufgenommen wird.

Es sieht so aus, als ob der zweite Auftrag nicht mitbekommt, dass nach dem ersten Auftrag eine Wiedergabe gestartet wurde. Siehst du eine Möglichkeit, dass zu verbessern? Oder hättest du einen Tipp, wie lange und worauf ich eventuell nach dem ersten Auftrag warten müsste, bis ich den nächsten Auftrag starte?

Für SNS_PlayFilesGrouping() gilt das gleiche entsprechend.

Burkhard

Edit:

für SNS_PlayFiles() könnte die Lösung so aussehen (ab Zeile 1407):


        // If it was playing before, play again
        if ($transportInfo == 1) {
            $this->SendDebug(__FUNCTION__ . '->sonos', 'Play()', 0);
            $sonos->Play();
            for ($i = 0; $i < 10; $i++){
                $transportInfo = $sonos->GetTransportInfo();
                //$this->SendDebug(__FUNCTION__ . '->sonos', sprintf('TransportInfo: %s', $transportInfo), 0);
                if ($transportInfo !== 1){
                    IPS_Sleep(300);
                } else {
                    break;
                }
            }
        }

Moin Thorsten,

kannst Du bitte bei Gelegenheit den AMP hinzunehmen:rolleyes:

sonos amp.JPG

Besten Dank !

Ciao
HerbertF

Hallo,

Das ist in der Tat ein Problem.
Aber: Wenn die erste Ausführung schon läuft, liest die zweit die aktuellen Daten aus.
Wenn also die erste schon pausiert hat, stellt die zweite diesen zustand wieder her.
Und wenn die abzuspielende Datei von der ersten Ausführung schon eingestellt ist, wird diese von der zweiten „fortgesetzt“…

Oder meinst Du, dass es zu lange dauert, bis die Wiedergabe wirklich läuft?
Stimmt, dann würde Dein Code helfen…

Ich habe es mal aufgenommen.
So ein richtig gutes Gefühl habe ich dabei aber nicht. Vor allem bei „SNS_PlayFilesGrouping()“ kann das schon die Ausführung verzögern. Und dann kommt der Timeout immer näher :eek:

Gruß,
Thorsten

Guten Morgen zusammen,

ich komme mit folgendem Anliegen, in der Hoffnung, dass ihr mir helfen könnt:

Ich habe über das Sonos Modul mehrere Speaker eingebunden, welche ich über KNX mit IPS steuere.

Nun habe ich - bevor meine Subscription in 10 Tagen ausläuft - das IPS Update auf 5.5. gemacht.

Durch das Update gingen nun scheinbar die Verbindungen verloren. im Objektbaum taucht bei jedem Speaker ein rotes Ausrufezeichen auf, mit dem Hinweis „diese Instanz wurde nicht erstellt“.

Gehe ich mit Doppelklick auf den Speaker kommt die Fehlermeldung

„Konnte Konfigurationsform nicht laden
Instanz hat diese Funktion nicht implementier (Code: -32603)“

Wenn ich die Sonos Discovery starte, fügt er mir meine Speaker neu hinzu.

Nun zu meiner Frage:
Gibt´s ne einfache Möglichkeit, die Alten Instanzen durch die neuen zu ersetzen oder muss ich in sämtliche Skripte die Verknüpfungen neu einstellen?

Vielen, vielen Dank!

Grüße Mathias

Hallo,

das ist sehr seltsam.
Bei meinem update auf 5.5. was das kein Problem.
Auch wenn ich diesen Satz hasse: „Hast Du mal durchgestartet?“
Das scheint ja so, als wenn das Modul nicht richtig geladen wurde…

Gruß,
Thorsten

Hallo Thorsten, vielen dank für dein Feedback.
Wenn du mit „Durchstarten“ nen Neustart des Systems meinst, dann hab ich das gerade probiert, inkl. Beenden des Dienstes vorab.
Brachte leider keinen Erfolg… :confused:

Grüße

Hallo Thorsten,
ich habe immer wieder mit folgender Fehlermeldung zu kämpfen. Sonos Version ist 1.08

12.11.2020, 09:19:57 | ScriptEngine | Result for Event 28486
<br />
<b>Fatal error</b>: Uncaught Exception: Error during Soap Call: UPnPError s:Client 800 (UNKNOWN) in /var/lib/symcon/modules/SymconSonos/Sonos/sonosAccess.php:577
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/Sonos/sonosAccess.php(193): SonosAccess->processSoapCall(’/MediaRenderer/…’, ‚urn:schemas-upn…‘, ‚GetRemainingSle…‘, Array)
#1 /var/lib/symcon/scripts/28466.ips.php(245): SonosAccess->GetSleeptimer()
#2 {main}
thrown in <b>/var/lib/symcon/modules/SymconSonos/Sonos/sonosAccess.php</b> on line <b>577</b><br />

Hallo,

das ist noch die alte alte version des Moduls, und ich tippe mal, dass das Script 28466 _updateStatus von einem Deiner Player ist.

Da wird in Zeile 245 folgendes Aufgerufen:

$sleeptimer = $sonos->GetSleeptimer();

Das wirft beim Aufruf nach SONOS eine SOAP Exception. Ich tippe mal, weil dieser Player keinen Sleeptimer unterstützt.
Schau mal zu welchem Player das script gehört und und konfiguriere den „Sleeptimer Control“ weg. Dann sollten die Dumps verschwinden.

Gruß,
Thorsten

Edit: Ach ja, und ein Wechsel auf die neue Version aus dem Store würde auch nicht schaden :wink:

Ich bin mir nicht sicher, ob wir vom gleichen Fall sprechen :slight_smile:
Mein Szenario:

  • es läuft z.B. Radio
  • nun schicke ich eine Sprachdurchsage (SNS_PlayFiles())
  • wenn die Funktion zurückkommt schicke ich die nächste Sprachdurchsage

Genau. Bei der zweiten Sprachdurchsage läuft die Wiedergabe des Radios noch nicht wieder komplett. SNS_PlayFiles stößt zwar die Wiedergabe an, aber der Zustand transportinfo == 1 ist noch nicht erreicht und somit merkt sich die zweite Aufruf von SNS_PlayFiles den falschen Zustand.

Super. Besten Dank.

Die Verzögerung bei mir beträgt ungefähr 1,5 Sekunden. Ich denke, das ist noch nicht kritisch.

Ein anderer kleiner Fehler ist mir noch aufgefallen. In Zeile 2018 ist $container nicht definiert:

    $this->SendDebug(__FUNCTION__ . ': Found radio', (string) $container->xpath('dc:title')[0], 0); 

Hier muss es wohl $item heißen. Vielleicht kannst du dir das auch noch ansehen.

Burkhard

Um das Zeit verhalten von Sonos in den Griff zu bekommen habe ich mir einen Message Hub geschrieben über den alle Sprach Nachrichten geroutet werden. Der Hub verzögert und falls notwendig limitiert Nachrichten um eine Überlastung von Sonos zu verhindern.

Sent from my Pixel 4 using Tapatalk

Moin Thorsten,

besten Dank für den AMP.

Ciao
HerbertF

Hi,

Wäre das etwas um es ins Modul zu integrieren?

Aktuell habe ich mit PlayFiles auch noch das Problem, dass ich alles in einer Funktion mache.
=> Wenn die Dateien zu lang sind läuft man in den 30 Sekunden timeout, da ich per Sleep darauf warte dass das Abspielen fertig ist.

Wenn ich es aber über einen Timer lösen würde, könnte man nicht darauf warten dass es fertig ist.

Da wäre eine Play Files „Queue“ ja nicht schlecht, zusammen mit einer Funktion um zu fragen/warten bis die Queue abgearbeitet ist…
Dann könnte man aber nur ein „PlayFiles“ gleichzeitig machen…

Irgendwer eine Gute Idee wie man das machen könnte?
Oder ob jemand ganz dringend braucht, dass 2 PlayFiles gleichzeitig laufen (also auf verschiedenen Playern)?

Danke,
Thorsten

Moin,

Nun ja, 1,5 von 30 Sekunden ist schon kein so wirklich kleiner Anteil.
Und wenn ich mir dass PlayFilesGrouping anschaue, kann das ja mehrfach vorkommen.

=> Ich denke ich muss mir noch ein richtiges Konzept für diese Funktionen machen und es Umbauen.
Vielleicht nur noch eine Funktion, und die dann am Spitter oder so. Wäre aber auch nicht schön.

Jupp, klassischer copy&paste Fehler.

Danke,
Thorsten

Moin,
ich habe sporadisch diese Meldung:

25.11.2020, 08:44:29 | TimerPool | Sonos Splitter (Sonos Update Grouping): <br />
<b>Fatal error</b>: Uncaught Exception: Der Koordinator ist nicht als Symcon Instanz konfiguriert. Das kann nicht funktionieren. in /var/lib/symcon/modules/.store/de.kugelberg.sonos/SonosSplitter/module.php:439
Stack trace:
#0 /var/lib/symcon/scripts/__generated.inc.php(271): SonosSplitter->updateGrouping()
#1 /-(1): SNS_updateGrouping(32066)
#2 {main}
thrown in <b>/var/lib/symcon/modules/.store/de.kugelberg.sonos/SonosSplitter/module.php</b> on line <b>439</b><br />

Alle meine Sonos Lautsprecher sind in IPS eingebunden, von daher kommt mir diese Meldung etwas komisch vor.

Gibt es da einen Anhaltspunkt, wo ich suchen könnte?

Hallo,

also:
Wenn ich die Gruppen update passiert folgendes:
Per SendDataToChildren( ) werden alle Instanzen kontaktiert:


        return $this->SendDataToChildren(json_encode([
            'DataID'         => '{36EA4430-7047-C11D-0854-43391B14E0D7}',
            'type'           => 'getProperties',
            'targetInstance' => null
        ]));

Da werden wirklich nur properties zurückgeliefert:


                $result = [
                    'instanceID'    => $this->InstanceID,
                    'IPAddress'     => gethostbyname($this->ReadPropertyString('IPAddress')),
                    'RINCON'        => $this->ReadPropertyString('RINCON'),
                    'TimeOut'       => $this->ReadPropertyInteger('TimeOut')
                ];
                 return json_encode($result);

Wenn ich in dieser Liste die RINCON des Koordinators nicht finde, genau dann kommt diese Meldung.

Jetzt gibt es 3 mögliche Ursachen:

  1. Der Player existiert wirklich nicht => hast Du ja schon ausgeschlossen
  2. Die eingetragene RINCON ist falsch => halte ich für sehr unwahrscheinlich. Die wird an sehr vielen Stellen verwendet und kann sich nicht ändern.
  3. SendDataToChildren() liefert sporadisch nicht alle Kinder zurück

Zur dritten Möglichkeit kann ich nichts sagen.
Allerdings verlasse ich mich auch an anderen Stellen darauf, dass ich immer alle Child Instanzen zurückbekomme.
@SYMCON: Kann das vorkommen? Wenn ja unter welchen Umständen?

Gruß,
Thorsten

Guten Abend zusammen,

in der Splitter Instanz kann ich ja Radiosender speichern mit Name, URL und Cover. Das funktioniert soweit auch sehr gut.
Auch SNS_SetTransportURI klappt wunderbar, aber leider wird dann natürlich kein Titel gesetzt.

Wäre es evtl. möglich eine Funktion zur Verfügung zu stellen, der man URL und Name übergeben kann, so dass dieser auch im Sonos-System angezeigt wird?

Moin,

das musst Du genauer spezifizieren.
Mit SNS_SetTransportURI kann man ja alles mögliche setzen. Also nicht nur einen Stream, sondern z.B: auch die Gruppenzugehörigkeit, etc.
Und da macht es wenig Sinn einen „Titel“ zu setzen.

Dem SetAVTransportURI von Sonos, was hier eigentlich nur aufgerufen wird, kann man Metadaten mitgeben.
Bei einem Radiosender ist dies z.B.


<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="-1" parentID="-1" restricted="true">
    <dc:title>Hier kommt der Titel</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>

Keine Ahnung wie richtig das ist, es funktioniert zumindest. Bei anderen Implementierungen habe ich gesehen, dass [ id="-1" parentID="-1" ] dynamisch vergeben wird, ansonsten machen die das gleich…

Also: Wenn es Dir lediglich um einen „audioBroadcast“ geht, könnte ich relativ einfach eine Funktion anbieten, die eigentlich genau das macht, was SNS_SetRadio macht… Folgende Namen würden mir einfallen:

  • SNS_SetStream
  • SNS_SetRadioManual
  • SNS_SetAudioBroadcast

Gruß,
Thorsten

Ah, ok. Danke Thorsten.
Mir war nicht bewusst, dass sich mit dieser Funktion noch mehr machen lässt. Dann hätte ich präziser gefragt… :slight_smile:

Genau, es geht mir lediglich darum, eine Funktion zu haben, um eine Audio-Stream-URL anzugeben und einen Titel mitzugeben (so wie es bei Deinem Modul bereits im Hintergrund passiert, wenn man einen der gespeicherten Radio-Streams aufruft).

Falls Du so eine Funktion irgendwann mal einbauen könntest, wäre das echt klasse. :slight_smile:

Ich vermute, dass man das Cover-Bild nicht auch an das Sonos-System schicken kann, sonst hättest Du das vermutlich bereits implementiert?

Kannst Du mir die Fehlermeldung erweitern, sodass die RINCON, die dann erwartet wird, mit ausgegeben wird? Ich glaub, das wäre hilfreich.

Grüße,
Christoph

Guten Abend,

ich habe heute mein IPS auf einen neuen Pi übersiedelt und bekomme nun folgende Fehlermeldung wenn ich eine Sprachausgabe machen möchte:

$timestamp = time();    $uhrzeit = date("H:i", $timestamp);
    
     $pfad=POLLY_saveMP3(26374, "<speak>Es ist jetzt ".$uhrzeit." Uhr</speak>");
   

SNS_PlayFilesGrouping(26662, json_encode([25480 => ['volume' => 45],   
                      24862 => ['volume' => 40] 

                             ]), json_encode(['//10.0.0.170/SambaIpsymcon/Sounds/Ansagen-Gong9.wav', $pfad]), 40);    
Fatal error:  Uncaught Exception: Error during Soap Call: UPnPError s:Client 701 (ERROR_AV_UPNP_AVT_INVALID_TRANSITION) in /var/lib/symcon/modules/.store/de.kugelberg.sonos/libs/sonosAccess.php:758Stack trace:
#0 /var/lib/symcon/modules/.store/de.kugelberg.sonos/libs/sonosAccess.php(428): SonosAccess->processSoapCall('/MediaRenderer/...', 'urn:schemas-upn...', 'Play', Array)
#1 /var/lib/symcon/modules/.store/de.kugelberg.sonos/SonosPlayer/module.php(1524): SonosAccess->Play()
#2 /var/lib/symcon/scripts/__generated.inc.php(2179): SonosPlayer->PlayFilesGrouping('{"25480":{"volu...', '["\\/\\/10.0.0.17...', '40')
#3 /var/lib/symcon/scripts/31417.ips.php(13): SNS_PlayFilesGrouping(26662, '{"25480":{"volu...', '["\\/\\/10.0.0.17...', 40)
#4 {main}   thrown in /var/lib/symcon/modules/.store/de.kugelberg.sonos/libs/sonosAccess.php on line 758

So siehts im Windows Explorer aus:

Kann mir bitte jemand helfen? Musik spielen über Sonos via IPS funktioniert einwandfrei.

Die mp3 Datei mit Polly legt er ordnungsgemäß ab.

Dieses Skript funktioniert auch:

$volume_wecker = GetValue(47351);
$timestamp = time();
$uhrzeit = date("H:i", $timestamp);
$datum = date("d.m.Y", $timestamp);

    // Playlist aus SONOS App
    $name = "Wecker Musik";
    //$Sonos_ID = "33638"; // Eltern Schlafzimmer
    // $Sonos_ID = "25480"; // Gästebad
    $Sonos_ID = "26662"; // Esszimmer

    SNS_SetVolume($Sonos_ID, 0);
    SNS_SetGroup($Sonos_ID, 0);
    SNS_SetPlaymode($Sonos_ID, 4);
    SNS_RampToVolume($Sonos_ID, 1, $volume_wecker);
    SNS_SetPlaylist($Sonos_ID, $name);

    SNS_Play($Sonos_ID);