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