Sonos Modul

Ja das bleibt auch so, die Funktion


SNS_alexaResponse($instanceid);

dient lediglich dazu Daten aus dem Modul für Alexa auszulesen, der Rest erfolgt in einem separaten Modul bzw. muss vom Nutzer selber angelegt werden. Eventuell ist der offizielle Sonos Skill ja so gut, dass man das dann alles gar nicht mehr braucht, warten wir es mal ab.

Hi Fonzo,

leider funktioniert es bei mir nicht.

In der Konfiguration habe ich bei „TuneIn Favoriten einschließen“ einen Haken gesetzt. Unter „Radio Stationen Favortiten“ habe ich nichts ausgewählt.

Führe ich nun den Befehl SNS_NextRadiostation… aus, will er immer auf „1LIVE DIGGI“, einen Sender, den ich nicht in meinen Favoriten habe und der bei mir auch nicht funktioniert. Auch wenn ich den Befehl dann noch einmal eingebe, bleibt er auf „1LIVE DIGGI“.

Beim Befehl SNS_PreviousRadiostation… geht er auf „RevivalCult“, einen Sender, den ich nicht in meinen Favoriten habe, der aber zumindest funktioniert. Allerdings muss man zum Abspielen zunächst auf Play gehen. Wenn ich den Befehl SNS_PreviousRadiostation… erneut eingebe, bleibt er bei „RevivalCult“, stoppt aber die Wiedergabe, man muss also erst wieder auf Play gehen.

VG, Götz

Die Funktionsweise ist momentan so, das die im Modul hinterlegten Radiostationen durchgezappt werden. Dazu wird bei laufenden Sender der Stationsname ausgelesen und dann auf den darauf folgende Station umgeschaltet. Daher ist der Array bzw. die Reihenfolge erst mal fest und hat nichts mit Deinen persönlichen Favoriten zu tun. Wenn Du die TuneIn Favoriten durchzappen willst muss ich mal schauen, dann muss man das anders lösen. Allerdings war in dem Beispiel was Du gepostet hattest ja auch ein Reihenfolge im Skript festgelegt.
Ansonsten muss man das dann so gestalten das die Favoriten ausgelesen und abgelegt werden dann könnten wohl auch diese durchgezappt werden. Das war jetzt einfach mal die auf die schnelle Lösung, der Rest geht aber bestimmt auch. Vielleicht fällt ja auch Thorsten dazu noch was ein.

Danke Fonzo.

Allerdings schaltet der Befehl ja offenbar bereits nicht weiter. Sonst müsste von „RevivalCult“ ja zumindest auf „1Live Diggi“ umgeschaltet werden (und umgekehrt). Es bleibt aber trotz Wiederholung des Befehls immer auf dem jeweiligen Sender.

In dem von mir geposteten Beispiel wird die Radiowiedergabe beim Befehl gestartet, bei Wiederholung des Befehls wird der folgende Sender abgespielt usw. Gestoppt wird die Wiedegabe mit Stop bzw. Pause.

Kann ich sonst irgendwie unterstützen?

Nochmal/weiter Danke für die Hilfe…

Ich habe die beiden Funktionen mal angepasst. Es wird jetzt nicht mehr der Radio Station Array benutzt, sondern das Variablenprofil ausgelesen. Dies sollte ja entsprechend den Einstellungen des Nutzer im Modul passend angelegt worden sein. Es wird dann auf die vorherige bzw. folgenden Sender des Variablenprofils umgeschaltet. Ich hoffe das ist das was Du gesucht hast. Kannst ja mal Rückmeldung geben ob das jetzt klappt, musst nur vorher ein Update machen.

Danke, Fonzo.

Mit SNS_PreviousRadiostation geht er nun auf einen TuneInFavoriten-Sender und spielt ihn ab. Bei Wiederholung des Befehls bleibt er entweder bei derselben Radiostation oder gibt mir folgende Fehlermeldung aus:

Fatal error: Uncaught exception ‚Exception‘ with message ‚Error during Soap Call: UPnPError s:Client 800 (UNKNOWN)‘ in /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php:558
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php(376): Sonos\Sonos\SonosAccess->processSoapCall(’/MediaRenderer/…’, ‚urn:schemas-upn…‘, ‚SetAVTransportU…‘, Array)
#1 /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php(486): Sonos\Sonos\SonosAccess->SetAVTransportURI(‚x-sonosapi-stre…‘, ‚<DIDL-Lite xmln…‘)
#2 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1311): Sonos\Sonos\SonosAccess->SetRadio(‚x-sonosapi-stre…‘, ‚Psytrance Power‘)
#3 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1341): Sonos->SetRadio(‚Psytrance Power‘)
#4 /var/lib/symcon/scripts/__generated.inc.php(922): Sonos->PreviousRadioStation()
#5 /var/lib/symcon/scripts/16544.ips.php(3): SNS_PreviousRadioStation(35919)
#6 {main}
thrown in /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php on line 558
Abort Processing during Fatal-Error: Uncaught exception ‚Exception‘ with message ‚Error during Soap Call: UPnPError s:Client 800 (UNKNOWN)‘ in /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php:558
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php(376): Sonos\Sonos\SonosAccess->processSoapCall(’/MediaRenderer/…’, ‚urn:schemas-upn…‘, ‚SetAVTransportU…‘, Array)
#1 /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php(486): Sonos\Sonos\SonosAccess->SetAVTransportURI(‚x-sonosapi-stre…‘, ‚<DIDL-Lite xmln…‘)
#2 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1311): Sonos\Sonos\SonosAccess->SetRadio(‚x-sonosapi-stre…‘, ‚Psytrance Power‘)
#3 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1341): Sonos->SetRadio(‚Psytrance Power‘)
#4 /var/lib/symcon/scripts/__generated.inc.php(922): Sonos->PreviousRadioStation()
#5 /var/lib/symcon/scripts/16544.ips.php(3): SNS_PreviousRadioStation(35919)
#6 {main}
thrown
Error in Script /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php on Line 558

Mit SNS_NextRadiostation geht er nun auf einen anderen Favoriten-Sender und spielt ihn ab. Bei Wiederholung des Befehls bleibt er entweder bei derselben Radiostation oder gibt mir folgende Fehlermeldung aus:

Fatal error: Uncaught exception ‚Exception‘ with message ‚Error during Soap Call: UPnPError s:Client 800 (UNKNOWN)‘ in /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php:558
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php(376): Sonos\Sonos\SonosAccess->processSoapCall(’/MediaRenderer/…’, ‚urn:schemas-upn…‘, ‚SetAVTransportU…‘, Array)
#1 /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php(486): Sonos\Sonos\SonosAccess->SetAVTransportURI(‚x-sonosapi-stre…‘, ‚<DIDL-Lite xmln…‘)
#2 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1311): Sonos\Sonos\SonosAccess->SetRadio(‚x-sonosapi-stre…‘, ‚AcidRadio Chill…‘)
#3 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1324): Sonos->SetRadio(‚AcidRadio Chill…‘)
#4 /var/lib/symcon/scripts/__generated.inc.php(1057): Sonos->NextRadiostation()
#5 /var/lib/symcon/scripts/16544.ips.php(3): SNS_NextRadiostation(35919)
#6 {main}
thrown in /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php on line 558
Abort Processing during Fatal-Error: Uncaught exception ‚Exception‘ with message ‚Error during Soap Call: UPnPError s:Client 800 (UNKNOWN)‘ in /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php:558
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php(376): Sonos\Sonos\SonosAccess->processSoapCall(’/MediaRenderer/…’, ‚urn:schemas-upn…‘, ‚SetAVTransportU…‘, Array)
#1 /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php(486): Sonos\Sonos\SonosAccess->SetAVTransportURI(‚x-sonosapi-stre…‘, ‚<DIDL-Lite xmln…‘)
#2 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1311): Sonos\Sonos\SonosAccess->SetRadio(‚x-sonosapi-stre…‘, ‚AcidRadio Chill…‘)
#3 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1324): Sonos->SetRadio(‚AcidRadio Chill…‘)
#4 /var/lib/symcon/scripts/__generated.inc.php(1057): Sonos->NextRadiostation()
#5 /var/lib/symcon/scripts/16544.ips.php(3): SNS_NextRadiostation(35919)
#6 {main}
thrown
Error in Script /var/lib/symcon/modules/SymconSonos/libs/Sonos/Sonos/SonosAccess.php on Line 558

Auch wenn ich manuell einen Radiosender einschalte, geht er mit SNS_NextRadiostation immer (nur) auf den einen und mit SNS_PreviousRadiostation mmer (nur) auf den anderen Sender. Ein Weiterschalten auf den nächsten oder den vorangehenden Sender aus der Liste erfolgt mit den Befehlen leider nicht… :confused:

Den ersten Sender der Liste (AcidRadio Chill) habe ich nun gelöscht, da er nicht mehr funktionierte. Nun bleibt es bei der Befehlsabsetzung immer noch (nur) bei den beiden Sendern, die bislang mit den beiden Befehlen aufgerufen wurden, oder es kommt folgende Fehlermeldung

bei Next:

Fatal error: Uncaught exception ‚Exception‘ with message ‚Radio station AcidRadio Chill Out is unknown‘ in /var/lib/symcon/modules/SymconSonos/Sonos/module.php:1309
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1324): Sonos->SetRadio(‚AcidRadio Chill…‘)
#1 /var/lib/symcon/scripts/__generated.inc.php(1057): Sonos->NextRadiostation()
#2 /var/lib/symcon/scripts/16544.ips.php(3): SNS_NextRadiostation(35919)
#3 {main}
thrown in /var/lib/symcon/modules/SymconSonos/Sonos/module.php on line 1309
Abort Processing during Fatal-Error: Uncaught exception ‚Exception‘ with message ‚Radio station AcidRadio Chill Out is unknown‘ in /var/lib/symcon/modules/SymconSonos/Sonos/module.php:1309
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1324): Sonos->SetRadio(‚AcidRadio Chill…‘)
#1 /var/lib/symcon/scripts/__generated.inc.php(1057): Sonos->NextRadiostation()
#2 /var/lib/symcon/scripts/16544.ips.php(3): SNS_NextRadiostation(35919)
#3 {main}
thrown
Error in Script /var/lib/symcon/modules/SymconSonos/Sonos/module.php on Line 1309

bei Previous:

Fatal error: Uncaught exception ‚Exception‘ with message ‚Radio station Psytrance Power is unknown‘ in /var/lib/symcon/modules/SymconSonos/Sonos/module.php:1309
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1341): Sonos->SetRadio(‚Psytrance Power‘)
#1 /var/lib/symcon/scripts/__generated.inc.php(922): Sonos->PreviousRadioStation()
#2 /var/lib/symcon/scripts/16544.ips.php(3): SNS_PreviousRadioStation(35919)
#3 {main}
thrown in /var/lib/symcon/modules/SymconSonos/Sonos/module.php on line 1309
Abort Processing during Fatal-Error: Uncaught exception ‚Exception‘ with message ‚Radio station Psytrance Power is unknown‘ in /var/lib/symcon/modules/SymconSonos/Sonos/module.php:1309
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1341): Sonos->SetRadio(‚Psytrance Power‘)
#1 /var/lib/symcon/scripts/__generated.inc.php(922): Sonos->PreviousRadioStation()
#2 /var/lib/symcon/scripts/16544.ips.php(3): SNS_PreviousRadioStation(35919)
#3 {main}
thrown
Error in Script /var/lib/symcon/modules/SymconSonos/Sonos/module.php on Line 1309

Die beiden Sender, die in den Fehlermeldungen in Bezug genommen werden, sind jeweils aus der Liste gelöschte Sender…

Ich habe das jetzt noch nicht ausführlich getestet, aber komisch ist das schon. Wahrscheinlich hängt das davon ab wie schnell Du umschalten willst. Letztendlich macht die Funktion nichts anders als die nächste Station zu suchen und die Methode SetRadio aufzurufen. Daher müsste der gleiche Fehler im Prinzip auftauchen, wenn Du mit einem Skript versuchst schnell hintereinander SetRadio auszuführen.


public function PreviousRadioStation()
    {
        $stationprofile = IPS_GetVariable($this->GetIDForIdent("Radio"))["VariableProfile"];
        $stations = IPS_GetVariableProfile($stationprofile)["Associations"];
        $count_stations = count($stations);
        $valueradio = GetValue($this->GetIDForIdent("Radio"));
        $previouskey = $valueradio-2;
        if ($previouskey < 0)
        {
            $previouskey = $count_stations-1;
        }
        $previous_station = IPS_GetVariableProfile($stationprofile)['Associations'][$previouskey]['Name'];
        $this->SetRadio($previous_station);
        $this->Play();
        return $previous_station;
    }

Wenn ich die Methode mit einem Skript aufrufe und dazwischen Zeit lasse dann funktioniert das bei mir.


<?
$id = 35182 /*[Geräte\Heimkino\Audio\Sonos\Sonos Bad]*/;
$station = SNS_PreviousRadioStation($id);
var_dump($station);
?>

Hier gilt das gleiche wie oben. Die Funktion


public function NextRadiostation()
    {
        $stationprofile = IPS_GetVariable($this->GetIDForIdent("Radio"))["VariableProfile"];
        $valueradio = GetValue($this->GetIDForIdent("Radio"));
        $nextkey = $valueradio;
        if($nextkey > 32)
        {
            $nextkey = 0;
        }
        $next_station = IPS_GetVariableProfile($stationprofile)['Associations'][$nextkey]['Name'];
        $this->SetRadio($next_station);
        $this->Play();
        return $next_station;
    }

setzt lediglich die Methode SetRadio ab. Der Fehler müsste dann also genauso auftreten, wenn Du mehrmals direkt hintereinander die Methode SetRadio aufrufst.

Wenn ich das per Hand ausführe mit Pausen


<?
$id = 35182 /*[Geräte\Heimkino\Audio\Sonos\Sonos Bad]*/;
$station = SNS_NextRadiostation($id);
var_dump($station);
?>

geht das zunächst auch.

Auffällig ist aber wenn ich das Skript direkt hintereinander aufrufe, dann bekomme ich auch eine Fehlermeldung. Das scheint also damit zu tun zu haben wie schnell SetRadio hintereinander aufgerufen wird. Wenn Du die Laufzeit vom Skript anschaust dann dauert es einfach bis auf Sonos über die Methode den nächsten Sender aufgerufen hat. Wenn hier kein Fehler kommen soll müsste man das Ausführen der Methode mit einem Semaphore abfangen und erst dann ausführen wenn der Funktionsaufruf komplett ist. Ein „umschalten“ funktioniert also zumindest bei mir. Ein „Zappen“ (schnelles Durchschalten) geht nicht, da es Zeit braucht bis der nächste Sender aufgerufen wurde, oder willst Du die Funktion nutzten um durch mehrmaliges Drücken zum überübernächsten Sender zu springen?.

Wenn Du etwas änderst musst Du danach ein Update durchführen, damit auch das Modul und Variablenprofil aktuell ist, dazu die Methode SNS_UpdateRadioStations aufrufen.

Bei mir funktioniert immer nur die erstmalige Befehlsabsetzung, dananch kommen - egal wie viel Zeit dazwischen vergeht - immer die beiden Fehlermeldungen aus meinem letzten Post. Offenbar greift der Befehl auf die alte Liste, in der die beiden in den Fehlermeldungen in Bezug genommenen Radiostationen (die ich inzwischen aus der Liste gelöscht habe) noch vorhanden waren, und findet diese nun tatsächlich nicht. Kann die Liste irgendwie „aktualisiert“ werden, um die Fehlermeldungen zu vermeiden?

Sorry, da haben wir uns überschnitten - ich versuche es noch mal…

Also mit Previous funktioniert das Umschalten immer bis zu einem bestimmten Punkt - immer nach derselben Radiostation kommt nur noch die Fehlermeldung

Fatal error: Uncaught exception ‚Exception‘ with message ‚Radio station AcidRadio Chill Out is unknown‘ in /var/lib/symcon/modules/SymconSonos/Sonos/module.php:1309
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1341): Sonos->SetRadio(‚AcidRadio Chill…‘)
#1 /var/lib/symcon/scripts/__generated.inc.php(922): Sonos->PreviousRadioStation()
#2 /var/lib/symcon/scripts/16544.ips.php(3): SNS_PreviousRadioStation(35919)
#3 {main}
thrown in /var/lib/symcon/modules/SymconSonos/Sonos/module.php on line 1309
Abort Processing during Fatal-Error: Uncaught exception ‚Exception‘ with message ‚Radio station AcidRadio Chill Out is unknown‘ in /var/lib/symcon/modules/SymconSonos/Sonos/module.php:1309
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1341): Sonos->SetRadio(‚AcidRadio Chill…‘)
#1 /var/lib/symcon/scripts/__generated.inc.php(922): Sonos->PreviousRadioStation()
#2 /var/lib/symcon/scripts/16544.ips.php(3): SNS_PreviousRadioStation(35919)
#3 {main}
thrown
Error in Script /var/lib/symcon/modules/SymconSonos/Sonos/module.php on Line 1309

Die Station AcidRadio Chill hatte ich gelöscht und die Stationen inzwischen mehrfach mit SNS_UpdateRadioStations… sowie in der Instanz aktualisiert, dennoch die Fehlermeldung.

Bei Next bleibt er immer auf demselben Sender und schaltet gar nicht weiter…

So, ich habe noch einmal sämtliche Boxen aktualisiert - jetzt funktionieren beide Befehle… :wink:

Vielen Dank schon einmal, Fonzo, für Deine unermüdliche Hilfe. Ich werde es mal etwas testen und dann den Pull Request auf den Weg bringen.

Viele Grüße! Götz

Also es sieht nun so aus bei mir:

Previous klappt prima, wenn man ausreichend Zeit zwischen den Befehlen lässt.

Next funktioniert entsprechend, allerdings jeweils nur bis zum letzten Sender der Liste, dann kommt immer folgende Fehlermeldung:

Notice: Undefined offset: 5 in /var/lib/symcon/modules/SymconSonos/Sonos/module.php on line 1323

Fatal error: Uncaught exception ‚Exception‘ with message ‚Radio station is unknown‘ in /var/lib/symcon/modules/SymconSonos/Sonos/module.php:1309
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1324): Sonos->SetRadio(NULL)
#1 /var/lib/symcon/scripts/__generated.inc.php(1057): Sonos->NextRadiostation()
#2 /var/lib/symcon/scripts/16544.ips.php(4): SNS_NextRadiostation(35919)
#3 {main}
thrown in /var/lib/symcon/modules/SymconSonos/Sonos/module.php on line 1309
Abort Processing during Fatal-Error: Uncaught exception ‚Exception‘ with message ‚Radio station is unknown‘ in /var/lib/symcon/modules/SymconSonos/Sonos/module.php:1309
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1324): Sonos->SetRadio(NULL)
#1 /var/lib/symcon/scripts/__generated.inc.php(1057): Sonos->NextRadiostation()
#2 /var/lib/symcon/scripts/16544.ips.php(4): SNS_NextRadiostation(35919)
#3 {main}
thrown
Error in Script /var/lib/symcon/modules/SymconSonos/Sonos/module.php on Line 1309

Da scheint noch etwas anders zu laufen, als bei Previous, wo nach der ersten Listenstation ohne Fehlermeldung die letzte wiedergegeben wird…

VG!

Das mit der Zeit muss man mal schauen, vielleicht weis da kugelberg mehr. Es braucht zumindest Zeit zwischen zwei SOAP Calls sonst kommt wohl ein Fehler.

Ja da war noch ein Fehler drinnen, es können ja auch weniger als 32 Variablenprofile vorhanden sein. Ein Bugfix ist online kannst mal schauen ob Next jetzt auch funktioniert, mit der Einschränkung das Du halt Zeit lassen musst bist Du zum nächsten Sender springen kannst. Reicht das so oder willst Du wirklich eine Taste z.B. 3mal direkt hintereinander drücken? Dann müsste man das anders lösen.

Herzlichen Dank, Fonzo, für Deine Mühe. Es klappt nun auch bei Next und ist im Grunde genau das, was ich gesucht hatte.

Ideal wäre es natürlich, wenn man schneller drücken könnte (das ganze läuft bei mir über HM-Taster in den Einzelräumen), vielleicht fällt ja in der Tat Thorsten noch etwas ein, bis dahin passt das aber so. Dann schaue ich mal, wie ich requeste…

Viele Grüße, Götz

Schau mal ob sonst alles past bzw. Dir eventuell noch was auffällt. Ansonsten muss ich noch das Readme anpassen dann kann ich ein Pull Request machen.

Von meiner Seite passt alles. Danke Dir noch mal.

Ich dachte, ich müsste den PR machen, und es bereits gemacht zu haben. Aber dann wird Thorsten sowieso nur bei Dir reagieren…

Viele Grüße!

Das kannst Du machen wie die Dachdecker, kannst auch selber ein Fork erstellen, die beiden Methoden reinkopieren und ein Pull Request machen. Da bei meinem Fork die Änderungen doch umfassender sind und dieser auch erst ab 4.3 laufen wird muss ich erst mal noch Dinge prüfen und dann mit Thorsten Rücksprache halten ob man da dann einen neuen Branch ab IPS 4.3 aufmacht.

Ich habe jetzt einen Pull Request erstellt, liegt nun an kugelberg ob und was er davon übernehmen will. Es wäre sinnvoll einen neuen Branch anzulegen, einer mit der alten Version und einer mit der Übersetzung. Translate funktioniert erst ab Version 4.3, daher wäre das dann auch erst in der Form ab IP-Symcon 4.3 lauffähig.