Plex per FHEM und Loxone ins Smart Home integrieren
Wie man an den Blogposts der letzten Jahre unschwer erkennen kann, beschäftige ich mich neben klassischen Smart-Home-Themen auch mit Multimedia-Anwendungen. Bis vor Kurzem war die Verzahnung dieser Bereiche jedoch – zumindest bei mir – noch nicht vollständig. Das hat sich durch das neue FHEM-Modul namens “plex” in der Zwischenzeit zum Glück geändert.
Jetzt lassen sich nicht nur einzelne Plex Clients per FHEM und Loxone fernsteuern oder der Plex Media Server zu einem manuellen Update der Bibliothek bewegen, sondern endlich auch Statusinformationen der Plex-Clients in Echtzeit mitlesen. Beim Filmstart lässt sich damit die Beleuchtung automatisch herunterdimmen und beim Filmende wieder zurücksetzen. Was ich bisher in Kombination mit FHEM und Loxone umgesetzt habe, ist Inhalt des nachfolgenden Blogpost.
Plex Clients – Statusinformationen auslesen
Am FHEM-Modul von justme1968 wird aktuell noch kräftig geschraubt, die relevanten Grundfunktionen sind aber bereits jetzt vorhanden. An dieser Stelle vielen lieben Dank an Andre, den netten Entwickler des Moduls, mit dem ich mittlerweile auch direkt in Kontakt bin.
Damit das FHEM-Modul funktioniert, muss erst einmal auf dem System (hier ein RPI 3 (Affiliate-Link) mit Jessie, wie hier beschrieben) die Erweiterung “Multicast” per Konsole nachinstalliert werden.
sudo apt-get install libio-socket-multicast-perl
Danach die FHEM-Kommandozeile im Webinterface folgenden Befehl einfügen
define Plex plex
und mit Enter bestätigen, um das globale “Plex”-Device in FHEM zu definieren.
Kurze Zeit später sollten die Clients auch schon per Autodiscovery hinzugefügt und im Raum “plex” zu finden sein.
Die Clients bekommen als Bezeichnung dabei ihre eindeutige Plex-ID (machineIdentifier) – hier z.B. 46h4yvj1s0k7lul6z8v9009 – verpasst, was etwas unschön ist. Deshalb am besten direkt per FHEM-Konsolenbefehl umbenennen.
rename 46h4yvj1s0k7lul6z8v9009 SZ.PMP
In der Device-Detailansicht lässt sich dann auch das vorher automatisch vergebene “alias” löschen, das jetzt durch die Anpassung des Device-Namens nicht mehr benötigt wird.
Um alle erkannten Clients anzuzeigen, kann auch der Befehl
get Plex clients
genutzt werden.
Manchmal kann es dabei dauern, bis alle Clients gefunden werden. Spätestens nach einer aktiven Wiedergabe sollte der Client aber auftauchen.
Dabei kann es auch vorkommen, dass auch Clients auftauchen und als Devices angelegt werden, die man gar nicht möchte. In diesem Fall kann das nicht gewünschte Device-Namen der Clients – hier “jays6” und “f66dwo6amd” – mit nachfolgendem Befehl dauerhaft ignoriert werden:
attr Plex ignoredClients jays6s,f66dwo6amd
Wer das zentrale FHEM-Plex-Device bei myPlex registrieren möchte – später wichtig zur Einbindung von Plex Servern, die bei myPlex angemeldet sind – fügt diesen FHEM-Konsolenbefehl aus:
get Plex pin
Der im Pop-Up angezeigte Pin wird dann unter https://www.plex.tv/pin eingetragen. Ab sofort kann das FHEM-Plex-Device auf alle myPlex-Geräte zugreifen.
Das lässt sich mit nachfolgendem FHEM-Konsolenbefehl überprüfen:
get Plex servers
Jetzt sollten alle verfügbaren Server, sowohl lokal als auch über myPlex erreichbar – aufgelistet werden.
Auch sollte neben dem vergebenen Servernamen dessen “machineIdentifier” angezeigt werden. Dieser kann genutzt werden, um den jeweiligen Server in FHEM als eigenes Device anzulegen. Hierbei ist es nämlich so, dass ausschließlich Clients automatisch in FHEM angelegt werden.
Server müssen hingegen manuell hinzugefügt werden. Das funktioniert dann mit dem FHEM-Konsolenbefehl
set Plex autocreate 46h4yvj1s0k7lul6z8v9009
Der klobige Servername kann jetzt – wie oben beim Client auch – per rename-Befehl umbenannt werden:
rename 46h4yvj1s0k7lul6z8v9009 PMSEN
Alternativ können lokale Server aber auch direkt über Ihre IP-Adresse mit dem Befehl
define PMSEN plex 192.168.3.58
hinzugefügt werden.
Um alle Änderungen dauerhaft zu speichern, jetzt noch im FHEM-Interface direkt auf “Save config” (links oben) klicken.
Aber zurück zum Client, in diesem Fall ein PMP auf Intel NUC-Basis, wie er im Artikel Intel NUC Skylake: HowTo zum perfekten PLEX-Client fürs Heimkino vorgestellt wurde.
FHEM hat jetzt mehrere interessante Readings, die später für Automatisierungszwecke genutzt werden können. Dazu zählt bspw. “presence”, um zu visualisieren, ob der Client verfügbar ist. Im Reading “currentTitle” wird der aktuelle Titel angezeigt und im Reading “cover” sogar die URL, unter der das entsprechende Coverbild zwecks Visualisierung aufgerufen werden kann.
Für das nachfolgende Beispiel wird der Status (“state”) genutzt, welcher den aktuellen Wiedergabestatus abbildet.
Folgende Werte können dabei genutzt werden:
- disappeared
- stopped
- video:paused
- video:buffering
- video:playing
Damit kann man direkt in FHEM Schaltbefehle auslösen, um bspw. die eingebundene Deckenlampe beim Wiedergabestart eines Videos auf 20% zu dimmen:
define SZMoviePlaying notify SZ.PMP.video.playing set SZ.Deckenlampe 20
Beim Stoppen eines Videos kann die Deckenlampe dann wieder auf 50% gedimmt werden:
define SZMovieStopped notify SZ.PMP.stopped set SZ.Deckenlampe 50
An dieser Stelle macht es natürlich Sinn je nach Anwendungsfall die Befehle mit weiteren Bedingungen aufzurüsten, damit die Beleuchtung nur in ganz bestimmten Fällen (z.B. bei Dunkelheit etc.) geschaltet wird. Hier kann sich jeder selbst austoben und seine Lösung gerne per Kommentar mitteilen.
Alle relevanten get-, set- und sonstigen Befehle befinden sich in der FHEM-Commandref für Plex.
Ich selbst verzichte an dieser Stelle auf jegliche Notify-Anweisungen, da ich die Client-Infos per UDP/HTTP an Loxone weitergebe und von dort aus die weiteren Regeln definiere. Wie ich hier vorgehe, ist nachfolgend beschrieben.
Client-Daten an Loxone weitergeben
Alle Grundlagen dazu sind im Artikel Integration: Daten zwischen Loxone und FHEM austauschen und dessen Nachfolgeposts ausführlich beschrieben.
Hier deshalb nur der genutzte Code aus der 99myUtils.pm:
#PMPToLoxone #device: #1 presence (present, absent) #2 state (disappeared, stopped, video:paused, video:buffering, video:playing) sub PMPToLoxone($) { my ($device) = @_; my $presence = ReadingsVal("$device","presence","-1"); if ($presence eq "absent") { $presence = "0"; } if ($presence eq "present") { $presence = "1"; } my $state = ReadingsVal("$device","state","-1"); if ($state eq "disappeared") { $state = "0"; } if ($state eq "stopped") { $state = "1"; } if ($state eq "video:paused") { $state = "2"; } if ($state eq "video:buffering") { $state = "3"; } if ($state eq "video:playing") { $state = "4"; } UDP_Msg("192.168.3.11" , "7000" , "$device:plex $presence $state"); }
Der passende Trigger in der fhem.cfg sieht so aus:
define PMPToLoxone notify .*PMP.* {PMPToLoxone("$NAME")}
Client-Daten in Loxone nutzen
In Loxone werden die übermittelten Informationen per virtuellem UDP-Eingang umgesetzt. Für SZ.PMP.1.present lautet die Befehlskennung
SZ.PMP:plex \v
Für SZ.PMP.2.state dann entsprechend
SZ.PMP:plex \# \v
Denn hier ist da der zweit übergebene Wert relevant.
Den derzeitig abgespielten Titel habe ich zusätzlich noch versucht per virtuellem HTTP-Eingang von FHEM an SZ.PMP.Title (in Loxone unter Anschluss VTI1 geführt) zu übertragen. Dabei bin ich aber kläglich gescheitert, da ich in FHEM den Wert als Variable einfach nicht per wget oder curl in einem notify übertragen konnte… Wer das schon geschafft hat, bitte einen Beispielcode per Kommentar mitteilen.
Hier der entsprechende Ansatz in der 99_myUtils.pm, der noch nicht passt:
#PMPTitleToLoxone sub PMPTitleToLoxone($) { my ($device) = @_; system("curl -s 'http://admin:password@192.168.3.11/dev/sps/io/VTI1/TITLE'"); }
Statt TITLE muss eben das Reading currentTitle verwendet werden…
my $TITLE = ReadingsVal("$device","currentTitle","-1");
Aber zurück zu Loxone…
Durch ein Status-Element werden die übertragenen UDP-Elemente aufbereitet.
Wenn der PMP nicht offline ist und eine Wiedergabe läuft (Play (Video)) oder gerade noch gestartet wird (Buffering (Video)), wird der Statuswert des Ausgangs auf 1 geschaltet.
Dieser Wert wird dann per Merker weitergereicht an eine doch etwas komplexere Steuerung.
Hier noch der Status PMP Autolicht im Detail:
In diesem Konstrukt geht es im Grund “nur” darum, dem Lichtsteuerungmodul einen Impuls bei Filmstart (Lichtszene 2 – Movie) bzw. bei Filmstop (Lichtszene 1 – Chill) zu verpassen, um bspw. die angeschlossenen Philips hue-Lampen (Affiliate-Link) anzusteuern. Mehr Infos dazu im Blogpost Philips hue – So klappt die Integration in Loxone.
Dabei sollen jedoch einige Regeln beachtet werden. So soll beim Filmstart nur auf Lichtszene 2 geswitcht werden, wenn die aktuelle Lichtszene 1 ist. Beim Filmstop dann entsprechend wieder zurück auf Lichtszene 1, wenn die aktuelle Lichtszene 2 ist. Das soll verhindern, dass bei einem zwischenzeitlichen manuellen Ändern der Lichtszene diese nicht auomatisch geändert wird. Insgesamt gibt es hier sicherlich noch Nachbesserungsbedarf. Das obige Beispiel soll deshalb eher als Ideengeber angesehen werden und nicht als fertige Lösung, die man 1:1 übernehmen kann.
Aus meinem täglichen Leben
Wirklich spannend wird das vernetzte Smart Home erst durch solche Zusatzfeatures (man könnte es auch Spielereien nennen), die bspw. auch die Multimediasteuerung in das Gesamtkonzept einbeziehen. Plex bietet in diesem Kontext auf Schnittstellenebene die besten Voraussetzungen, die glücklicherweise auch in FHEM mittlerweile genutzt werden können. So lassen ich neben dem aktuellen Play-Status mit dem plex-Modul für FHEM noch zig andere interessante Dinge anstellen, wie bspw. mit FHEM die Library-Elemente des Plex Servers browsen und Watchlists erzeugen.
Neben der reinen Anbindung muss man sich dann noch darum kümmern, passende Szenarien umzusetzen. Was soll bspw. wann passieren, wann macht es Sinn die Beleuchtung in welchen Modus zu versetzen. Vielleicht macht es ja auch Sinn die Jalousien per HomeMatic Rolladenaktor (Affiliate-Link) runterzufahren, um für eine passende Beschattung zu sorgen – mehr Infos im Blogpost Smart-Home-Rolladensteuerung mit FHEM und Loxone: Howto und Praxistipps für Nachrüster. Hier muss man wohl schon ein wenig herumprobieren, um das passende Setting zu finden. Aber ich denke es lohnt sich allemal…
Noch auf der Suche nach dem passenden Plex-Client? Dann hier weiterlesen: Intel NUC Skylake: HowTo zum perfekten PLEX-Client fürs Heimkino
11 Kommentare
Wiedermal ein toller Beitrag, danke!
Gerne mehr zu Fhem in Kombination von Loxone 🙂
Ps: Siri Integration? 😉
Wenn schon Loxone, dann möglichst komplett.
Na wenn ich mir die aktuelle Strategie von Loxone im Forum dort anschaue, dann würde ich es bevorzugen, wenn hier auch mal wieder weniger Loxone-lastig berichtet würde. Ansonsten wie immer sehr interessant!
Gruß
Harald
Hi Harald,
danke für deinen Input!
Loxone ist durch seinen Schritt die Modbus-Schnittstelle künstlich zu beschneiden meiner Meinung nach zurecht in die Kritik geraten. Auch wenn das aus meiner Sicht ein Nogo ist und die Kommunikationskultur von Loxone in dieser Hinsicht auch echt mies war, sollte man das ganze Thema auch nicht unbedingt überbewerten.
Es ist und bleibt für mich eine offene Lösung mit jeder Menge Schnittstellen und eben einiger (künstlicher) Einschränkungen. Christoph und ich werden Loxone definitiv weiterverwenden und auch weiter darüber berichten, da der Funktionsumfang für uns unverzichtbar geworden ist. Zu FHEM wird es aber natürlich auch neue Inhalte geben, da wir das Sytem ebenso wenig missen möchten.
Grüße
Jörg
define SZMoviePlaying notify SZ.PMP.video.playing set SZ.Deckenlampe 20
Gilt das Anwendungsbeispiel auch für HUE ohne Loxone Anbindung?
Danke und LG
Hallo,
danke erst mal so was habe ich immer gesucht.
Das Problem ist das die Clients nicht bei mir im Fhem „angelegt“ werden.
Den Plex-Server konnte ich über myPlex anlegen.
Beim Aufrufen von get Plex clients werden mir auch meine Clients angezeigt. Nur tauchen diese nicht in der Plex Umgebung auf, dort steht nur mein Server und Plex for Android – stopped, Plex for IOS – disappeared.
Danke für die Hilfe.
Hallo
Ich habe ein Problem den Server einzubinden.
Input: get Plex servers
Output: Servers from discovery:
ip updatedAt onl. name machineIdentifier
192.168.1.145 2017-03-29 21:54:12 yes Qnap1282 066669ca805094f2eafc68065fedb91f36b05ec8
Input: Set Plex Autocreate 066669ca805094f2eafc68065fedb91f36b05ec8
Output: unknown server: 066669ca805094f2eafc68065fedb91f36b05ec8
Was könnte das Problem sein? Danke!
Versuchs mit der IP, mit dem machineIdentifier hab ich auch dieselbe Meldung erhalten.
Hi Jörg!
Nach viel Herumprobieren habe ich die Übertragung der dynamischen Textdaten an Loxone nun hinbekommen.
Diese Zeile aus dem Beitrag habe ich angepasst: system(“curl -s ‘http://admin:password@192.168.3.11/dev/sps/io/VTI1/TITLE'”);
-> system(“curl -s ‘http://admin:password@192.168.3.11/dev/sps/io/VTI1/’$title””);
Das funktioniert so auf jeden Fall schon mal, wenn im String keinerlei Leerzeichen oder Sonderzeichen wie z.B. &|”|/|(|)|’ enthalten sind.
Diese Zeichen müssen vorher noch in Hex codiert werden, also für das Leerzeichen z.B. %20. Der fertige Aufruf sieht dann am Ende z.B. folgendermaßen aus:
-> system(“curl -s ‘http://admin:password@192.168.3.11/dev/sps/io/VTI1/’Bang%20my%20Head%20%28feat%2e%20Sia%29””);
für den Titel “Bang my Head (feat. Sia)”
Viele Grüße
Thorsten
Hallo,
ist es auch möglich, “nur” eine UDP übertragung von Plex Server zu Loxone zu realisieren, welche eine Aktivität übergibt? Wäre cool, dass bei Aktivität Loxone den Server am laufen hält… bevor diese im Energiesparmodus einschläft.
Danke
Hallo Jörg
habe das gleiche Problem wie Steffi. Plex Server konnte manuel in FHEM eingebunden werden. clients dagegen werden keine automatisch angelegt. Können die Clients auch manuel hinzugefügt werden?
mit get PlexServer clients werden alle im myPlex registrierten Clients angezeigt.
Auch wird der aktive/abspielende Plexclient auf dem Fire-TV als solcher erkannt (mit get Server clients…) aber es wird kein FHEM-Device erstellt.
Manuelle Hinzufügeversuche mit MaschineID oder IP (vom FireTV) ergibt unbekannter Server…
Gibts da noch einen Trick den ich übersehen habe?