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;
}
?>