Plex Status Play/Pause ermitteln

Hi ein kleine Script, mit dem man den Status von einem Plexclient ermitteln kann:

Play/Pause :

 $ant=@Sys_GetURLContent('http://192.168.0.20:3005/jsonrpc?request={"jsonrpc":"2.0","method":"Player.GetProperties","params":{"properties":["speed"],"playerid":1},"id":1}');

if ($ant=='{"id":1,"jsonrpc":"2.0","result":{"speed":1}}') echo "Plex is playing";

if ($ant=='{"id":1,"jsonrpc":"2.0","result":{"speed":0}}') echo "Plex is not playing";

Es muss nur die IP-Adresse des Clients geändert werden…

Einfach einen Timer der jede 1 -x Sec. läuft anhängen…

Ich habe eine boolean Variable angelegt, das ich mit diesem Script schalte… Ich schalte damit LED Licht im Wohnzimmer an, wenn Plex nix abspielt :wink:

Wenn jemand rausfinden könnte, was man damit noch so abfragen oder steuern könnte wäre ich sehr sehr dankbar…

Für diese Info musste ich 2 Stunden im Netz danach suchen !

Ich habe kürzlich meinen Plex Client in IPS eingebunden.
Funktioniert bei dir so nicht weil dir meine Methoden zum Anlegen der Variablen fehlen, aber das Grundsätzliche wird daraus klar.
Eventuell hilft dir das ja weiter:

<?
/*
    Dieses Skript dient zur Steuerung eines Plex Home Theater Clients.

    Es muss in den Programmeinstellungen unter Services die Steuerung via HTTP aktiviert werden.
    Außerdem muss die Datei guisettings.xml mit folgendem Inhalt erstellt werden:
        <esallinterfaces>true</esallinterfaces>

    Die Datei muss sich in folgendem Ordner befinden (Systemabhängig):
        Windows: %APPDATA%\Plex Home Theater\userdata\guisettings.xml
        OS X: ~/Library/Application Support/Plex Home Theater/userdata/guisettings.xml
        Linux: ~/.plexht/temp/userdata/guisettings.xml

    Einrichtung:
    - Client Socket anlegen und nach Wunsch benennen
    - Register Variable erstellen und damit dieses Skript verknüpfen
    - Skript einmal manuell ausführen damit alle Ereignisse, Profile, Variablen und Instanzen angelegt werden
    - Ereignisse konfigurieren
    - Verknüpfungen von Variablen in der Visualisierung erstellen

    von: Daniel Schäfer (@gotteshand)
    Version: 1.0
*/

$socket_id = 44103 /*[Plex Wohnzimmer]*/; // IPS ID des Client Sockets zum Plex Home Theater Client

define("PAUSED", "Pausiert");
define("PLAY", "Spielt");
define("STOPPED", "");
define("EPISODE", "Serie");
define("MOVIE", "Film");
define("PICTURE", "Foto");
define("VOLUME", "Lautstärke");
define("STATUS", "Status");
define("COVER", "Cover");
define("TITLE", "Titel");
define("SONG", "Song");



// AB HIER NICHT BEARBEITEN

if(isset($socket_id) && IPS_ObjectExists($socket_id)) {
    $socket = IPS_GetObject($socket_id);

    // Instanz
    $instance = getInstanceByIdentifier("plex_".$socket['ObjectName'], $socket['ObjectName']);
    // Variablenprofile
    $profileName = "plex.client_power";
    if(!IPS_VariableProfileExists($profileName)) {
        IPS_CreateVariableProfile($profileName, 0);
        IPS_SetVariableProfileAssociation($profileName, 0, "Ausschalten", "Power", 0xFF0000);
        IPS_SetVariableProfileAssociation($profileName, 1, "Einschalten", "Power", 0x99CC00);
    }
    $profileName = "plex.client_status";
    if(!IPS_VariableProfileExists($profileName)) {
        IPS_CreateVariableProfile($profileName, 0);
        IPS_SetVariableProfileAssociation($profileName, 0, "Inaktiv", "", -1);
        IPS_SetVariableProfileAssociation($profileName, 1, "Aktiv", "", -1);
    }
    $profileName = "plex.player_controls";
    if(!IPS_VariableProfileExists($profileName)) {
        IPS_CreateVariableProfile($profileName, 1);
        IPS_SetVariableProfileAssociation($profileName, 0, "Prev", "", -1);
        IPS_SetVariableProfileAssociation($profileName, 1, "Stop", "", 0xFF0000);
        IPS_SetVariableProfileAssociation($profileName, 2, "Pause", "", 0xFFCC00);
        IPS_SetVariableProfileAssociation($profileName, 3, "Play", "", 0x99CC00);
        IPS_SetVariableProfileAssociation($profileName, 4, "Next", "", -1);
    }
    $profileName = "plex.movement_controls";
    if(!IPS_VariableProfileExists($profileName)) {
        IPS_CreateVariableProfile($profileName, 1);
        IPS_SetVariableProfileAssociation($profileName, 0, "Hoch", "", -1);
        IPS_SetVariableProfileAssociation($profileName, 1, "Runter", "", -1);
        IPS_SetVariableProfileAssociation($profileName, 2, "Links", "", -1);
        IPS_SetVariableProfileAssociation($profileName, 3, "Rechts", "", -1);
        IPS_SetVariableProfileAssociation($profileName, 4, "Auswahl", "", -1);
        IPS_SetVariableProfileAssociation($profileName, 5, "Zurück", "", -1);
    }
    $profileName = "plex.on_off";
    if(!IPS_VariableProfileExists($profileName)) {
        IPS_CreateVariableProfile($profileName, 0);
        IPS_SetVariableProfileAssociation($profileName, 0, "Aus", "", -1);
        IPS_SetVariableProfileAssociation($profileName, 1, "Ein", "", 0x99CC00);
    }
    $profileName = "plex.repeat";
    if(!IPS_VariableProfileExists($profileName)) {
        IPS_CreateVariableProfile($profileName, 1);
        IPS_SetVariableProfileAssociation($profileName, 0, "Aus", "", -1);
        IPS_SetVariableProfileAssociation($profileName, 1, "Aktuelles", "", 0x99CC00);
        IPS_SetVariableProfileAssociation($profileName, 2, "Alle", "", 0x99CC00);
    }
    // Variablen
    $_power = getVariableByIdentifier("plex_".$socket['ObjectName']."_power", $instance, "Zustand", 0, "plex.client_power", null, $_IPS['SELF'], "Power", null, false);
    $_cover = getVariableByIdentifier("plex_".$socket['ObjectName']."_cover", $instance, COVER, 3, null, 0, null, "Image", null, false);
    $_title = getVariableByIdentifier("plex_".$socket['ObjectName']."_title", $instance, TITLE, 3, null, 1, null, "Information", null, false);
    $_player_controls = getVariableByIdentifier("plex_".$socket['ObjectName']."_player_controls", $instance, "Wiedergabe", 1, "plex.player_controls", 2, $_IPS['SELF'], "ArrowRight", null, false);
    $_movement_controls = getVariableByIdentifier("plex_".$socket['ObjectName']."_movement_controls", $instance, "Steuerung", 1, "plex.movement_controls", 3, $_IPS['SELF'], "Gear", null, false);
    $_volume = getVariableByIdentifier("plex_".$socket['ObjectName']."_volume", $instance, VOLUME, 1, "~Intensity.100", 4, $_IPS['SELF'], "Speaker", null, false);
    $_client_status = getVariableByIdentifier("plex_".$socket['ObjectName']."_client_status", $instance, null, 0, "plex.client_status", null, null, "Power", null, false);
    $_status = getVariableByIdentifier("plex_".$socket['ObjectName']."_status", $instance, STATUS, 3, null, null, null, null, null, false);
    $_playerid = getVariableByIdentifier("plex_".$socket['ObjectName']."_playerid", $instance, null, 3, null, 0, null, null, null, false);
    $_shuffle = getVariableByIdentifier("plex_".$socket['ObjectName']."_shuffle", $instance, "Zufallsmodus", 0, "plex.on_off", null, $_IPS['SELF'], "Shuffle", null, false);
    $_repeat = getVariableByIdentifier("plex_".$socket['ObjectName']."_repeat", $instance, "Wiederholung", 1, "plex.repeat", null, $_IPS['SELF'], "Repeat", null, false);
    $_HTML = getVariableByIdentifier("plex_".$socket['ObjectName']."_html", $instance, "HTML", 3, "~HTMLBox", null, null, null, null, false);
    $_serverip = getVariableByIdentifier("plex_".$socket['ObjectName']."_serverip", $instance, "Plex Media Server IP Adresse", 3, null, 1, null, null, null, true);
    $_serverport = getVariableByIdentifier("plex_".$socket['ObjectName']."_serverport", $instance, "Plex Media Server Port (Standard: 32400)", 3, null, 1, null, null, null, true);
    $_clientip = getVariableByIdentifier("plex_".$socket['ObjectName']."_clientip", $instance, "Plex Home Theater Client IP Adresse", 3, null, 1, null, null, null, true);
    $_clientport = getVariableByIdentifier("plex_".$socket['ObjectName']."_clientport", $instance, "Plex Home Theater Client Port (Standard: 3005)", 3, null, 1, null, null, null, true);
    $_clientmac = getVariableByIdentifier("plex_".$socket['ObjectName']."_clientmac", $instance, "Plex Home Theater Client MAC Adresse (WOL)", 3, null, 1, null, null, null, true);
	 // Ereignis
    $_event = getEventByIdentifierAndType("plex_".$socket['ObjectName']."_checkevent", $_IPS['SELF'], 1);
    
    
	 $media_server_ip = GetValue($_serverip);
	 $media_server_port = GetValue($_serverport);
	 $client_ip = GetValue($_clientip);
	 $client_port = GetValue($_clientport);
	 $client_mac = GetValue($_clientmac);

    if($_IPS['SENDER'] == "RegisterVariable" && isset($_IPS['VALUE']) && strlen($_IPS['VALUE']) > 0) { // Ausführung durch Socket => Reaktion auf Client Information
        $JSON = json_decode($_IPS['VALUE']);

        // Laufzeitverhalten der Plex Instanz
        if(isset($JSON->method)) {
            switch ($JSON->method) {
                case 'Player.OnPause':
                    SetValue($_status, PAUSED);
                    SetValue($_player_controls, 2);
                    break;
                case 'Player.OnPlay':
                    SetValue($_status, PLAY);
                    SetValue($_player_controls, 3);

                    if(isset($JSON->params->data->item)) {
                        $item = $JSON->params->data->item;
                        $player_id = -1;
                        switch ($item->type) {
                            case 'episode':
                                $properties = '["title", "rating", "year", "genre", "duration", "thumbnail", "season", "episode", "plot", "cast", "showtitle", "streamdetails"]';
                                $player_id = 1;
                                break;
                            case 'movie':
                                $properties = '["title", "rating", "year", "genre", "duration", "thumbnail", "plot", "cast", "streamdetails"]';
                                $player_id = 1;
                                break;
                            case 'picture':
                                $properties = '["title", "year", "thumbnail"]';
                                $player_id = 1;
                                break;
                            case 'song':
                                $properties = '["title", "artist", "albumartist", "year", "genre", "album", "track", "duration", "thumbnail", "disc"]';
                                $player_id = 0;
                                break;
                        }

                        SetValue($_playerid, $player_id);
                        if($player_id >= 0)
                            CSCK_SendText($socket_id, '{"jsonrpc":"2.0","method":"Player.GetItem","params":{"playerid":'.$player_id.', "properties": '.$properties.'},"id":1}');
                    }
                    break;
                case 'Player.OnStop':
                    SetValue($_title, "");
                    SetValue($_status, STOPPED);
                    SetValue($_player_controls, 0);
                    SetValue($_cover, "");
                    SetValue($_playerid, "");
                    break;
                case 'Application.OnVolumeChanged':
                    SetValue($_volume, $JSON->params->data->volume);
                    break;
                case 'Player.OnPropertyChanged':
                    if(isset($JSON->params->data->property)) {
                        if(isset($JSON->params->data->property->repeat)) {
                            $value = $JSON->params->data->property->repeat;
                            if($value == "off")
                                $value = 0;
                            else if($value == "one")
                                $value = 1;
                            else if($value == "all")
                                $value = 2;
                            SetValue($_repeat, $value);
                        }
                        else if(isset($JSON->params->data->property->shuffled)) {
                            $value = $JSON->params->data->property->shuffled;
                            if($value == 0)
                                $value = 0;
                            else if($value == 1)
                                $value = 1;
                            SetValue($_shuffle, $value);
                        }
                    }
                    break;
                case 'System.OnQuit':
                    close();
                default:
                    break;
            }
        }

        // Rückantworten auf Anfragen
        if(isset($JSON->result)) {
            $result = $JSON->result;

            if(isset($result->item)) {
                $item = $result->item;
                $title = "";

                // cover
                if(isset($item->thumbnail) && strlen($item->thumbnail) > 0) {
                    $tmp = explode("url=", urldecode(urldecode($item->thumbnail)));
                    $url = $tmp[1];
                    $url = str_replace("127.0.0.1", $media_server_ip, $url);
                    $cover_bindata = "<img class='plex_cover' src='".$url."'>";
                    SetValue($_cover, $cover_bindata);
                } else {
                    SetValue($_cover, "");
                }

                // titel zusammenbauen
                if(isset($item->artist)) {
                    $title = $item->artist[0]." - ";
                }
                if(isset($item->showtitle)) {
                    $title = utf8_decode($item->showtitle." - ");
                }
                if(isset($item->label)) {
                    $title .= $item->label;
                }
                if(isset($item->album)) {
                    $title .= " [".$item->album."]";
                }
                if(isset($item->season) && isset($item->episode)) {
                    $title .= " [S".$item->season."E".$item->episode."]";
                }
                SetValue($_title, $title);
            }
        }
    }
    else if($_IPS['SENDER'] == "WebFront" && isset($_IPS['VALUE'])) { // Steuerung des Clients via Webfrontend
        $socket = IPS_GetObject($socket_id);
        $player_id = GetValue($_playerid);

        $command = "";
        switch (unifyIdent(IPS_GetObject($_IPS['VARIABLE'])['ObjectIdent'])) {
            case unifyIdent("plex_".$socket['ObjectName']."_volume"): // volume
                $command = '{"jsonrpc":"2.0","method":"Application.SetVolume","params":{"volume": '.$_IPS['VALUE'].'},"id":1}';
                break;
            case unifyIdent("plex_".$socket['ObjectName']."_player_controls"): // player control
                switch($_IPS['VALUE']) {
                    case 0: // prev
                        if($player_id >= 0)
                            $command = '{"jsonrpc":"2.0","method":"Player.GoTo","params":{"playerid":'.$player_id.', "to":"previous"},"id":1}';
                        break;
                    case 1: // stop
                        if($player_id >= 0)
                            $command = '{"jsonrpc":"2.0","method":"Player.Stop","params":{"playerid":'.$player_id.'},"id":1}';
                        break;
                    case 2: // pause
                        if($player_id >= 0)
                            $command = '{"jsonrpc":"2.0","method":"Player.PlayPause","params":{"playerid":'.$player_id.'},"id":1}';
                        break;
                    case 3: // play
                        if($player_id >= 0)
                            $command = '{"jsonrpc":"2.0","method":"Player.PlayPause","params":{"playerid":'.$player_id.'},"id":1}';
                        break;
                    case 4: // next
                        if($player_id >= 0)
                         $command = '{"jsonrpc":"2.0","method":"Player.GoTo","params":{"playerid":'.$player_id.', "to":"next"},"id":1}';
                        break;
                }
                break;
            case unifyIdent("plex_".$socket['ObjectName']."_movement_controls"): // player control
                switch($_IPS['VALUE']) {
                    case 0: // hoch
                        $command = '{"jsonrpc":"2.0","method":"Input.Up","params":{},"id":1}';
                        break;
                    case 1: // runter
                        $command = '{"jsonrpc":"2.0","method":"Input.Down","params":{},"id":1}';
                        break;
                    case 2: // links
                        $command = '{"jsonrpc":"2.0","method":"Input.Left","params":{},"id":1}';
                        break;
                    case 3: // rechts
                        $command = '{"jsonrpc":"2.0","method":"Input.Right","params":{},"id":1}';
                        break;
                    case 4: // auswahl
                        $command = '{"jsonrpc":"2.0","method":"Input.Select","params":{},"id":1}';
                        break;
                    case 5: // zurück
                        $command = '{"jsonrpc":"2.0","method":"Input.Back","params":{},"id":1}';
                        break;
                }
                break;
            case unifyIdent("plex_".$socket['ObjectName']."_repeat"): // repeat
                switch($_IPS['VALUE']) {
                    case 0: // aus
                        if($player_id >= 0)
                            $command = '{"jsonrpc":"2.0","method":"Player.SetRepeat","params":{"playerid":'.$player_id.', "repeat":"off"},"id":1}';
                        break;
                    case 1: // aktuelles
                        if($player_id >= 0)
                            $command = '{"jsonrpc":"2.0","method":"Player.SetRepeat","params":{"playerid":'.$player_id.', "repeat":"one"},"id":1}';
                        break;
                    case 2: // alle
                        if($player_id >= 0)
                            $command = '{"jsonrpc":"2.0","method":"Player.SetRepeat","params":{"playerid":'.$player_id.', "repeat":"all"},"id":1}';
                        break;
                }
                break;
            case unifyIdent("plex_".$socket['ObjectName']."_shuffle"): // repeat
                switch($_IPS['VALUE']) {
                    case 0: // aus
                        if($player_id >= 0)
                            $command = '{"jsonrpc":"2.0","method":"Player.SetShuffle","params":{"playerid":'.$player_id.', "shuffle":"toggle"},"id":1}';
                        break;
                    case 1: // aktuelles
                        if($player_id >= 0)
                            $command = '{"jsonrpc":"2.0","method":"Player.SetShuffle","params":{"playerid":'.$player_id.', "shuffle":"toggle"},"id":1}';
                        break;
                }
                break;
            case unifyIdent("plex_".$socket['ObjectName']."_power"): // repeat
                switch($_IPS['VALUE']) {
                    case 0: // Ausschalten inkl. Herunterfahren des Systems
                            $command = '{"jsonrpc":"2.0","method":"System.Shutdown","params":{},"id":1}';
                        break;
                    case 1: // Einschalten
								wake($client_mac);
                        break;
                }
                break;
        }

        if(strlen($command) > 0)
            CSCK_SendText($socket_id, $command);

        SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
    } else if($_IPS['SENDER'] == "TimerEvent") { // Ausführung gemäß des Ereignisses um je nach Verfügbarkeit des Clients den Socket zu (de)aktivieren
        $socket = IPS_GetInstance($socket_id);

        if(checkMediaClient($client_ip, $client_port) && $socket['InstanceStatus'] == 104) {
            // Socket öffnen
            open();
        } else if(!checkMediaClient($client_ip, $client_port) && ($socket['InstanceStatus'] == 102 || $socket['InstanceStatus'] >= 200)) {
            // Socket schließen
            close();
        }
    }
} else {
    LogMessage("Fehler: Socket ID nicht gesetzt oder ungültig!");
}


function queryMediaServer($query) {
    global $media_server_ip, $media_server_port;

    try {
        $read = file_get_contents("http://".$media_server_ip.":".$media_server_port.$query);
        $xml = simplexml_load_string($read);
        return $xml;
    } catch (Exception $e){
        return null;
    }
}

// Prüft ob der Media Client verfügbar ist
function checkMediaClient($ip, $port=3005) {
    $status = @fsockopen ($ip, $port, $errno, $errstr, 1);
    if(!$status){
        return false;
    } else {
        return true;
    }
}


function open() {
    global $socket_id, $_client_status, $_player_controls, $_power;

    SetValue($_client_status, true);
    SetValue($_power, true);
    SetValue($_player_controls, 0);

    CSCK_SetOpen($socket_id, true);
    IPS_ApplyChanges($socket_id);
    LogMessage("Socket wurde geöffnet.");
}

function close() {
    global $socket_id, $_title, $_status, $_cover, $_playerid, $_shuffle, $_repeat, $_client_status, $_power;

    SetValue($_client_status, false);
    SetValue($_power, false);
    
    // Socket schließen
    CSCK_SetOpen($socket_id, false);
    IPS_ApplyChanges($socket_id);
    LogMessage("Socket wurde geschlossen.");

    SetValue($_title, "");
    SetValue($_status, "");
    SetValue($_cover, "");
    SetValue($_playerid, -1);
    SetValue($_shuffle, 0);
    SetValue($_repeat, 0);
}

?>

Danke für das Script, aber leider funktioniert es nicht:

Fatal error: Call to undefined function getInstanceByIdentifier() in C:\IP-Symcon\scripts\53636.ips.php on line 47

Kannst du mir verraten, wie ich deine Methoden zum Anlegen der Variablen zum laufen bekomme ?

Falls jemand anderes darüber stolpert. Das sind meine Hilfsfunktionen die einfach nur Variablen anlegen.
Die kann man auch einfach ersetzen, durch die passenden IPS Befehle. Das Skript soll nur verdeutlichen was Möglich ist und wie man es im Ansatz machen kann.

Ich bekomme es nicht hin, das der Clientsocket Daten zu Plex sendet oder empfängt :frowning:

Der Clientsocket ist mit der IP des PHT Client versehen und hat den Port 3005 zugewiesen. Er ist auch verbunden.

Wenn man dann mit diesem Script es testet:

<?
$socket_id = 14778 /*[PLE Client Socket]*/; // IPS ID des Client Sockets zum Plex Home Theater Client

//CSCK_SendText($socket_id, '{"jsonrpc":"2.0","method":"Player.GetItem","params":{"playerid":'.$player_id.', "properties": '.$properties.'},"id":1}');
CSCK_SendText($socket_id, '{"jsonrpc":"2.0","method":"Player.GetProperties","params":{"properties":["speed"],"playerid":1},"id":1}');
?>

Passiert nix ! Beim Debug vom C.S. sieht man nur, das die Daten gesendet wurden, aber beim PHT Client passiert nix und man bekommt keine Antwort…

Und bevor Ihr fagt: Ja ich habe diese Änderungen gemacht :

Es muss in den Programmeinstellungen unter Services die Steuerung via HTTP aktiviert werden.
Außerdem muss die Datei guisettings.xml mit folgendem Inhalt erstellt werden:
true

Die Datei muss sich in folgendem Ordner befinden (Systemabhängig):
    Windows: %APPDATA%\Plex Home Theater\userdata\guisettings.xml
    OS X: ~/Library/Application Support/Plex Home Theater/userdata/guisettings.xml
    Linux: ~/.plexht/temp/userdata/guisettings.xml

Ich weis nicht mehr weiter, habe schon 4 PHT Clients auf verschiedenen Systemen ausprobiert, bei allen das selbe :frowning:

Das merkwürdige ist nur, wenn ich es so mache :

$ant=@Sys_GetURLContent('http://192.168.0.3:3005/jsonrpc?request={"jsonrpc":"2.0","method":"Player.GetProperties","params":{"properties":["speed"],"playerid":1},"id":1}');

Klappt es ! Aber warum will das nicht über den C.S. gehen ?

Ich stelle das gerade mal bei mir nach mit nem Plex Client auf dem Desktop Rechner, moment.

Habe dein Problem gefunden!
Verbinde dich mal nicht auf Port 3005, sondern auf Port 9090.

Hallo, sowohl Port 9090 als auch der andere genannte sind mittlerweile nicht mehr erreichbar.
Hat hier jemand eine Info zu? Ich nutze die Aktuellste PMS Version auf Windows.

schau mal :

Plex Home Theater Modul