Module für XBMC

Begonnen von Dennis B., 06 Januar 2013, 22:32:24

Vorheriges Thema - Nächstes Thema

Dennis B.

Hallo zusammen,

da ich den Einstieg in FHEM und Perl finden wollte, hab ich mir als erstes Ziel gesetzt gehabt, ein Module zur Kontrolle von XBMC zu erstellen. Nach recht kurzer Zeit konnte ich erste Befehle absetzen. Dann ist mir aufgefallen, dass XBMC auch Notifications versenden kann, was in mir den Ehrgeiz geweckt hat, diese auch innerhalb von FHEM benutzen zu können. Herausgekommen ist bei der ganzen Sache das angehangene Modul. Es bietet die Möglichkeit einige Befehle (play, pause, stop, mute, next, previous und andere) an XBMC zu senden. Es lassen sich auch Infoboxen im XBMC anzeigen. Damit könnte man über Anrufe informieren. Des Weiteren werden Events erzeugt, wenn XBMC eine Notification versendet. Eine ausführlichere Erläuterung des Moduls habe ich in die Modul-Datei geschrieben.

Vielleicht ist das Modul ja für den ein oder anderen interessant. Bitte nicht wundern, falls der Code komisch aussieht. Das Modul ist effektiv das erste was ich in Perl geschrieben habe und da ich meist Java programmiere, hab ich auf angehangene Ifs verzichtet. :)

Solltet ihr Fehler finden oder Anregungen haben, einfach melden. Es würde mich nicht wundern, wenn das Modul noch ein paar Fehler enthält. Um das Modul zu benutzen wird, benötigt man das JSON::RPC::Client Perl-Modul. Falls man nur die TCP-Connection nutzt, kann es sein, dass es ausreicht, nur das Modul JSON::XS zu installieren.

Eine Frage bezüglich der Modul-Präfixe hätte ich. Haben die Zahlen (bis auf 99) irgendeine spezielle Bedeutung? Habe jetzt 70 gewählt, weil ich mich ursprünglich an dem Modul für Samsung TVs orientiert hatte.

Gruß
Dennis


justme1968

hallo,

habe dein modul gerade gefunden und ausprobiert. ganz klasse das es das gibt.

ich verwende aber statt xbmc plex das in der neuesten entwicklerversion  inzwischen auch das xbmc api kann. es scheint aber noch unterschiede zu geben da nur ein paar kommandos funktionieren msg und mute z.b. aber alles was mit abspielen zu tun hat nicht. und zur zeit nur mit http. tcp geht nicht. ich weiss aber noch nicht ob das eventuell noch deaktiviert ist.

ich werde da noch ein wenig probieren. hättest du Interesse das  modul zu erweitern das es auch mit plex funktioniert? es gibt auch eine ganze lange reihe funktionen die noch nicht eingebaut sind. vielleicht wäre es gut wenn man die liste der Kommandos leichter erweiterbar machen könnte ohne das jeweils der Kommando parser erweitre und neue Funktionen geschrieben werden müssen. als fern ziel vielleicht sogar per introspect.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Dennis B.

Hey,

habe Plex noch nie verwendet, aber wenn die wirklich die XBMC JSON RPC API unterstützen, dann müssen die wohl nachbessern :)
Konnte leider keine Informationen zur Unterstützung der XBMC API finden. Wo hast du die Informationen her?
Ein Modul zur Unterstützung der Plex HTTP API sollte nicht so schwer sein. Wollte bei Gelegenheit mal ein Modul zur Nutzung der Dreambox HTTP API schreiben. Wenn das fertig ist, kann man Teile davon bestimmt auch nutzen, um die HTTP API von Plex anzusprechen.
Konnte nichts dazu finden, dass Plex, ähnlich wie XBMC, Notifications verschickt. Falls die das nicht tun, könnte man Events höchstens über Polling genieren und das ist mir zu nervig, um das implementieren zu wollen :)

Das Einbauen weiterer XBMC Commands ist mehr oder weniger nur noch Fleißarbeit. Die Liste der Commands und auch Notifications ist lang und ich hatte am Wochenende schlichtweg keine Lust mehr darauf. Werde das in nächster Zeit ausbauen.

Gruß
Dennis

UliM

Hi Dennis,
coole Idee - vielen Dank für das Modul!

Hab eben versucht es auf meiner FB7390 einzurichten. Nach reload 70_XBMC.pm kommt

Can't locate JSON/RPC/Client.pm

Mit JSON::XS befürchte ich dann dasselbe - gibt's nicht auf der FritzBox.
Ohne geht's nicht, oder?

LG, Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Dennis B.

Kann man auf der Fritzbox keine Perl-Module nachinstallieren?

Um die Abhängigkeit von den Modulen loszuwerden, müsste ich das Umwandeln von Hashes in JSON (und zurück) selbst implementieren. Ich schau mir mal an, wie viel Aufwand das ist. Solltest du im Internet zufällig über die eine Implementation davon stolpern, kannst du ja mal Bescheid sagen.

Kannst du mal testen, ob URI::Escape auf der Fritzbox vorhanden ist?

Gruß
Dennis

UliM

Zitat von: Dennis B. schrieb am Mo, 07 Januar 2013 19:43Kannst du mal testen, ob URI::Escape auf der Fritzbox vorhanden ist?

So wird erfolgreich geladen:
use URI::Escape;
#use JSON::RPC::Client;
#use JSON::XS;
use Data::Dumper;
use DevIo;

RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

justme1968

also...

- tcp scheint nicht zu gehen weil port 9090 scheinbar zur zeit nur für localhost offen ist.

- ansonsten sollte es für die events auch noch die möglichkeit per websockets geben. ich weiss aber nicht ob das von perl aus geht.

- ich hab gerade gefunden warum die meisten kommandos nicht gingen :)... die playerid muss 1 sein für video und 0 für musik. nicht wie bei dir 0. mach doch erst mal ein attribut draus. und irgendwann am besten per { "jsonrpc": "2.0", "method": "Player.GetActivePlayers", "params": {}, "id": 0 } den aktiven player abfragen.

- zumindest unter plex bekommt man alle Kommandos per {"jsonrpc":"2.0","method":"JSONRPC.Introspect","id":"introspect", "getdescriptions": true, "filterbytransport": true }  raus. und ja. das ist eine verdammt lange liste :)
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Dennis B.

Zitattcp scheint nicht zu gehen weil port 9090 scheinbar zur zeit nur für localhost offen ist.
Bin mir gerade nicht sicher, ob du über Plex oder XBMC redest, aber in den XBMC Einstellungen kann man das auch für andere erlauben. Siehe http://wiki.xbmc.org/index.php?title=JSON-RPC_API#Enabling_JSON-RPC

Zitatansonsten sollte es für die events auch noch die möglichkeit per websockets geben. ich weiss aber nicht ob das von perl aus geht.
Hab keine vernünftige Websocket implementation für Perl gefunden und selbst programmieren wollte ich die Unterstützung nicht. Wüsste auch nicht, was der Vorteil gegenüber TCP ist. Sehe ehr unnützen Overhead im Vergleich zu TCP.

Zitatich hab gerade gefunden warum die meisten kommandos nicht gingen :)... die playerid muss 1 sein für video und 0 für musik. nicht wie bei dir 0. mach doch erst mal ein attribut draus. und irgendwann am besten per { "jsonrpc": "2.0", "method": "Player.GetActivePlayers", "params": {}, "id": 0 } den aktiven player abfragen.
letzteres werde ich machen. Irgendwo im Code hatte ich sogar geschrieben, dass ich die PlayerID vermutlich nicht hardcoded da reinpacken sollte :)

Zitatzumindest unter plex bekommt man alle Kommandos per {"jsonrpc":"2.0","method":"JSONRPC.Introspect","id":"introspect", "getdescriptions": true, "filterbytransport": true } raus. und ja. das ist eine verdammt lange liste :)
schaue mir die Liste am Wochenende eventuell mal an. Vorher hab ich keine Zeit mir Plex anzuschauen.

Dennis B.

@UliM

habe mal probiert ein paar Abhängigkeiten loszuwerden. Falls es das JSON Modul auf der Fritzbox gibt, könnte es funktionieren. Bitte teste mal die Datei im Anhang.

justme1968

ZitatBin mir gerade nicht sicher, ob du über Plex oder XBMC redest, aber in den XBMC Einstellungen kann man das auch für andere erlauben. Siehe http://wiki.xbmc.org/index.php?title=JSON-RPC_API#Enabling_JSON-RPC
ja. ich weiss. nur gibt es die oberfläche in plex so nicht und ich hab noch nicht rausgefunden wie der parameter im config file heißen muss.

Zitatletzteres werde ich machen. Irgendwo im Code hatte ich sogar geschrieben, dass ich die PlayerID vermutlich nicht hardcoded da reinpacken sollte :)
das habe ich gesehen :) wenn du das einbaust solltest du das nicht nur am anfang einmal machen sondern ich vermute vor jedem kommando weil sich die player id ändert wenn man z.b. von video nach musik wechselt.

Zitatschaue mir die Liste am Wochenende eventuell mal an. Vorher hab ich keine Zeit mir Plex anzuschauen.
keine hektik. das ist auch nicht auf die schnelle möglich. du müsstest client und server installieren (jeweils software) aber die entwickler version mit der das api erstmals geht ist noch nicht öffentlich. aber das mit dem introspect sollte mit xbmc genau so gehen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

UliM

Zitat von: Dennis B. schrieb am Mo, 07 Januar 2013 22:08@UliM
habe mal probiert ein paar Abhängigkeiten loszuwerden. Falls es das JSON Modul auf der Fritzbox gibt, könnte es funktionieren. Bitte teste mal die Datei im Anhang.
Hi Dennis,
hat leider noch nicht gereicht:
Can't locate JSON.pm
=8-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

rtv

Vielen Dank für dein Modul!

Ich nutze XBMC als "Zweitsoftware" neben MediaPortal.
Deshalb wäre es schön, wenn das Plugin berücksichtigt, ob die Anwendung überhaupt erreicht werden kann.

Erste Erfahrungen (LAN, TCP):
- generell funktioniert alles, was implementiert ist
- ein "set <xmbc> quit" wird zwar korrekt ausgeführt, aber nach dem Beenden von XBMC stirbt auch FHEM
- wenn FHEM gestartet wird, während XBMC nicht läuft, scheinen einige Aufrufe zu blocken: Das Webinterface hat ständig sekundenlange Verzögerungen und einige HMLAN-Befehle werden (vermutlich timingbedingt) mit "Missing ACK" quittiert. Wenn ich die XBMC Definition lösche ist sofort wieder alles fix.

justme1968

das einschalten vom tcp port für alle interfaces geht in plex mit dem gleichen parameter <esallinterfaces>true</esallinterfaces> wie bei xbmc. damit geht es jetzt auch per tcp und die events kommen zurück.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Dennis B.

So ich habe mal ein wenig gebastelt und eventuell einen Großteil der Probleme gelöst (wie viele neue ich geschaffen habe, wird sich noch herausstellen) :)

Direkt zu Beginn forke ich jetzt den FHEM-Prozess und checke in dem geforkten Prozess, ob XBMC erreichbar ist. Dadurch sollte FHEM nicht ausgebremst werden. Der geforkte Prozess beendet sich automatisch, wenn eine connection zu XBMC möglich ist oder wenn der Hauptprozess nicht mehr läuft. Der Hauptprozess probiert nur dann eine Verbindung zu XBMC aufzubauen, wenn der Kindprozess nicht mehr läuft. Bei mir sieht es stark danach aus, als würde dies das Problem mit dem nicht reagierenden FHEM lösen.
@rtv: Vielleicht kannst du das ja auch noch einmal bei dir testen.

Zitatein "set <xmbc> quit" wird zwar korrekt ausgeführt, aber nach dem Beenden von XBMC stirbt auch FHEM
Den Fehler habe ich gefunden und behoben. Bei mir geht's jetzt wunderbar.

Für alle Commands die den Player betreffen, kann man nun angeben, welcher Player gestoppt werden soll. Beispielsweise stoppt "set <XBMC_device> stop audio" den Musikplayer. Falls kein Player angegeben ist, wird probiert alle aktiven Player zu stoppen. Solange nur ein Player aktiv ist, funktioniert das auch recht gut. Falls man aber Musik hört und Bilder anschaut, dann werden zwar zwei Commands zum Stoppen der Player geschickt, aber XBMC reagiert nur auf einen. Das Ganze scheint ein Bug in XBMC zu sein.

ZitatCan't locate JSON.pm
Hast du mal probiert http://search.cpan.org/CPAN/authors/id/M/MA/MAKAMAKA/JSON-2.53.tar.gz herunterzuladen und in den FHEM-Ordner zu entpacken (da wo auch die Module sind)?
Das normale JSON Modul hat keine weiteren Abhängigkeiten und ist, soweit ich das in Erfahrung bringen konnte, in pure perl geschrieben. Eventuell geht's auf diese Art schon.

Jumbo

Hey Dennis,


mich würde mal interessieren ob du es auch hinbekommen könntest von XBMC direkt zu streamen , ins FHEM , hauptsächlich in den Floorplan.

Normalerweise soweit ich informiert bin , wäre dies über JSON machbar ...