IPSSonos

Dito.

Auch bei mir.

Das verstehe ich nicht. Könnt ihr mir mal in der Funktion sendPacket den Inhalt vom $body schicken?

Hi Jevico,
Dein Patch funktioniert bei mir nicht. Kann aber bestätigen, dass die xml Antworten der Browse function defect sind. Bei mir funktioniert nur der früher beschriebene Patch.
Gruss
Hoep

Ich vermute das die XML Struktur unterschiedlich defekt zurück kommt. Konnte es leider mehr oder weniger nur bei mir testen. Bräuchte mehr Infos von verschiedenen Nutzern.

Soweit kommt er bei mir garnicht da im $ret schon ein

Error 400Bad Request

steht.

Das ist ja noch seltsamer :S

Ich glaube ich kann den Fehler reproduzieren. Habe meine Playliste mal erweitert und in einer eine ganze Reihe von Liedern hinzugefügt. Nun bekomme ich auch einen XML Fehler. Werde jetzt analysieren was nun wieder an der SOAP Nachricht kaputt ist. Melde mich dann noch einmal.

Danke für deine Hartnäckigkeit. :wink:

Hallo.

Ich denke, dass ich es jetzt verstanden habe. Die SOAP Nachricht ist nicht kaputt oder unvollständig (Schande über mein Haupt :rolleyes: )
Sie wird scheinbar bei einer bestimmten Länge noch einmal geteilt. Bitte versucht einmal den folgenden Fix und gebt mir Bescheid, ob es bei euch funktioniert hat. Dieser Fix düfte vermutlich sogar abwärtskompatibel sein, sprich mit Sonos 5.5 auch laufen.

Grüße

jevico :cool:

Ersetzt bei euch in der PHPSonos.inc.php die Funktion „sendPacket“ mit dem folgenden Code:


    /**
     * sendPacket - communicate with the device
     *
     * - <b>NOTE:</b> This function does send of a soap query and may filter xml answers
     * - <b>Returns:</b> Answer
     *
     * @return Array
     */
     private function sendPacket( $content )
    {
        $fp = fsockopen($this->address, 1400 /* Port */, $errno, $errstr, 10);
        if (!$fp)
            throw new Exception("Error opening socket: ".$errstr." (".$errno.")");

        fputs ($fp, $content);

        $ret = "";
        while (!feof($fp)) {
            $ret.= fgetss($fp,128); // filters xml answer
        }
        fclose($fp);
        
        if(strpos($ret, "200 OK") === false) {
             IPS_LogMessage ( "sendPacket", $ret);
            throw new Exception("Error sending command: ".$ret);
        }
        
        // TAG_DEBUG_DEEP sendpacketdebug
        //echo "sendPacketDebug: "; //DEBUG
        //print_r($ret);
        
        $parts = preg_split("/

/", $ret); // split to header und body
        $header = $parts[0];
        $body     = $parts[1];
        
        $array = preg_split("/
/", $body); // split body

        if (count($array) > 0) {
            $index = count($array) - 1;
        }
        else {
            $index = null;
        }
        
        for ($i=0; $i < count($array); $i++) {
            if (strpos($array[$i], '<DIDL') !== false) {
                $index = $i;
                if (in_array("6b2", $array) && ($i +2) < count($array)) {
                    $array[$i] = $array[$i].$array[$i+2];
                }
            }
        }
        
        if ($index !== null) {
                $returnContent = $array[$index];
        }
        else {
                $returnContent = $body;
        }

        return $returnContent;
    } 

Abend!

Leider nein…bekomme nach wie vor den gleichen Fehler beim „Sync-Playlist-Test“ :frowning:

Ein schlauer Mann (kugelberg - hat das Sonos-Modul für IPS 4 geschrieben) hat mir mal gesagt:

Die Response kommt aber in chunks zurück.
–> Wenn Du als Antwort etwas bekommtst was eine gewisse Größe übersteigt (ich glaube 4096 Bytes), dann bricht Dein Ansatz, da Du mittendrin noch ein paar Zeilenumbrüche und chunkgrößen der Antwort bekommst.
Chunked transfer encoding - Wikipedia, the free encyclopedia

Kannst dir ja mal sein Modul auf GitHub anschauen und vlt. hilft es dir weiter?!

Grüße,
Chris

Danke für den Hinweis. Das war eine wichtige Informationen.
Könntest du noch einmal den folgenden Code testen:

PHPSonos.inc.php
Funktion hinzufügen:


 function getHeaderData($header) {
        $headerParts = preg_split("/
/", $header);
        
        $headerData = array();
        
        foreach($headerParts as $headerPart) {
            $key_value = explode(':',$headerPart);
            $headerData[trim($key_value[0])] = (isset($key_value[1]) ? trim($key_value[1]): "");
        }
        
        return $headerData;
    }

Funktion ersetzten:


    /**
     * sendPacket - communicate with the device
     *
     * - <b>NOTE:</b> This function does send of a soap query and may filter xml answers
     * - <b>Returns:</b> Answer
     *
     * @return Array
     */
     private function sendPacket( $content )
    {
        $fp = fsockopen($this->address, 1400 /* Port */, $errno, $errstr, 10);
        if (!$fp)
            throw new Exception("Error opening socket: ".$errstr." (".$errno.")");

        fputs ($fp, $content);

        $ret = "";
        while (!feof($fp)) {
            $ret.= fgetss($fp,128); // filters xml answer
        }
        fclose($fp);
        
        if(strpos($ret, "200 OK") === false) {
             IPS_LogMessage ( "sendPacket", $ret);
            throw new Exception("Error sending command: ".$ret);
        }
        
        // TAG_DEBUG_DEEP sendpacketdebug
        //echo "sendPacketDebug: "; //DEBUG
        IPS_LogMessage("WHOLE",$ret);
        
        $parts = preg_split("/

/", $ret); // split to header und body
        $header = $parts[0];
        
        $headerData = $this->getHeaderData($header);
        
        if (isset($headerData["TRANSFER-ENCODING"]) && $headerData["TRANSFER-ENCODING"] === "chunked") {
            $chunked = true;    
        }
        else {
            $chunked = false; 
        }
        
        $body     = $parts[1];
        
        $array = preg_split("/
/", $body); // split to header und body

        if (count($array) > 0) {
            $index = count($array) - 1;
        }
        else {
            $index = null;
        }
        
        for ($i=0; $i < count($array); $i++) {
            if (strpos($array[$i], '<DIDL') !== false) {
                $index = $i;
            }
            else {
                if (!ctype_xdigit(trim($array[$i]))) { // is not hex
                    $array[$index] .= $array[$i];
                }
            }
        }
       
        if ($index !== null) {
                $returnContent = $array[$index];
        }
        else {
                $returnContent = $body;
        }
        return $returnContent;
    }  

Hallo jevico,

Nun funktioniert alles !!!

Danke und Grüsse,
MaLu

Ich glaube es kaum.

Es funktioniert wieder.

Vielen Dank.

Bestätige ebenfalls, dass die letzte Änderung funktioniert. Danke fürs Dranbleiben.

Beste Grüße
hoep

Moin!

Jupp, Playlist-Sync läuft auch wieder sauber durch. Und wenn die anderen sagen, dass alles wieder funktioniert, dann wird es so sein :slight_smile:

Jetzt hab ich zwar mehr oder weniger umsonst die ganzen Funktionen in SonosBY eingebaut, aber naja :smiley:
> Vielleicht könntest du ihn Zukunft bei sowas nur kurz Bescheid sagen, ob noch mit einem Fix zu rechnen ist oder nicht, dann müssen nicht alle sich was neues suchen und umbauen, sondern warten lieber 1-2 Monate oder je nachdem, bis es einen Fix gibt. Nicht bös gemeint, sind ja alle sehr dankbar, dass es IPSSonos gibt. Wäre aber gut gewesen. Einige hatten ganz schöne Panik :wink: :smiley:

Danke fürs fixen und Grüße,
Chris

Hi. Ich hatte selbst gehofft, dass relativ schnell jemand eine Lösung findet. Da aber nichts kam, habe ich es selbst versucht. Da der Ausgang ungewissen war, wollte ich lieber nichts ankündigen was nachher vielleicht nicht funktioniert hätte.

Es geht ja nicht darum, dass du verpflichtet bist etwas zu machen. Nur gibt es ja das ein oder andere Projekt, an dem einfach nicht mehr gearbeitet wird, entweder weil der Ersteller kein IPS mehr verwendet, keine Lust mehr hat oder warum auch immer.

Aber wenn es noch „Lebenszeichen“ gibt, dann kann man ja auch zusammen an einer Lösung basteln :slight_smile:

Ich hatte ja auch versucht das IPSSonos hinzubekommen. Hatte auch gute Voraussetzungen, da ich momentan (durch SonosBY) tief in Sonos eingestiegen war. Nur leider haben meine Fähigkeiten dann doch nicht ausgereicht um in IPSSonos komplett durchzublicken.

Naja, jetzt funktioniert alles wieder, du bist noch „am Start“, alles ist super :slight_smile:

Nochmals DANKE im Namen aller und einen schönen Sonntag!
-Chris-

Hallo zusammen,

Könnte jemand das gesamte PHPSonos Skript posten?

Bekomme auf Zeile 2319 ($headerData = $this->getHeaderData($header); ein Fehler.

Danke,

Philipp

Hi,

ich bin ja nun sehr optimistisch, dass ich die IPSSonos weiterverwenden kann und traue mich trotzdem noch eine kleine - hoffentlich nicht unverschämte- Frage zu stellen:

Wird es auch ein Update geben, was man über die IPS-GUI installieren kann?

Dank im Voraus

herbertf

ACHTUNG - Man sollte in der PHPSonos, in der Funktion „sendPacket“, noch das hier auskommentieren:
IPS_LogMessage(„WHOLE“,$ret);

Also so ändern:
//IPS_LogMessage(„WHOLE“,$ret);

…sonst wird einem in der IPS-Console das Meldungen-Log extrem geflutet/vollgespamed :eek: :smiley:

Grüße,
Chris