HEOS Multiroom Lautsprecher (über Telnet) steuern..

Liebes Forum
Ich bin totaler Anfänger und hab leider keine Programmierkenntnisse…
Ich bräuchte mal eure Hilfe:

Es gibt eine Befehlsreferenz für HEOS mit der man über Telnet jede Box steuern kann, zusätzlich gibt es scheinbar einen „Json“ Request Befehlssatz für den Status…

Der Link zur Referenz: http://www2.aerne.com/Public/dok-sw.nsf/0c6187bc750a16fcc1256e3c005a9740/9193bea412104506c1257dbd00298c78/$FILE/HEOS_CLI_ProtocolSpecification-Verion-1.3.pdf

Jede Box hat eine sogenannte PID - Nr. mit der die Box angesprochen wird. Dies funktionert sogar über eine andere Box, da Heos die Befehle weiterleitet…

In Putty kann ich diese Http Befehle wunderbar auslösen und es funktionert…
Bis gestern hatte ich auch schon mal den Ansatz mit einem Client-Socket die IP der Box xxxx.xxxx.xxxx.xxxx mit dem Port 1255 anzusprechen.
Ich habe einen Socket installiert und dann im Script-Editor folgenden Befehl hinterlegt:

CSCK_SendText(16277 /[Client Socket-Heos AMP]/, „heos://player/toggle_mute?pid=-1089526050“); //Mute on/off

Bis gestern konnte ich die Befehle absenden und es hat funktioniert auch andere Befehle… allerdings musste ich für jeden Lautsprecher einen eigenen Socket aufmachen…

Nach dem Update von 4.0 auf 4.1 funktioniert nun gar nichts mehr… ich habe alle Sockets gelöscht, neu aufgesetzt, die Befehle neu angelegt, neustart etc…

Ich bekomms einfach nicht mehr hin… über putty funktioniert immer noch alle wunderbar…

Was mach ich falsch…?

Grundsätzlich wäre das Ziel die Heos in IPS einzubinden und über verschiedene Geräte, z.B. Logitech Harmony oder einfache Homematic Taster (On/Off) anzusteuern…

Gibts denn jemanden der sich auch mit diesen Problemen rumschlägt…?

Vielen Dank für Eure Hilfe
Richy

In der Anleitung steht ja:

Controller software can control all HEOS speakers in the network by establishing socket connection with just one HEOS speaker. It
is recommended not to establish socket connection to each HEOS speaker. This is to decrease network traffic caused by establishing socket
connection to each HEOS speaker

Daher würde ich versuchen das mit einem einzigen Socket zulösen.

Wenn Du einen Doppelklick auf den Socket machst findest Du oben einen grünen Käfer mit Beschriftung Debug. Was steht denn in dem Fenster wenn Du versuchst etwas zu senden?

Das habe ich gefunden kannst ja mal schauen ob man darauf aufbauen kann bzw. was damit funktioniert.


<?

/***************************************************
HEOS Steuerung
***************************************************/

$debug    = TRUE;
$heosIP   = "192.168.1.2";
$heosPort = "1255";
$heosID   = "-123456789";
$socket   = "";
$VerbindungOK = FALSE;

//Test, ob Heos prinzipiell überhaupt erreichbar ist
function isOnline( )
{
    return TRUE;    //NOCH NICHT IMPLEMENTIERT
}

//---------------
//-- Kommandos --
//---------------
//Als Resultat wird immer ausgegeben:    $Result[0]=Status(true=OK,false=ER), $Result[1]=Rückgabewert (fals vorhanden). Kann ein String oder ein (associatives) Array sein

// -- Status --
function getStatus( )
{
    global $heosID;
    global $debug;
    //{"heos": {"command": "player/get_play_state", "result": "success", "message": "pid=-123456789&state=stop"}}
    if($debug) { echo "<br>getStatus: Anfrage="; echo "heos://player/get_play_state?pid=" . $heosID; }
    $arrResult = telnet( "heos://player/get_play_state?pid=" . $heosID );
    if($debug) { echo "<br>getStatus: Resultat="; echo var_dump($arrResult); }

    if( array_key_exists("Fehler", $arrResult) )
    {
        $arrReturn =  array(false, $arrResult["FehlerDetail"]);
    }
    else
    {
        $strStatus = holeWert( $arrResult["heos"]["message"], "state=" );
        $arrReturn =  array(true, "");
        switch( $strStatus )
        {
            case "play" :
                $arrReturn =  array( true, "Läuft" );
                break;
            case "pause":
                $arrReturn =  array( true, "Pausiert" );
                break;
            case "stop" :
                $arrReturn =  array( true, "Gestoppt" );
                break;
            default     :
                $arrReturn =  array( false, "Ungültiger Status \"" . $strStatus . "\"" );
        }
    }
    if($debug) { echo "<br>getStatus: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}

function setStatus( $strRequest )
{
    global $heosID;
    global $debug;
    if( $strRequest === "play" OR  $strRequest === "pause" OR $strRequest === "stop")
    {
        if($debug) { echo "<br>setStatus: Anfrage="; echo "heos://player/set_play_state?pid=" . $heosID . "&state=" . $strRequest; }
        $arrResult = telnet( "heos://player/set_play_state?pid=" . $heosID . "&state=" . $strRequest );
        if($debug) { echo "<br>setStatus: Resultat="; echo var_dump($arrResult); }

        if( array_key_exists("Fehler", $arrResult) )
            {
                $arrReturn =  array(false, $arrResult["Fehler"]);
            }
            else
            {
                $arrReturn =  array(true, "");
            }    
    }
    else
    {
        $arrReturn =  array(false, "Ungültiger Status \"" . $strRequest . "\"");
    }
    if($debug) { echo "<br>setStatus: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}

function toggleStatus()
{
    $arrTemp = getStatus();
    $heosStatus = $arrTemp[1];
    switch( $heosStatus )
    {
        case "Läuft" :
            $strRequest = "pause";
            break;
        case "Gestoppt" :
            $strRequest = "play";
            break;
        case "Pausiert":
            $strRequest = "play";
            break;
        default     :
            $strRequest = "play";
    }
    
    return setStatus( $strRequest );
}



// -- Aktueller Titel --
function getPlaying( )
{
    global $heosID;
    global $debug;
    //{"heos": {"command": "player/get_now_playing_media", "result": "success", "message": "pid=-123456789"}, "payload": {"type": "song", "song": "Beautiful Emptiness", "album": "Invisible Circles", "artist": "After Forever", "image_url": "http://....png", "album_id": "4:cont2:605:part24:95412:13", "mid": "5:audio5:part25:183221:5", "qid": 1, "sid": 1024}}
    if($debug) { echo "<br>getPlaying: Anfrage="; echo "heos://player/get_now_playing_media?pid=" . $heosID; }
    $arrResult = telnet( "heos://player/get_now_playing_media?pid=" . $heosID );
    if($debug) { echo "<br>getPlaying: Resultat="; echo var_dump($arrResult); }
    
    if( array_key_exists("Fehler", $arrResult) )
    {
        $arrReturn =  array(false, $arrResult["Fehler"]);
    }
    else
    {
        //Prüfen, ob was drin steht im Payload
        if( empty($arrResult["payload"]) )
        {
            $arrReturn =  array(false, [ "Fehler" => "Kein Payload", "FehlerDetail" => "Kein Payload"]);
        }
        else
        {
            $arrReturn =  array(true, $arrResult["payload"]);
        }
    }
    if($debug) { echo "<br>getPlaying: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}

// -- Lautstärke --
function getVolume( )
{
    global $heosID;
    global $debug;
    //{"heos": {"command": "player/get_volume", "result": "success", "message": "pid=-123456789&level=14"}}
    if($debug) { echo "<br>getVolume: Anfrage="; echo "heos://player/get_volume?pid=" . $heosID; }
    $arrResult = telnet( "heos://player/get_volume?pid=" . $heosID );
    if($debug) { echo "<br>getVolume: Resultat="; echo var_dump($arrResult); }
    
    if( array_key_exists("Fehler", $arrResult) )
    {
        $arrReturn =  array(false, $arrResult["Fehler"]);
    }
    else
    {
        $arrReturn =  array( true, holeWert($arrResult["heos"]["message"], "level=") );    //0 - 100
    }
    if($debug) { echo "<br>getVolume: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}

function VolumeUp( $strRequest )
{
    global $heosID;
    global $debug;
    //{"heos": {"command": "player/VolumeUp", "result": "success", "message": "pid=-123456789&step=5"}}
    if($debug) { echo "<br>VolumeUp: Anfrage="; echo "heos://player/volume_up?pid=" . $heosID . "step=" . $strRequest; }
    $arrResult = telnet( "heos://player/volume_up?pid=" . $heosID  . "step=" . $strRequest);
    if($debug) { echo "<br>VolumeUp: Resultat="; echo var_dump($arrResult); }
    
    if( array_key_exists("Fehler", $arrResult) )
    {
        $arrReturn =  array(false, $arrResult["Fehler"]);
    }
    else
    {
        $arrReturn =  array( true, holeWert($arrResult["heos"]["message"], "level=") );    //0 - 100
    }
    if($debug) { echo "<br>VolumeUp: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}

function VolumeDown( $strRequest )
{
    global $heosID;
    global $debug;
    //{"heos": {"command": "player/VolumeDown", "result": "success", "message": "pid=-123456789&step=5"}}
    if($debug) { echo "<br>VolumeDown: Anfrage="; echo "heos://player/volume_down?pid=" . $heosID . "step=" . $strRequest; }
    $arrResult = telnet( "heos://player/volume_down?pid=" . $heosID  . "step=" . $strRequest);
    if($debug) { echo "<br>VolumeDown: Resultat="; echo var_dump($arrResult); }
    
    if( array_key_exists("Fehler", $arrResult) )
    {
        $arrReturn =  array(false, $arrResult["Fehler"]);
    }
    else
    {
        $arrReturn =  array( true, holeWert($arrResult["heos"]["message"], "level=") );    //0 - 100
    }
    if($debug) { echo "<br>VolumeDown: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}

function isMute( )
{
    global $heosID;
    global $debug;
    //{"heos": {"command": "player/get_mute", "result": "success", "message": "pid=-123456789&state=off"}}
    if($debug) { echo "<br>isMute: Anfrage="; echo "heos://player/get_mute?pid=" . $heosID; }
    $arrResult = telnet( "heos://player/get_mute?pid=" . $heosID );
    if($debug) { echo "<br>isMute: Resultat="; echo var_dump($arrResult); }
    
    if( array_key_exists("Fehler", $arrResult) )
    {
        $arrReturn =  array(false, $arrResult["Fehler"]);
    }
    else
    {
        if( holeWert( $arrResult["heos"]["message"], "state=" ) === "on" )    //on oder off
        {
            $arrReturn =  array(true, true);
        }
        else
        {
            $arrReturn =  array(true, false);
        }
        
    }
    if($debug) { echo "<br>isMute: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}

function setMute( $bolRequest )
{
    global $heosID;
    global $debug;
    if( $bolRequest === true OR  $bolRequest===false )
    {
        if( $bolRequest )
        {
            $strRequest = "on";
        }
        else
        {
            $strRequest = "off";
        }

        //{"heos": {"command": "player/set_mute", "result": "success", "message": "pid=-123456789&state=off"}}
        if($debug) { echo "<br>setMute: Anfrage="; echo "heos://player/set_mute?pid=" . $heosID . "state=" . $strRequest; }
        $arrResult = telnet( "heos://player/set_mute?pid=" . $heosID . "state=" . $strRequest);
        if($debug) { echo "<br>setMute: Resultat="; echo var_dump($arrResult); }

        if( array_key_exists("Fehler", $arrResult) )
            {
                $arrReturn =  array(false, $arrResult["Fehler"]);
            }
            else
            {
                $arrReturn =  array(true, "");
            }    
    }
    else
    {
        $arrReturn =  array(false, "Ungültiger Status \"" . $bolRequest . "\"");
    }
    if($debug) { echo "<br>setMute: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}

function toggleMute( )
{
    global $heosID;
    global $debug;
    //{"heos": {"command": "player/toggle_mute", "result": "success", "message": "pid=-123456789"}}
    if($debug) { echo "<br>toggleMute: Anfrage="; echo "heos://player/toggle_mute?pid=" . $heosID; }
    $arrResult = telnet( "heos://player/toggle_mute?pid=" . $heosID );
    if($debug) { echo "<br>toggleMute: Resultat="; echo var_dump($arrResult); }
    
    if( array_key_exists("Fehler", $arrResult) )
    {
        $arrReturn =  array(false, $arrResult["Fehler"]);
    }
    else
    {
        $arrReturn =  array(true, "");
    }
    if($debug) { echo "<br>toggleMute: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}


//-- Titel Vor und Zurück --
function playNext( )
{
    global $heosID;
    global $debug;
    //{"heos": {"command": "player/play_next", "result": "success", "message": "pid=-123456789"}}
    if($debug) { echo "<br>playNext: Anfrage="; echo "heos://player/play_next?pid=" . $heosID; }
    $arrResult = telnet( "heos://player/play_next?pid=" . $heosID );
    if($debug) { echo "<br>playNext: Resultat="; echo var_dump($arrResult); }

    if( array_key_exists("Fehler", $arrResult) )
    {
        $arrReturn =  array(false, $arrResult["Fehler"]);
    }
    else
    {
        $arrReturn =  array(true, "");
    }
    if($debug) { echo "<br>playNext: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}

function playPrevious( )
{
    global $heosID;
    global $debug;
    //{"heos": {"command": "player/play_previous", "result": "success", "message": "pid=-123456789"}}
    if($debug) { echo "<br>playPrevious: Anfrage="; echo "heos://player/play_previous?pid=" . $heosID . " (2x)"; }
    $arrResult = telnet( "heos://player/play_previous?pid=" . $heosID );
    if($debug) { echo "<br>playPrevious (1): Resultat="; echo var_dump($arrResult); }
    $arrResult = telnet( "heos://player/play_previous?pid=" . $heosID );    //2x, da der erste nur zurückspult
    if($debug) { echo "<br>playPrevious (2): Resultat="; echo var_dump($arrResult); }

    if( array_key_exists("Fehler", $arrResult) )
    {
        $arrReturn =  array(false, $arrResult["Fehler"]);
    }
    else
    {
        $arrReturn =  array(true, "");
    }
    if($debug) { echo "<br>playPrevious: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}

function getQueue( )
{
    global $heosID;
    global $debug;
    //{"heos": {"command": "player/get_mute", "result": "success", "message": "pid=-123456789&state=off"}}
    if($debug) { echo "<br>getQueue: Anfrage="; echo "heos://player/get_queue?pid=" . $heosID; }
    $arrResult = telnet( "heos://player/get_queue?pid=" . $heosID ); //&range="start#, end#
    if($debug) { echo "<br>getQueue: Resultat="; echo var_dump($arrResult); }
    
    if( array_key_exists("Fehler", $arrResult) )
    {
        $arrReturn =  array(false, $arrResult["Fehler"]);
    }
    else
    {
        $arrReturn =  array(true, $arrResult["payload"]);
    }
    if($debug) { echo "<br>getQueue: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}


function getPrevious( $qid=0 )
{
    global $debug;
    if($debug) { echo "<br>getPrevious: Parameter="; echo var_dump($qid); }
    //Zuerst aktuelle qid holen (falls nicht schon übergeben)
    if( $qid==0 )
    {
        $arrTemp = getPlaying();
        if( $arrTemp[0] )
        {
            $qid = $arrTemp[1]["qid"];
        }
        else
        {
            $qid = 0;
        }
    }
        
    if( $qid == 0 )
    {
        $arrReturn =  array(false, [ "Fehler" => "Kein Prev", "FehlerDetail" => "Kein Prev, da es keinen aktueller Titel gibt" ]);
    }
    else
    {
        if( $qid == 1 )
        {
            $arrReturn =  array(false, [ "Fehler" => "Kein Prev", "FehlerDetail" => "Aktueller Titel ist der älteste" ]);
        }
        else
        {
            //Hier werden die Werte anhand der qid geholt
            $qid = $qid - 1;
            $arrTemp = getQueue();
            if( $arrTemp[0] )
            {    
                $bolGefunden = FALSE;
                foreach ($arrTemp[1] as $value)
                {
                    if( $value["qid"] == $qid)
                    {
                        $arrReturn = array(true, 
                                    [    "song"        => $value["song"],
                                        "album"        => $value["album"],
                                        "artist"    => $value["artist"],
                                        "image_url"    => $value["image_url"],
                                        "qid"        => $value["qid"],
                                        "mid"        => $value["mid"] ]);
                        $bolGefunden = TRUE;
                        break;
                    }
                }
                if( !$bolGefunden )
                {
                    $arrReturn =  array(false, [ "Fehler" => "Kein Prev", "FehlerDetail" => "Preview wurde nicht in Queue gefunden" ]);
                }
            }
            else
            {
                $arrReturn =  array(false, [ "Fehler" => "Kein Prev", "FehlerDetail" => "Preview kann nicht aus Queue ausgelesen werden" ]);
            }
        }        
    }
    if($debug) { echo "<br>getPrevious: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}

function getNext( $qid=0 )
{
    global $debug;
    if($debug) { echo "<br>getNext: Parameter="; echo var_dump($qid); }
    //Zuerst aktuelle qid holen (falls nicht schon übergeben)
    if( $qid==0 )
    {
        $arrTemp = getPlaying();
        if( $arrTemp[0] )
        {
            $qid = $arrTemp[1]["qid"];
        }
        else
        {
            $qid = 0;
        }
    }
        
    if( $qid == 0 )
    {
        $arrReturn =  array(false, [ "Fehler" => "Kein Next", "FehlerDetail" => "Kein Next, da es keinen aktueller Titel gibt" ]);
    }
    else
    {
        //Hier werden die Werte anhand der qid geholt
        $qid = $qid + 1;
        $arrTemp = getQueue();
        if( $arrTemp[0] )
        {    
            $bolGefunden = FALSE;
            foreach ($arrTemp[1] as $value)
            {
                if( $value["qid"] == $qid)
                {
                    $arrReturn = array(true, 
                                [    "song"        => $value["song"],
                                    "album"        => $value["album"],
                                    "artist"    => $value["artist"],
                                    "image_url"    => $value["image_url"],
                                    "qid"        => $value["qid"],
                                    "mid"        => $value["mid"] ]);
                    $bolGefunden = TRUE;
                    break;
                }
            }
            if( !$bolGefunden )
            {
                $arrReturn =  array(false, [ "Fehler" => "Kein Next", "FehlerDetail" => "Next wurde nicht in Queue gefunden" ]);
            }
        }
        else
        {
            $arrReturn =  array(false, [ "Fehler" => "Kein Next", "FehlerDetail" => "Next kann nicht aus Queue ausgelesen werden" ]);
        }
    }
    if($debug) { echo "<br>getNext: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}


//-- Beliebige Titel
function playURL( $strRequest )
{
    global $heosID;
    global $debug;
    //{"heos": {"command": "player/play_previous", "result": "success", "message": "pid=-123456789"}}
    if($debug) { echo "<br>playURL: Anfrage="; echo "heos://browse/play_stream?pid=" . $heosID . "&url=" . $strRequest; }
    $arrResult = telnet( "heos://browse/play_stream?pid=" . $heosID . "&url=" . $strRequest );
    if($debug) { echo "<br>playURL: Resultat="; echo var_dump($arrResult); }
    
    if( array_key_exists("Fehler", $arrResult) )
    {
        $arrReturn =  array(false, $arrResult["Fehler"]);
    }
    else
    {
        $arrReturn =  array(true, "");
    }
    if($debug) { echo "<br>playURL: Rückgabe="; echo var_dump($arrReturn); }
    return $arrReturn;
}



//---------------------
//-- Hilfsfunktionen --
//---------------------
//Einmalige erstellung vom Socket. Gibt result[0]=true/false, result[1]=("Fehler", "FehlerDetail")
function create_socket()
{
    global $heosIP;
    global $heosPort;
    global $heosID;
    global $debug;
    global $socket;
    global $VerbindungOK;

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if( $socket === false )
    {
        //Fehler Socket Erstellung
        $arrReturn = array(false, [ "Fehler" => "SocketCreate Fehler", "FehlerDetail" => socket_strerror(socket_last_error()) ]);
        $VerbindungOK = FALSE;
    }
    else
    {
        $result = socket_connect($socket, $heosIP, $heosPort);
        if( $result === false OR  $result === 0)
        {
            //Fehler Socket Verbindung
            $arrReturn = array(false, [ "Fehler" => "Socket_Connect Fehler", "FehlerDetail" => socket_strerror(socket_last_error($socket)) ]);
            $VerbindungOK = FALSE;
        }
        else
        {
            //Verbindung OK
            //$bolResult = socket_set_option ( $socket , SOL_SOCKET , SO_KEEPALIVE , 1 );
            //$bolResult = socket_set_option ( $socket , SOL_SOCKET , SO_REUSEADDR , 1 );
            //Testabfragen, bis eine vernünftige Antwort kommt. Alle x Sekunden, maximal y mal
            $MaxAnzahl = 10;
            $WarteZeit = 500000;    //0.5s
            socket_write($socket, "heos://player/get_players");
            for ($i = 0; $i < $MaxAnzahl; $i++)
            {
                if($debug) { echo "<br>create_socket (Schleife): Iteration=" . $i ; }
                usleep ( $WarteZeit );    //in Mikrosekunden

                $strResult = socket_read($socket, 4096);
                if( strpos($strResult, "command under process") > 0 )
                {
                    if($debug) { echo "<br>create_socket (Schleife): " . $strResult ; }
                }
                else
                {
                    if($debug) { echo "<br>create_socket (Schleife): OK nach " . $i*$WarteZeit/1000000 . " Sekunden" ; }
                    $i = $MaxAnzahl+10;    //"command under process" nicht gefunden --> Läuft --> Schleife vorzeitig beenden
                }
            }

            if( $i < $MaxAnzahl+10 )
            {
                $arrReturn = array(false, [ "Fehler" => "Timeout", "FehlerDetail" => "'command under process' nach " . $MaxAnzahl*$WarteZeit/1000000 . " Sekunden" ]);
                $VerbindungOK = FALSE;
            }
            else
            {
                //Alles OK
                $arrReturn = array(true, [ "Fehler" => "OK", "FehlerDetail" => "Keine Fehler" ]);
                $VerbindungOK = TRUE;
            }        
        }
        //socket_close($socket);    //Socket offen lassen für weitere Anfragen
    }
    if($debug) { echo "<br>create_socket: "; echo var_dump($arrReturn); }
    return $arrReturn;
}

//Requestabfrage
function telnet( $strRequest )
{
    global $heosID;
    global $socket;
    global $VerbindungOK;
    global $debug;
    
    if( $VerbindungOK )
    {
        socket_write($socket, $strRequest);
        $strResult = socket_read($socket, 4096);
        if($debug) { echo "<br>telnet (JSON): Resultat="; echo var_dump($strResult); }
        $arrResult = json_decode($strResult, true );    //true-->associatives Array
        if($debug) { echo "<br>telnet (ARRAY): Resultat="; echo var_dump($arrResult); }

        //Prüfen, ob Inhalt OK (success) oder nicht (fail) --> Fehlermeldung generieren
        if( $arrResult["heos"]["result"] === "success" )
        {
            $arrReturn =  $arrResult;
        }
        else
        {
            $arrReturn = [ "Fehler" => "(" . holeWert( $arrResult["heos"]["message"], "eid=", "&" ) . ") " . holeWert( $arrResult["heos"]["message"], "text=", "&"), "FehlerDetail" => str_replace("&pid=" . $heosID,"",$arrResult["heos"]["message"]) ];    //PID nicht bei Fehler ausgeben
        }
    }
    else
    {
        $arrReturn = [ "Fehler" => "Keine Verbindung", "FehlerDetail" => "Keine Verbindung" ];
    }
    return $arrReturn;
}

function holeWert( $quellString, $suchAttributStart, $suchAttributEnde="" )
{
    global $debug;
    if($debug) { echo "<br>holeWert: Anfrage= quellString:'" . $quellString . "' suchAttributStart:'" . $suchAttributStart . "' suchAttributEnde:'" . $suchAttributEnde . "'"; }
    
    if( $quellString == "" OR $suchAttributStart == "" )
    {
        $strReturn = "n/a";
    }
    else
    {
        $s1 = strpos( $quellString, $suchAttributStart ) + strlen($suchAttributStart);
        if( $suchAttributEnde === "" )
        {
            //Kein Bis-Wert --> Bis zum Ende vom String
            $s2 = strlen( $quellString );
        }
        else
        {
            $s2 = strpos( $quellString, $suchAttributEnde, $s1 );
        }

        $strReturn = substr( $quellString, $s1, $s2-$s1 );
        if( $strReturn===false )
        {
            $strReturn = "n/a";
        }        
    }
    if($debug) { echo "<br>holeWert: Rückgabe="; echo var_dump($strReturn); }
    return $strReturn;
}


?>

Ich komm leider gar nicht weiter…
Beim Socket „Debug“ Käfer kommt nichts…

Wenn ich ein PHP Script ausführe, dann gibt es zwar keine Fehlermeldung, nur ist mir ja gar nicht klar wie das Script mit dem Lautsprecher kommunizieren soll…? Über den Socket…? oder muss ich das irgendwo in das Script einbauen…?

z.B.
<?
/***************************************************
HEOS Steuerung
***************************************************/

$debug = TRUE;
$heosIP = „192.168.1.109“;
$heosPort = „1255“;
$heosID = „-886535638“;
$socket = „“;
$VerbindungOK = FALSE;

// – Status –
function getStatus( )
{
global $heosID;
global $debug;
//{„heos“: {„command“: „player/get_play_state“, „result“: „success“, „message“: „pid=-123456789&state=stop“}}
if($debug) { echo „<br>getStatus: Anfrage=“; echo „heos://player/get_play_state?pid=“ . $heosID; }
$arrResult = telnet( „heos://player/get_play_state?pid=“ . $heosID );
if($debug) { echo „<br>getStatus: Resultat=“; echo var_dump($arrResult); }

if( array_key_exists("Fehler", $arrResult) )
{
    $arrReturn =  array(false, $arrResult["FehlerDetail"]);
}
else
{
    $strStatus = holeWert( $arrResult["heos"]["message"], "state=" );
    $arrReturn =  array(true, "");
    switch( $strStatus )
    {
        case "play" :
            $arrReturn =  array( true, "Läuft" );
            break;
        case "pause":
            $arrReturn =  array( true, "Pausiert" );
            break;
        case "stop" :
            $arrReturn =  array( true, "Gestoppt" );
            break;
        default     :
            $arrReturn =  array( false, "Ungültiger Status "" . $strStatus . """ );
    }
}
if($debug) { echo "&lt;br&gt;getStatus: Rückgabe="; echo var_dump($arrReturn); }
return $arrReturn;

}

Ein wenig ratlos und unerfahren… :slight_smile:

Das Skript baut einen eigenen Socket auf. Man müsste dies gegebenenfalls noch für IP-Symcon umschreiben wenn es einen IP-Symcon Socket verwenden soll.

Zum Testen erstellt Du in IP-Symcon ein neues Skript und kopierst dort den Inhalt s.o. rein. In dem Skript must Du dann im Kopf noch die IP Adresse anpassen und abspeichern.
Dann erstellst Du ein zweites Skript und packst da dann den Befehl rein den Du ausführen willst z.B. so


includeScript(58332 /*[Geräte\Heimkino\Audio\HEOS\HEOS]*/);  
 
function includeScript($scriptID)
{
    $s = IPS_GetScript($scriptID);
    include($s['ScriptFile']);
}

$status = getStatus( ); // ruft die Funktion getStatus auf 
var_dump($status);

Dann führst Du dieses Skript aus und schaust mal ob $status einen Inhalt hat.

Was dann genau passiert kann ich nicht testen da ich kein HEOS besitze, aber so kannst Du jeweils schauen was die einzelnen Funktionen in dem HEOS Skript bewirken und ob diese funktionieren.

Folgende Ausgabe beim Heos: Sript:

{
case „play“ :
$arrReturn = array( true, „Läuft“ );
break;
case „pause“:
$arrReturn = array( true, „Pausiert“ );
break;
case „stop“ :
$arrReturn = array( true, „Gestoppt“ );
break;
(42) default :
(43) $arrReturn = array( false, „Ungültiger Status „“ . $strStatus . „““ );
}

Fehlermeldung: "
Parse error: syntax error, unexpected ‚"‘, expecting ‚)‘ in /var/lib/symcon/scripts/59273.ips.php on line 43"

Dann die 42 und 43 gelöscht…
Keine Fehlermeldung aber sonst auch nichts…

Dann dein Script wie beschrieben ausgeführt:

Fehlermeldung: „Fatal error: Call to undefined function telnet() in /var/lib/symcon/scripts/59273.ips.php on line 20“

Das wäre folgende Zeile:

$arrResult = telnet( „heos://player/get_play_state?pid=“ . $heosID );

Irgendwie scheint mir das mit dem Telnet nicht zu funktionieren… auf der Version 4.0 konnte ich die Befehle auch erfolgreich absetzten…

Komisch in Zeile 586 wird die Funktion definiert oder fehlt das bei Dir?

Ich kann das nicht testen da ich ja kein Gerät habe aber bei mir kommt


array(2) {
  [0]=>
  bool(false)
  [1]=>
  string(16) "Keine Verbindung"
}

als Ausgabe zu dem Skript mit getstatus oben.

P.S. Code im Forum am besten immer mit Code markieren eine der drei Boxen rechts, ganz rechts ist PHP Code

Muss mal schauen ob Du das richtig kopiert hast die " sind escaped


 $arrReturn =  array( false, "Ungültiger Status \"" . $strStatus . "\"" ); 

Ok… das Script hat jetzt keine Fehlermeldung… hattest recht „copy/paste“ Fehler…

Aber das Ergebnis ist das selbe wie bei dir…

array(2) {
[0]=>
bool(false)
[1]=>
string(16) „Keine Verbindung“
}

Frage doch diesbezüglich noch mal in einem separaten Thread. Mir leuchtet es nicht ganz ein wenn es schon mal funktioniert hatte und nun unter 4.1 nicht mehr geht. Wenn Du sonst nichts verändert hast, dann scheint das ja eventuell mit der Version von IP-Symcon zusammenzuhängen.

Denke mal der Fehler wird, auch wenn es schon fast einen Monat her ist, immer noch existent sein, oder hat da jemand eine Lösung gefunden?

Hat sich bei diesem Thema etwas getan?

Her mit euren Erfahrungen :wink: um uns Newbies bei Heos auf die richtige Bahn zu bringen.

Herzlichen Dank.

lg
hagi