Schaue ich mir gleich an!
paresy
Schaue ich mir gleich an!
paresy
Mit dem IPS4-Fix von eben werden meine Variablen (ohne Timeout Änderung) wieder brav aktualisiert
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.
IVNTTS_saveMP3(24211 /*[I/O\TTS\IvonaTTS]*/,$TTS);
direkt den richtigen Pfad zurück.
Oder gibt es einen Grund für Deine Vorgehensweise?
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
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
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
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...', '<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.
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