Plex Home Theater Modul

Das kommt drauf an, wenn man pro Client so oder so einen Webhook anlegen muss reicht es ja aus eine Client Instanz zu behalten auf die dann der Webhook geht. Wenn es nur einen Webhook für alle Geräte gibt sollte man einen IO ergänzen. Auf alle Fälle sollte man das Modul dann ergänzen, damit die GUIDs erhalten bleiben. Ich muss mir das mal später anschauen, wie das mit dem Webhook geht, ich habe bei mir ja einen im Plex Server hinterlegt, ob diese zentral oder pro Client ist.

Es wird ein Webhook benötigt, dort wird anscheinend alles übergeben für alle Clients, dieser Webhook wird nur dafür benötigt um Daten abzugreifen, nicht um irgendwas zu steuern.
Ich bleibe bei der Meinung, dass man von Grund auf neu anfangen sollte! Es ist einfach eine ganz andere Art der Kommunikation.

Naja, ich werde es zumindest für mich tun.

Grüße,
Kai

Danke dir, auch für die PN, ich antworte dir auf dem Wege.

Wir haben mal geschaut das sollte sich schnell ergänzen lassen. Ich nutze zur Zeit ein Webhook mit einem Skript. KaiS bastelt eine Klasse zur generellen Steuerung für alle Clients. Das einzige was Du mal schauen müsstest ist ob in Plex unter Account Zugriff auf einen Webhook hast. Ich glaube das ist ein Plex Pass Feature, dann kannst Du aber von allen Clients auch die Filminfos wie Cover oder Schauspieler darstellen.

Hallo,

richtig, Webhooks sollen nur mit dem Plex Pass funktionieren.

Grüße,
Kai

Webhooks habe ich im Plex Pass.
Was genau muss da als URL rein?

Um die Sessions auszulesen habe ich das hier gefunden.
das klappt auch schon mal.

http://<CLIENT IP>:<CLIENT PORT>/status/sessions

Wie muss der Webhook aussehen, damit die Werte oder das XML nach IPS kommen, bzw. was muss in IPS gemacht werden?

Grüße

Das ist davon abhängig wie das funktionieren soll. Wenn es nur lokal funktionieren soll, kannst Du da eine lokale IP des IP-Symcon Servers mit Webhook eintragen. Wenn es global funktionieren soll brauchst Du z.B. eine Subskription, dann kannst Du dort die IP-Smycon Connect Adresse eintragen, dann ist es egal wo der Plex Server steht bzw. wo der IP-Symcon Server lokalisiert ist. Bei mir ist dort die IP-Symcon Connect Adresse hinterlegt.

Sieht dann z.B. so aus


https://webhookplexuser:webhookplexpassword@123456789.ipmagic.de/hook/plex

die URL setzt sich zusammen aus dem Webhook Usernamen, dem Webhook Passwort und der IP-Symcon Connect Adresse sowie dem Webhook.

Wenn das ganze lokal wäre würde das so aussehen:


https://webhookplexuser:webhookplexpassword@192.168.1.1:3777/hook/plex

Das werden wir wohl im Modul ergänzen, auf die Schnelle kannst Du das aber selber einrichten.

Im Objektbaum an einer Stelle eine Kategorie (CTRL+0) anlegen z.B. Plex nennen. Darunter ein Skript (CTRL+3) anlegen und z.B. Plex Webhook Interface nennen.

in das Skript kopierst Du folgenden Inhalt


<?
$username = "plex";
		$password = "ips4";
		if(!isset($_SERVER['PHP_AUTH_USER']))
			$_SERVER['PHP_AUTH_USER'] = "";
		if(!isset($_SERVER['PHP_AUTH_PW']))
			$_SERVER['PHP_AUTH_PW'] = "";
			 
		if(($_SERVER['PHP_AUTH_USER'] != $username) || ($_SERVER['PHP_AUTH_PW'] != $password))
			{
			header('WWW-Authenticate: Basic Realm="Plex WebHook"');
			header('HTTP/1.0 401 Unauthorized');
			echo "Authorization required";
			return;
			}
		echo "Webhook Plex IP-Symcon";
			
		//workaround for bug
		if(!isset($_IPS))
			global $_IPS;
		if($_IPS['SENDER'] == "Execute")
			{
			echo "This script cannot be used this way.";
			return;
			} 
		
		 	 		 
		 # Capture JSON content
		$plexjson = $_POST["payload"];

		$data = json_decode($plexjson);
		
		$event = $data->event;
		var_dump($event);
		$user = $data->user;
		var_dump($user);
		$owner = $data->owner;
		var_dump($owner);
		$account = $data->Account;
		$accountname = $account->title;
		$accountpic = $account->thumb;
		var_dump($accountname);
		var_dump($accountpic);
		$server = $data->Server;
		$servername = $server->title;
		$serveruuid = $server->uuid;
		var_dump($servername);
		var_dump($serveruuid);
		$player = $data->Player;
		$playerlocal = $player->local;
		var_dump($playerlocal);
		$playerpublicip = $player->publicAddress;
		var_dump($playerpublicip);
		$plexclientname = $player->title;
		var_dump($plexclientname);
		$plexclientuuid = $player->uuid;
		var_dump($plexclientuuid);
		$metadata = $data->Metadata;
		$librarysectiontype = $metadata->librarySectionType;
		var_dump($librarysectiontype);
		$ratingkey = $metadata->ratingKey;
		var_dump($ratingkey);
		$ratingkeydata = $metadata->key;
		var_dump($ratingkeydata);
		$guid = $metadata->guid;
		var_dump($guid);
		$sectionid = $metadata->librarySectionID;
		var_dump($sectionid);
		$studio = $metadata->studio;
		var_dump($studio);
		$plextype = $metadata->type;
		var_dump($plextype);
		$plextitle = $metadata->title;
		var_dump($plextitle);
		$plexoriginaltitle = $metadata->originalTitle;
		var_dump($plexoriginaltitle);
		$contentrating = $metadata->contentRating;
		var_dump($contentrating);
		$summary = $metadata->summary;
		var_dump($summary);
		$rating = $metadata->rating;
		var_dump($rating);
		$viewoffset = $metadata->viewOffset;
		$viewcount = $metadata->viewCount;
		$lastviewedat = $metadata->lastViewedAt;
		$year = $metadata->year;
		var_dump($year);
		$tagline = $metadata->tagline;
		var_dump($tagline);
		$thumb = $metadata->thumb;
		var_dump($thumb);
		$art = $metadata->art;
		var_dump($art);
		$duration = $metadata->duration;
		$originallyavailableat = $metadata->originallyAvailableAt;
		$addedat = $metadata->addedAt;
		$updatedat = $metadata->updatedAt;
		$chaptersource = $metadata->chapterSource;
		$primaryextrakey = $metadata->primaryExtraKey;
		$genreinfo = $metadata->Genre;  // Array
		foreach($genreinfo as $key => $genre)
		{
			$genre = $genre->tag;
			var_dump($genre);
		}
		$directorinfo = $metadata->Director;
		foreach($directorinfo as $key => $director)
		{
			$director = $director->tag;
			var_dump($director);
		}
		$writerinfo = $metadata->Writer;
		foreach($writerinfo as $key => $writer)
		{
			$writer = $writer->tag;
			var_dump($writer);
		}
		$producerinfo = $metadata->Producer;
		foreach($producerinfo as $key => $producer)
		{
			$producer = $producer->tag;
			var_dump($producer);
		}
		$countryinfo = $metadata->Country;
		foreach($countryinfo as $key => $country)
		{
			$country = $country->tag;
			var_dump($country);
		}
		$roleinfo = $metadata->Role;
		foreach($roleinfo as $key => $cast)
		{
			$actor = $cast->tag;
			var_dump($actor);
			$role = $cast->role;
			var_dump($role);
			$actorpic = $cast->thumb;
			var_dump($actorpic);
			
		} 
?>

Du müstest dann an allen Stellen im Skript an dem zur Zeit ein var_dump steht den Wert dann abspeichern. Entweder in eine einzelne Variable (CTRL+2) mit


SetValue(12345, $value); //12345 ist die Objekt ID der Varibale und $value der Wert den Du abspeichern willst.

oder aber auch mehrer Variablen als Webseite gesetzt in einer String Variable mit dem Variablenprofil ~HTMLBox. So könntest Du Dir dann Deine eigene Ansicht zusammen bauen mit den übergebenen Werten.

Im Objektbaum unter Kern Instanzen -> Webhook nun einen neuen Webhook anlegen /hook/plex und mit dem Skript Plex Webhook Interface, das vorher erstellt wurde, verlinken.

Jetzt kommen dann jedes mal, wenn Plex etwas macht, Daten in IP-Symcon auf dem Skript an und werden ausgewertet.

Das ist fürs Grobe, sobald das im Modul drinnen ist muss dann der Webhook wieder gelöscht werden, dann ist das Modul selber der Endpunkt für den Webhook und nicht mehr ein Skript.

Das Modul selber wertet dann zunächst noch den Client aus und schreibt nur dann Werte wenn es auch zu dem passenden Client gehört. Zur Zeit würdest Du bei dem Ansatz oben einfach nicht selektioniert Daten in IP-Symcon bekommen mit allen Clients. Falls die Zeit es zulässt kann ich das mal mal Wochenende ergänzen, dann kann man das auch im Modul ausprobieren.

Ich habe das Original Modul mal erweitert um Datenemepfang für den Webhook für jeden Client.


https://github.com/Wolbolar/SymconPlex

Zur Zeit ist eine Steuerung noch nicht eingebaut. Die Metadaten sind sehr viele, ich denke das macht nicht Sinn, die in einzelne Variablen abzulegen, da sollte man sich eher eine individuelle Webseite bauen, mit den Daten die man braucht. Die Metadaten sind im Debug Fenster der Client Instanz einsehbar und werden in der Variable Client Info abgelegt. Dort können diese bei Bedarf ausgelesen und weiter verarbeitet werden.

Wenn das so weit funktionieren sollte und noch die Steuerungsbefehle ergänzt worden sind, kann man das dann mit dem Original Modul zusammenfügen.

Ich schaue mir deine Erweiterung heute Abend mal an Fonzo.

Die Plex Home Theater Instanz ist zunächst unverändert. Neu ist eine Plex Client Instanz die einen Plex IO besitzt. Der Plex IO ist der Endpunkt für den Webhook, an den vom Plex Server geschickt wird. Dafür ist ein PlexPass notwendig um das Webhook Feature zu nutzten.

Im Plex IO ist der Webhook Username und das Webhook Passwort anzupassen. Der Hook lautet /hook/plex im Fall von IP Symcon Connect ist also im Plex Server


https://webhookplexuser:webhookplexpassword@123456789.ipmagic.de/hook/plex

einzutragen, mit eigener IP Symcon Connect Adresse austauschen sowei eigenem Webhhook User und Passwort.

Im Plex Client ist oben die UUID einzutragen, nur dann werden auch in der Plex Client Instanz Daten abgelegt. Falls die Plex UUID nicht bekannt sein sollte, reicht es das Debug Fenster der Plex Client Instanz zu öffnen und dann mit dem entsprechendem Plex Gerät etwas zu starten und zu stoppen, dann ist die UUID des Geräts im Debug Fenster lesbar.

In der Variable Client Info werden sämtliche Metadaten abgelegt. Um diese sauber darzustellen, könnte man das entweder in einer HTMLBox darstellen oder aber ziemlich viele einzelne Variablen nutzten. Letzeres empfiehlt sich wohl nur für Nutzer die ziemlich viele Variablen übrig haben, ansonsten kommt da dann bei mehreren Plex Geräten auf eine nicht zu unterschätzende Anzahl an Variablen, wenn man jede Info in einer eigenen Variable abspeichern will.

Außer das Daten aus Plex ankommen, kann die Instanz momentan noch nix, d.h. die Steuerung, so wie in Deinem Plex Home Theater Instanz, ist in der Plex Instanz noch zu ergänzen, da hatte denke ich KaiS mit angefangen was zu basteln.

Wenn jemand Muße hat und für den HTML ein Klacks ist, kann er ja gerne aus den Metadaten eine schöne HTML Seite für die HTMLBox bauen. Ist zumindest ein Grundgerüst für zukünftige Funktionserweiterungen.

Wäre halt die Frage an alle, die das Plex Modul nutzten, was denn so in der Regel benötigt wird, bzw. was noch ergänzt werden soll.

Hallo Fonzo,

dein Repo ist noch gar nicht online.
Den Hook würde ich auf dem Server einfach mit der lokalen Adresse eintragen, so geht es auch ohne Internet…

Grüße,
Kai

Oh sorry, danke für die Erinnerung, hatte das nur auf dem Entwicklungsrepository liegen.

Sollte jetzt unter


https://github.com/Wolbolar/SymconPlex

verfügbar sein und kann eingesehen bzw. ausprobiert werden. Wenn das soweit klappt und noch die Steuerungsfunktionen drinnen sind kann man dann ja mit dem Original mergen.

Hallo Fonzo,

ich werden dein Projekt forken und baue mal meine Klasse ein.
Du hast ja schon die ganzen Profile usw. mit drin, dann könnte das super schnell gehen. :slight_smile:

Grüße,
Kai

Ich habe zunächst nur den Webhook ergänzt und die Daten kommen über ReceiveData rein der Rest ist wie im Original, da muss dann wohl nur die ganze Ansteuerung abgeändert werden weil die Befehle ja andere sind.

Hallo zusammen,

nun komme ich mal endlich zum Testen.

Leider hab ich noch Schwierigkeiten…
Das PlexIO Modul ist aktiv und verbunden.

-Ich finde im Fire TV unter Plex nichts, wo ich mir die UUID holen könnte, geschweige wie ich an das Debug Fenster komme.
-Dann die Frage, was im Plex Client Modul in das Feld Client Socket rein kommt?
-Wo wird der Webhook eingetragen? Derzeit habe ich ihn im Plex Pass so hinterlegt.
https://Username:Password@IP-PlexServer:3777/hook/plex

Dann wäre noch die Frage, wie ich an die IPS-Connect Adresse komme?
Ich nutze IPS 5 per Docker. Wenn ich im IPS auf die Kerninstanz Connect klicke, kommt immer der Fehler: Element Image wird nicht unterstützt!
Und im Browser unter Console steht auch nichts.

Vielen Dank

Die UUID wird Dir im Debug Fenster des PlexIO angezeigt, wenn Daten von irgendeinem Gerät ankommen. Dazu musst Du unter I/O Instanzen im Objektbaum den Plex I/O öffnen. Ganz rechts findest Du dann ein Käfer Symbol Debug, wenn Du da drauf klickst, geht ein weiteres Fenster auf. In diesem Fenster solltest Du dann alles lesen können, was so am Webhook an Daten reinkommt.

Wenn Du auf plex.tv gehst meldest Du Dich mit Deinem Plex Konto an, dann gehst Du rechts oben auf den Account und dort auf Konto. Im Untermenü Webhooks links findest Du die Möglichkeit den Webhook einzutragen.

Die Eingabe ist so richtig, die IP-PlexServer ist die lokale IP vom Rechner, auf dem IP-Symcon läuft, Username und Passwort sind Eingabefelder im Plex IO und können dort individuell angepasst werden und dann dort entsprechend unter dem Menüpunkt Webhooks in Plex.tv eingegeben werden.

Grundsätzlich ist es zunächst mal ausreichend eine lokale IP Adresse dort einzutragen, das sollte in vielen Fällen ausreichen. Wenn man ganz sicher gehen will kann man dort dann auch IP-Symcon Connect Adresse eintragen, dann funktioniert das immer. IP-Symcon Connect ist ein Bestandteil einer Subskription von IP-Symcon, insofern Du also eine IP-Symcon Subskription abschließt, bekommst Du eine IP-Symcon Connect Adresse zugewiesen und kannst diese dann auch noch für andere Dinge nutzten wie Google Home, Alexa, Custom Skill für Alexa, bzw. um von überall auf das System zugreifen zu können. Um zunächst mal Plex mit IP-Symcon die Daten auswerten zu können bzw. einen Plex Client zu steuern, ist nicht zwingend IP-Symcon Connect notwendig, wenn man es aber so oder so besitzt, sollte man dort dann auch die IP-Symcon Connect Adresse eintragen.

Das funktioniert ab IP-Symcon 5 nur über die Webconsole, da ein Element genutzt wird das die Legacy Konsole nicht unterstützt. So wie ich das verstanden habe testest Du ja fleißig, Du kannst auch alles testen, nur eben zur Zeit nicht IP-Symcon Connect, das kann man nur nutzen, wenn eine Lizenz vorliegt und eine gültige Subskription. Dies ist aber für Deinen Test auch nicht notwendig, da ja wohl der Plex Client und der IP-Symcon Server im gleichen Netzwerk stehen, daher ist der IP-Symcon Server über den Webhook mit lokaler IP erreichbar. Für eine eher fortgeschrittene Konfiguration bräuchtest Du dann IP-Symcon Connect, wenn Du also auf den Bahamas in der Sonne liegst :cool: und mit einem Plex Client einen Film schaust, und die Information was auf dem Plex Client läuft auf Deinem IP-Symcon Server angezeigt haben willst, der am anderen Ende der Welt steht, dann brauchst Du IP-Symcon Connect ;), sonst in dem Zusammenhang nicht unbedingt. Praktisch ist das aber auf alle Mal bzw. lohnt sich aus meiner Sicht durchaus, denn IP-Symcon Connect kann man dann auch dazu nutzten einen Custom Skill zu erstellen, dann kannst Du, wenn Bedarf besteht, z.B. mit Alexa abfragen was gerade auf Plex läuft, bzw. über Alexa ebenfalls den Plex Client steuern, so lange es Plex selber immer noch nicht fertig gebracht hat, endlich mal einen deutschen Skill für Plex zu liefern.

Hallo Fonzo,

hatte Ips Unlimited letzte Woche gekauft, da es mit mega gut gefällt.
Subscription ist also da :slight_smile:

Ich werde nachher noch mal schauen ob ich Plex dann zum laufen bekomme.

Gesendet von iPhone mit Tapatalk

Na dann viel Spass damit, da kannst Du Dich ja dann voll austoben und Variablen sind auch egal, Du kannst also für jeden Pups Eintrag von jedem Plex Client, den Dir Plex sendet, eine Variable verwenden. Eine Plex Custom Skill kannst Du dann ja auch nutzten im nächsten Schritt.

Mit IP-Symcon im Docker kenne ich mich nun nicht aus, aber eigentlich sollte wenn Du die Webconsole nutzt und dort Connect unter Kern Instanzen öffnest über Im Webfront öffnen der Webfront mit der Connect Adresse geöffnet werden. Dort kannst Du diese dann also abschreiben bzw. rauskopieren.

Vielen Dank. :slight_smile:

Im Debug Fenster sehe ich nun schon mal was. Habe dort auch die UUID rauskopiert.
Ich gehe richtig in der Annahme davon aus, dass diese dann so aussieht?
„uuid“:„9fg236f12efd01e2-com-plexapp-android“

Was kommt nun im Modul im Client Socket rein?
Wenn ich versuche das Plex IO dort einzubinden, kommt der Fehler…
„Eigenschaft Client Socket nicht gefunden“

Eigentlich brauchst Du den Client Socket zur Zeit nicht, zumindest nicht für einen normalen Client. Der Client Socket ist nur für ein Plex Home Theater zur Steuerung. Ein Steuerung bzw. Variablen ergänzen, die dann die Daten des Webhooks in Variablen ablegt, wollte KaiS ergänzen, in sofern warten wir mal ab, er hat glaube ich schon angefangen oder ist fast fertig und schiebt das dann mal demnächst zum Testen hoch. Dann muss man mal schauen was sonst noch so für einen gewöhnlichen Client ergänzt werden kann. Die Funktion der Instanz des PlexHomeTheater Client bleibt davon erst mal unberührt, funktioniert aber eben nur mit PlexHomeTheater und nicht jedem beliebigen Client. Wenn dann alles funktionieren sollte kann man das wieder zu einem Modul zusammenlegen.