Sonos Modul

Schaue ich mir gleich an!

paresy

Mit dem IPS4-Fix von eben werden meine Variablen (ohne Timeout Änderung) wieder brav aktualisiert :slight_smile:

Grüße,
Chris

Moin,

ich spiele gerade mit deinem Sonos Modul und ich bekomme diesen fehler wenn ich versuche das Auszuführen:

SNS_Previous(SONOS_ID);

Fehler:

Fatal error: Uncaught exception 'Exception' with message 'Error sending command: HTTP/1.1 500 Internal Server Error CONTENT-LENGTH: 347 CONTENT-TYPE: text/xml; charset="utf-8" EXT: Server: Linux UPnP/1.0 Sonos/31.3-22220 (ZPS1) Connection: close s:ClientUPnPError' in /usr/share/symcon/modules/SymconSonos/Sonos/sonos.php:728 Stack trace: #0 /usr/share/symcon/modules/SymconSonos/Sonos/sonos.php(418): PHPSonos->sendPacket('POST /MediaRend...') #1 /usr/share/symcon/modules/SymconSonos/Sonos/module.php(549): PHPSonos->Previous() #2 /usr/share/symcon/scripts/__generated.inc.php(70): Sonos->Previous() #3 /usr/share/symcon/scripts/35467.ips.php(28): SNS_Previous(39152) #4 {main} thrown in /usr/share/symcon/modules/SymconSonos/Sonos/sonos.php on line 728

Aber der Sonos tut das was er soll…das letzte Lied wieder spielen.

Hallo,

kannst Du noch mal posten, was Du genau ausführst? Am besten das ganze Script.
In der Funktion Previous( ); wird nichts anderes als dieser Aufruf gemacht.

Wenn ich allerdings bereits das erste Lied der List gespielt wird, bekomme ich auch eine Exception…

Gruß,
Thorsten

Hallo Thorsten,
solche „Internal Server Errors“ bekomme ich gerne mal, wenn der Samba-Mount nicht richtig funktioniert bzw. ein MP3-File dort nicht vorhanden ist. Passt jetzt vielleicht nicht ganz zu dem von Lars gemeldeten Problem, aber vielleicht lässt sich dieser Fehler ja irgendwie abfangen und mit einer aussagekräftigen Fehlermeldung ersetzten.

Gruß
Peter

Moin,

mein Script:

	
//Pfad zur Samba freigabe
$Netzpfad = "//192.168.2.198/sonos/";
//Aufruf aus dem Anrufmonitor Script
	$Name = $_IPS['CALL_Name'];

	$TTS = "Anruf von ". $Name;

	//Abzuspielender Text
	$Text = IVNTTS_saveMP3(24211 /*[I/O\TTS\IvonaTTS]*/,$TTS);

	//Pfad bauen
	$TextArray = explode("/",$Text);
	$Netzpfad .= $TextArray[3];

	//Abspielen
	SNS_PlayFiles(39152 /*[I/O\Sonos\Sonos Bad]*/ ,array($Netzpfad));

	SNS_Previous(39152 /*[I/O\Sonos\Sonos Bad]*/);

Und vorher lief Radio.

Also Radio -> Ansage -> Radio

Hallo,

da sprichst Du was an…
Ich hasse es auch, aber wenn es bei dem Aufruf im Sonos per Soap zu einem Fehler kommt, ist der HTTP Return Code 500 „Internal server Error“. Und das ist es was man zurückbekommt.

Jetzt habe ich aber mal geforscht:
In der Soap Meldung steht kein Fehler im Klartext, nur ein UPnPError und ein dazugehöriger code (z.B.701).

Diesen Code kann man jetzt aber nicht eindeutig auf einen Fehler mappen, denn die kommen mehrfch vor, je nachdem welche „Funktionsgruppe“ iman m Sonos aufruft.

Um das ganze Gelaber abzukürzen:

Ich habe das PHPSonos durch etwas anderes ersetzt. SonosAccess.

Ich habe alle Funktionen über den PHP SoapClient nachgeaut,und muss sagen das es so wirklich einfacher ist! Wen es interessiert, kann ja gerne mal in die sonosAccess.php schauen, es lohnt sich!

Dort habe ich dann ein Mapping der Fehlercodes hinterlegt, wie ich es hier gefunden habe:
UPnPAVError (Windows CE 5.0)

Leider habe ich keine Ahnung, wie gut das ist. Auf jeden Fall besser als vorher. Wenn ich auf dem ersten Titel einer Liste bin und SNS_Previous() aufrufe, kommt dann z.B: diese Exception:


<br />
<b>Fatal error</b>:  Uncaught exception 'Exception' with message 'Error during Soap Call: UPnPError s:Client 711 (ERROR_AV_UPNP_AVT_ILLEGAL_SEEK_TARGET)' in /usr/share/symcon/modules/SymconSonos/Sonos/sonosAccess.php:435
Stack trace:
#0 /usr/share/symcon/modules/SymconSonos/Sonos/sonosAccess.php(264): SonosAccess->processSoapCall('/MediaRenderer/...', 'urn:schemas-upn...', 'Previous', Array)
#1 /usr/share/symcon/modules/SymconSonos/Sonos/module.php(589): SonosAccess->Previous()
#2 /usr/share/symcon/scripts/__generated.inc.php(182): Sonos->Previous()
#3 /usr/share/symcon/scripts/11570.ips.php(3): SNS_Previous(31596)
#4 {main}
  thrown in <b>/usr/share/symcon/modules/SymconSonos/Sonos/sonosAccess.php</b> on line <b>435</b><br />

Allerdings habe ich dafür den Kompletten Zugriff auf die Boxen geändert. Ich hoffe alles richtig getestet zu haben, aber schaut mal, ob noch alles geht.

Weiterhin habe ich mit diesem Update eine inkompatible Änderung gemacht:
SNS_PlayFiles erwartet jetzt einen dritten Parameter.

SNS_PlayFiles($InstanceID,$filesArray,$changeVolume);

$changeVolume kann verschieden angegeben werden:

[ol]
[li]"+10" --> anheben der Laustärke um 10 Prozentpunkte
[/li][li]"-10" --> absenken der Lautstärke um 10 Prozentpunkte
[/li][li]„10“ Setzen der Lautstärke auf 10 Prozent
[/li][/ol]

Wenn es 0 ist, passiert nichts.Bei +10 muss man es als string (also mit innerhalb von Anführungszeichen) übergeben.

Daher:
VORSICHT, inkompatible Änderung!

Gruß,
Thorsten

Hi,

Ich glaube Du hast da etwas fasch vertanden.

  1. ich finde es umständlich, wie Du den abzuspielenden Dateinamen zusammenbaust.
    Trag doch im Ivona Modul ein, dass Dein „access Path“ „//192.168.2.198/sonos/“ ist. dann bekomst Du mit
IVNTTS_saveMP3(24211 /*[I/O\TTS\IvonaTTS]*/,$TTS);

direkt den richtigen Pfad zurück.
Oder gibt es einen Grund für Deine Vorgehensweise?

  1. SNS_Previous() springt in der Titellist einen Titel zurück. Also vergleichbar mit SNS_Next(). Wenn Du ein Radio abspielst, kann das nicht funktionieren.

Ich denke Du willst damit erreichen, dass nach der Ansage, Sonos einfach weiterspielt.
Dafür musst Du aber nichts machen. Das macht SNS_PlayFiles() von alleine :wink:

Versuch es doch mal so:
„access Path“ in der Ivona config setzen und dann:


SNS_PlayFiles(39152 /*[I/O\Sonos\Sonos Bad]*/ , array(IVNTTS_saveMP3(24211 /*[I/O\TTS\IvonaTTS]*/,"Anruf von ".$_IPS['CALL_Name']) ),"+10" );

oder wenn Du es nicht verschachteln willst:


$text = "Anruf von ".$_IPS['CALL_Name'];
$file = IVNTTS_saveMP3(24211 /*[I/O\TTS\IvonaTTS]*/,$text);
SNS_PlayFiles(39152 /*[I/O\Sonos\Sonos Bad]*/ , array($file),"+10");

Das ,"+10" am Ende brachst Du aber nur, wenn Du auf das letze Update gehst, ansonsten lass es weg.

Ich hoffe das hilft Dir,
Thorsten

Hallo Thorsten,
ich habe das Update mal eingespielt. Mit dem Aufruf

SNS_PlayFiles($SonosID, $gebell, „0“);

erhalte ich jetzt folgende Fehlermeldungen:

Warning: Missing argument 2 for Sonos::PlayFiles(), called in /usr/share/symcon/scripts/__generated.inc.php on line 238 and defined in /usr/share/symcon/modules/SymconSonos/Sonos/module.php on line 506
Notice: Undefined variable: volumeChange in /usr/share/symcon/modules/SymconSonos/Sonos/module.php on line 522
Notice: Undefined variable: volumeChange in /usr/share/symcon/modules/SymconSonos/Sonos/module.php on line 567

Gruß
Peter

Moin,

hmpf.
Das könnte mit einem der Fehler hier Bekannte Bugs in den PHP-Modulen zusammenhängen.
Der Fehler sieht für mich so aus, als wenn der Aufruf über die __generated.inc.php den neuen Parameter noch nicht kennen würde.

Ich habe zum Testen IPS durchgestartet, bevor ich es wirklich testen konnte (Da kein update über „Module“).

Und ich sage so etwas nur wirkich ungerne: „Have you tried turning it off and on?“.

Ich gehe mal davon aus, dass ein Durchstarten die __generated.inc.php wieder neu erstellt.

Gruß,
Thorsten

Hi Thorsten

BINGO - das war’s. Nach dem Boot war alles wieder gut :wink:

Ein diff der beiden __generated.inc.php (vorher/nachher) zeigt es auch:

234c234
< function SNS_PlayFiles($InstanceID, $files, $volumeChange)
---
> function SNS_PlayFiles($InstanceID, $files)
238c238
<       return (new Sonos($InstanceID))->PlayFiles($files, $volumeChange);
---
>       return (new Sonos($InstanceID))->PlayFiles($files);

Vielen Dank für die prompte Hilfe.
Gruß
Peter

Hi,

Du kannstr mir doch nicht so einen Schrecken einjagen! :eek:

Gruß,
Thorsten

Hi,

kann es sein das da noch ein Tippfehler im Code ist :rolleyes:. Siehe Fehlermeldung unten. Das Modul ist laut Versionskontrolle aktuell.

Fatal error: Call to undefined method Sonos::chnageGroupVolume() in C:\IP-Symcon\modules\SymconSonos\Sonos\module.php on line 531

Hallo,

also ich verwende diese Funktion täglich, und bei mit hat es keine Fehler geworfen.
Lag aber daran,. dass die __generated.inc.php bei meinem letzen Update nicht richtig upgedated wurde…

Mit der Version von vor 2 Minutes ist der Fehler weg :wink:

Danke für den Hinweis.

Gruß,
Thorsten

Hi Thorsten,

ich habe bei einem Play1 (welcher Offline ist) das Problem, dass Dein „_updateStatus“ Script folgender Fehler bringt:


Warning:  include_once(../modules/SymconSonos/Sonos/sonos.php): failed to open stream: No such file or directory in C:\IP-Symcon\scripts\16894.ips.php on line 2

Warning:  include_once(): Failed opening '../modules/SymconSonos/Sonos/sonos.php' for inclusion (include_path='.;C:\php\pear') in C:\IP-Symcon\scripts\16894.ips.php on line 2


Alle „Online-SONOS“ bringen keinen Fehler. Kannst Du dies bitte bei Gelegenheit mit patchen?

Ciao
herbertf

Hallo,

eigentlich dachte ich, ich mache das.

if ( !$timeout || Sys_Ping($ip, $timeout) == true ) { ... }

in Zeile 7.
Falls Du den Timeout auf 0 gesetzt hast, wird diese Überprüfung übersprungen…

Weiterhin steht seit einem der letzen Updates in Zeile 2 nicht mehr


 include_once(../modules/SymconSonos/Sonos/sonos.php);

sondern:


include_once("../modules/SymconSonos/Sonos/sonosAccess.php");

Hast Du das Update schon gemacht? Dann könnte durchstarten helfen, dass das ApplyChanges() nochmals ausgehührt wird.

Oh… was ich gerade noch sehe:
Das ApplyChanges() steigt aus, wenn die Box nicht verfügbar ist…
Wenn sie also beim Update nicht verfügbar war, dann wird das Update nicht ausgeführt…
Daran könnte ich versiuchen etwas zu verbessern…

Gruß,
Thorsten

Hi,

ich habe gerade mal wieder etwas rumspielt, dabei ist folgender Fehler aufgetreten.

Fatal error:  Uncaught exception 'Exception' with message 'Error during Soap Call: UPnPError s:Client 402 (UNKNOWN)' in C:\IP-Symcon\modules\SymconSonos\Sonos\sonosAccess.php:435
Stack trace:
#0 C:\IP-Symcon\modules\SymconSonos\Sonos\sonosAccess.php(304): SonosAccess->processSoapCall('/MediaRenderer/...', 'urn:schemas-upn...', 'SetAVTransportU...', Array)
#1 C:\IP-Symcon\modules\SymconSonos\Sonos\sonosAccess.php(363): SonosAccess->SetAVTransportURI('x-sonosapi-stre...', '&lt;DIDL-Lite x...')
#2 C:\IP-Symcon\modules\SymconSonos\Sonos\module.php(557): SonosAccess->SetRadio('x-sonosapi-stre...')
#3 C:\IP-Symcon\scripts\__generated.inc.php(168): Sonos->PlayFiles(Array, '+10')
#4 C:\IP-Symcon\scripts\45605.ips.php(5): SNS_PlayFiles(47941, Array, '+10')
#5 {main}
  thrown in C:\IP-Symcon\modules\SymconSonos\Sonos\sonosAccess.php on line 435

Aufgerufen habe ich SNS_PlayFiles.

SNS_PlayFiles(49999 /*[Sonos\Sonos Mobil]*/ , array("//XXXX/tts/Tür_klingel.mp3"),"+10");

Nun habe ich mal etwas geforscht, wann der Fehler auftritt. Das MP3 File wird immer abgespielt, aber dann verhält sich das Modul unterschiedlich.

  • Wenn ein Radiosender abgespielt wird kommt der Fehler immer und das Abspielen des Stream ist beendet.

  • Wenn ein Napster Musikstream abgespielt wird, wird nach abspielten des Files auf den nächsten Titel geschaltet.

  • Wenn ich über Napster ein Album abspiele ist alles okay. Der Track wird gestoppt und startet nach dem abspielen des Files an der gestoppten Stelle auch wieder .

PS.: es wird auch nicht immer die 10% Lautstärken Erhöhung zurück genommen.

Hi,

das past nicht gnaz zusammen. Im callstack ist der aufruf „SNS_PlayFiles(47941, Array, ‚+10‘)“ zu sehen, Du sprichst von „SNS_PlayFiles(49999 /[Sonos\Sonos Mobil]/ , array(“//XXXX/tts/Tür_klingel.mp3"),"+10");".

Nur um sicher zu gehen… aber auf welcher Instanz Du das aufrufst, sollte keinen Unterschied machen.

stimmt:


    public function PlayFiles(array $files, $volumeChange)
    {
       // check Sonos Instance is available
        $ip      = $this->ReadPropertyString("IPAddress");
        $timeout = $this->ReadPropertyString("TimeOut");
        if ($timeout && Sys_Ping($ip, $timeout) != true)
           throw new Exception("Sonos Box ".$ip." is not available");

        include_once(__DIR__ . "/sonosAccess.php");
        $sonos = new SonosAccess($ip);


       // get current settings
        $positionInfo  = $sonos->GetPositionInfo();
        $mediaInfo     = $sonos->GetMediaInfo();
        $transportInfo = $sonos->GetTransportInfo();
        $volume        = $sonos->GetVolume();

        //adjust volume if needed
        if($volumeChange != 0){
          // check for group coordinator
          $isGroupCoordinator = $this->ReadPropertyBoolean("GroupCoordinator");
          // pause if playing
          if($transportInfo==1) $sonos->Pause();

          // volume request absolte or relative?
          if($volumeChange[0] == "+" || $volumeChange[0] == "-"){
            if($isGroupCoordinator){
              $this->changeGroupVolume($volumeChange);
            }else{
              $this->ChangeVolume($volumeChange);
            }
          }else{
            if($isGroupCoordinator){
              $this->SetGroupVolume($volumeChange);
            }else{
              $this->SetVolume($volumeChange);
            }
          }
        }

       // Play files
        foreach ($files as $key => $file) {
          // only files on SMB share can be used
          if (preg_match('/^\/\/[\w,.,\d,-]*\/\S*/',$file) == 0)
            throw new Exception("File (".$file.") has to be located on a Samba share (e.g. //ipsymcon.fritz.box/tts/text.mp3)");

          $sonos->SetAVTransportURI("x-file-cifs:".$file);
          $sonos->Play();
          IPS_Sleep(500);
          while ($sonos->GetTransportInfo()==1){ IPS_Sleep(200);}
        }

        // reset to what was set before playing files
        if (strpos($mediaInfo["CurrentURI"],"x-sonosapi-stream:") === 0 || strpos($mediaInfo["CurrentURI"],"x-rincon-mp3radio:") === 0 ){
          $sonos->SetRadio($mediaInfo["CurrentURI"]);
        }else{
          $sonos->SetAVTransportURI($mediaInfo["CurrentURI"],$mediaInfo["CurrentURIMetaData"]);
          try{
            $sonos->Seek("TRACK_NR",$positionInfo["Track"]);
            $sonos->Seek("REL_TIME",$positionInfo["RelTime"]);
          }catch(Exception $e){}

        }

        if($volumeChange != 0){
          // set back volume
          if($isGroupCoordinator){
            $this->SetGroupVolume($volume);
          }else{
            $this->SetVolume($volume);
          }
        }

        // keep on playing if it was playing before
        if ($transportInfo==1){
          $sonos->Play();
        }
    }

Ich frage mich gerade ob das so richtig ist, wie ich wieder auf das zurückspringe was vorher lief.
Das hatte ich von Thomas übernommen. Aber SetRadio ruft eigentlich auch nur SetAVTransportURI auf.

Ich werde das nochmal überdenken und anpassen.
Komischerweise geht es bei mir immer. Liegt aber evtl. daran, welches Radio ich so höre…

Könntest Du mit mal für Deine 3 Szenarien den Output von


<?

include_once("../modules/SymconSonos/Sonos/sonosAccess.php");

$ip = "<sonos IP>";
$sonos = new SonosAccess($ip);

print "PositionInfo
";
var_dump($sonos->GetPositionInfo());
print "MediaInfo
";
var_dump($sonos->GetMediaInfo());

?>

per PN zukommen lassen?
Würde mir sehr helfen, da ich kein Napster einsetze…

Das schiebe ich mal darauf, dass da etwas eine exception wirft, bevor die Lautstärke zurückgesetzt wird…

Danke,
Thorsten

Hallo,

ging jetzt doch schneller als gedacht…
Ich habe einen Radiosender gefunden, mit dem ich die Exception nachstellen konnte.:smiley:

Ich habe das zurücksetzen auf das vorher gespielte jetzt stark vereinfacht:


        // reset to what was playing before
        $sonos->SetAVTransportURI($mediaInfo["CurrentURI"],$mediaInfo["CurrentURIMetaData"]);
        if($positionInfo["Track"] != 1 )
          $sonos->Seek("TRACK_NR",$positionInfo["Track"]);
        if($positionInfo["TrackDuration"] != "0:00:00" )
          $sonos->Seek("REL_TIME",$positionInfo["RelTime"]);

Da ich aber kein Napster Stram testen kann, kann ich auch nicht sagen, wie es sich dort verhält…

Für Radio (SWR3, was vorher bei mir nicht gedumpt hat und das mit dem ich den Fehler nachstellen konnte) geht es, genau wie für aktive Playlisten.

Gruß,
Thorsten

Hallo zusammen
Habe gerade festgestellt das die funktion SNS_Stop nicht mehr zur Auswahl steht.
Ist das so gewollt oder ein Bug.
Mfg Stefan