Kodi [JVC "Projector" Interface]

  • AKTUELL: V 1.0.2
    Hiermit stelle ich ein Skript für Kodi bereit, welches anhand der Dateinamen (z.B. durch Nutzung des Aspect Ratio Detectors von All-Ex) Kommandos (auch mehrere) per Ethernet-Schnittstelle an einen JVC Projektor sendet. Aktuell ist die Auswertung auf den Aspect Ratio Detector [LINK] voreingestellt.


    Bitte NICHT ERSCHRECKEN!!! Es ist eine "große" Anleitung", das meiste ist allerdings selbsterklärend. Das sollte euch nicht abschrecken, das Skript einfach mal zu testen. Man kann mit dem veröffentlichten Skript nichts kaputt machen. ;)


    Voraussetzungen:
    - JVC Projektor
    - Kodi in Verbindung mit dem Kodi-Player
    - Kodi in Vebrindung mit DSPlayer
    Für die Nutzung von anderen externen Playern müsste die Skruktur umgestellt werden, weil man dann nicht so einfach an die benötigten Daten kommt. Ich werde nach aktuellem Stand auch keine anderen Player unterstützen.


    Kurz zur Funktion:
    Funktionieren sollte das Script mit JVC Geräten der Xx0- Generation bis zur Xx900-Generation. Aktuell sind Befehle für Lens-Memory, Maskierung, Bildmodus (und EIN/AUS) eingefügt.
    Es können z.B., je nach erkanntem Bildformat (oder auch eingegebem HDR-String in Dateiname/-pfad oder beidem) alle über die Schnittstelle möglichen Kommandos an den Projektor gesendet werden. Dies geschieht nach einmaliger Konfiguration in am Anfang des Skripts selbstständig beim Start einer beliebigen VIDEO-Datei. Nach Beendigung wird der Standard Bildmodus wieder angefahren.


    Zur Einbindung:
    Die ZIP-Datei ist zu entpacken und die Dateien/Ordner gehören ins Kodi-Homeverzeichnis (bei Windows: C:/Benutzer/"(User)"/AppData/Roaming/Kodi/). Die autoexec.py gehört also in den bereits vorhandenen "Userdata"-Ordner.


    Zur Konfiguration ist die Datei ist mit einem "guten" Texteditor (z.B. PSPad, Notepad+,...) zu bearbeiten. Zu beachten ist, dass Python sehr genau auf Struktur, wie z.B. die Einrückung achtet. Ist eine Zeile falsch eingerückt, dann gibts einen Fehler. Eine Einrückung besteht auf "4 Leerzeichen", zwei Einr. sind "8 Leerzeichen",...


    Kurz zu der Datei:
    Ab Zeile 78 ist das "Verzeichnis" mit den JVC-Befehlen erstellt, dieses kann auf Wunsch erweitert oder verändert werden. Ein Befehl besteht immer aus einem Namen und dem zugehörigen HEX-Befehl.


    Ab Zeile 120 beginnt die individuelle Konfiguration...folgende Erklärung:



    Code
    self.showdialog = True/ False


    lässt nach der Auswertung eine Kodi-Nachricht mit den Daten der Videodatei erscheinen (oder eben nicht)





    Code
    self.data['DefaultAR'] = ' ' (Anführungszeichen beachten!)


    hier wird das Standard-Bildformat eingetragen (Format: '1.78','1.85', '2.20',...) welches die Leinwand hat. So wird ggf. kein Befehl an den Beamer geschickt, wenn es nicht sein muss, außerdem wird nach Beendigung des Videos auf dieses Bildformat (MUSS in 'self.PicModeSdr' hinterlegt sein) zurückgefahren.





    Code
    self.data['DefaultFPS'] = ' ' (Anführungszeichen beachten!)


    Eintragen der eingestellten Bildwiederholrate (Standard-Oberfläche, also Windows etc.). Hatte ich Anfangs mal gebraucht, um den Sync des Beamers abzuwarten, oder eben nicht. Mit DSPlayer funktioniert die Auswertung (ein Vergleich zwischen FPS des Videos und diesem Eintrag) nicht. Kann aber nicht schaden! ;)





    Code
    self.delaytime =


    Hier kann die Zeit in Millisekunden angegeben werden, wann der erste Befehl nach Videostart an den Beamer gesendet werden soll. Die Befehle werden nach diesem Delay direkt nacheinander an den Projektor verschickt. Die Routine wird bei Nichtempfang eines Signals 8 mal im Abstand von 3 Sekunden versuchen, das nicht korrekt gesendete Kommando noch einmal zu schicken. Mit der Zeit kann gespielt werden, ab 5 Sekunden bekommen auch die langsamen "Sync"er auf jeden Fall alle Signale mit.





    Und jetzt zu den "wichtigen Dingen":



    Code
    self.host = '000.000.000.000' [i](Anführungszeichen beachten!)[/i]


    Die IP-Adresse des JVC Projektors...!





    Code
    self.PicModeSdr['XXX'] = [Jvc['XXX']] (Anführungszeichen und Klammern beachten!)


    Dort werden alle (Standard)-Bildformate beschrieben, die in den Dateien gefunden werden können. Diesen Bildformaten werden dann die gewünschten Befehle aus der JVC-Liste zugeordnet. Die Bildformate können mit Punkten, Kommas, oder gar nicht getrennt werden. Also '178' oder '1.78' oder '1,78'. Der Liste muss dann der gwünschte Befehl /die Befehle zugeordnet werden. Besipeile hab ich ja hinteregt. Bitte GROß und kleinschreibung beachten.





    HDR-Optionen:
    Sollte für HDR Medien eine andere Einstellung gewünscht sein (meist der Bildmodus), kann man die HDR-Erkennung einschalten.




    Code
    self.HdrFileName =True/False
    self.HdrFilePath = True/False


    Es kann eine der beiden oder beide Optionen aktiviert werden. Es wird dann der angegeben "HDR-String" im Dateinamen, im Pfad oder in beidem gesucht.
    Wird bei Aktivierung mindestens einer der beiden Optionen die angegebene Zeichnfolge erkannt, wird anstelle der Standrad-Bildformat Liste (self.PicModeSdr['XXX']) in der self.PicModeHdr['XXX']-Liste gesucht. Sollte das Bildformat hier nicht zu finden sein, wird in der Standard-Liste gesucht (das sollte dann aber nicht passen, weil ihr da ggf. ja kein HDR-Bildmodus eingestellt habt).




    Code
    self.HdrString = ' ' [i](Anführungszeichen beachten!)[/i]


    Die Zeichenfolge, nach der für die HDR-Erkennung gesucht werden soll!





    Code
    self.PicModeHdr['XXX'] = [Jvc['XXX']] [i](Anführungszeichen und Klammern beachten!)[/i]


    Siehe Standard Bildmodi. Diese Modi (und damit Befehle) werden gesendet, wenn die Suche anch der HDR-Zeichenfolge eingeschaltet ist und diese gefunden wird.





    WICHTIG:Es werden auch NUR Bildformate gesucht, die in diesen Listen hinterlegt sind! Sollte eine Datei ein Tag mit *AR_123* beinhalten und dieser Tag ist bei den Listen nicht aufgeführt, wird er auch nicht erkannt. Das mache ich, damit ich nicht mit evtl. Stringkombinationen in Konflikt gerate, die gar kein Seitenverhältnis darstellen sollen.



    Allgemeine Probleme, Fehler oder auch Wünsche können natürlich gerne hier im Thema gepostet werden. Ich wünsche allerdings, speziell für einige Fehler, einen Log und eine Fehlerbeschreibung (z.B. wie der Fehler reproduziert werden kann).
    Für das Log muss im Kodi einfach die Logging-Funktion in den Einstellungen aktiviert werden. Das Skript logt dann für mich wichtige Sachen mit. Dieses Log bitte NICHT einfach hier posten. Manche Menschen "möchten" nicht wissen, wie eure Urlaubsvideos heißen, oder was ihr euch so anschaut! ;) Die Logs bitte per PM als Datei schicken (auch Auszüge sind möglich). Ggf. muss die "kodi.log" einfach in kodi.jpg umbenannt werden, damit sie per PM vershcikt werden kann. Ich werde die Logs vertraulich behandeln und nach Einsicht löschen!



    Zum Abschluss und WICHTIG: Die Nutzung des Skripts geschieht auf eigene Gefahr, ich übernehme keine Garantie für mögliche Schäden.


    Und nun...viel Spaß beim Testen! ;)


    Kodi-JvcInterface-V102.zip

  • Ich musste noch etwas an den timings anpassen...also V1.0.1 angehängt!


    EDIT: ich musste nochmal die Zeiten für den Timeout etwas anpassen, da die JVCs auch echt lahm mit dem bestätigen des Befehls sind.


    Also: V1.0.2

  • Hi Civer,


    vielen Dank für Dein Tool, das funktioniert hier wunderbar :dancewithme


    Der Proki fährt den richtigen Lens Memory an und auch das Umschalten auf meine SDR und HDR Bildmodi klappt.


    Edit: hier stand Quatsch...


    Die Mask Slots verwende ich nicht, kann man das Senden des Befehls dann auch unterdrücken?


    Ich werde noch weiter testen. Auf jeden Fall ist das Tool ein großer Schritt in die Automatisierung des Heimkinos :sbier:

  • Hi Civer,
    Die Mask Slots verwende ich nicht, kann man das Senden des Befehls dann auch unterdrücken?


    Hi All-Ex,
    danke für die Rückmeldung.
    Du kannst dir die Befehlslliste ja beliebig zusammenstellen. Wenn du bei einem Bildmodus anstatt:

    Code
    self.PicModeSdr['1.78'] = [Jvc['ML02'], Jvc['MA00'], Jvc['PM08']]


    einfach nur:

    Code
    self.PicModeSdr['1.78'] = [Jvc['ML02'], Jvc['PM08']]


    einträgst, dann wird nur der Lens-Memory und die Bildmodus geändert.
    Du kannst die Befehle "beliebig" zusammenstellen.


    Ich konnte dein Problem, dass du mir mal gemeldet hattest (Pause/Resume) übrigens auch nachvollziehen. Allerdings nur wenn ich bei bestimmten Skins über die GUI auf Pause drücke (über Tastatur oder Fernbedienung klappt es). Das Problem liegt scheinbar beim DSPlayer. Sollte für Start/Stopp- Befehle aber sowieso kein Problem sein.

  • Hi Civer,


    Danke für die Info, dass probiere ich aus.


    Die Pause/Resume Erkennung wird doch eigentlich gar nicht benötigt. Zumindest ist es bei mir völlig ausreichend, dass bei Start und Stop Bildmodus & Zoom verstellt werden. Eine Verstellung bei Pause/Resume benötige ich nicht.


    Viele Grüße,
    Alex

  • Hi,


    ja für die eigentlich gedachte Nutzung ist Start und Stopp natürlich ausreichend. Ich steuere aber auch noch das Licht bei Pause/Resume, da könnte es dann ggf. Probleme geben, je nachdem wie man pausiert...auf die eigentliche Funktion hat das aber keinen EInfluss.

  • Hallo Civer und All-Ex,


    will mich an dieser Stelle nochmal für eure beiden prima Tools bedanken, super Arbeit!
    Funktioniert wunderbar, die Dateien werden zuerst auf die korrekte Aspect Ratio unbenannt, und anschließend das richtige Lens Memory angefahren.
    Und das Ganze funzt sowohl auf meinem alten X-500 als auch jetzt bei meinem neuen N5!
    Hat sich also auch bei der neuen N-Serie anscheinend nix zur X-Serie an der Syntax geändert - dies nur zur Info an die N5-Besitzer.
    Probierts einfach mal aus!


    Dankeschön und Grüße aus Korschenbroich,
    Guido

  • Hallo Guido,


    danke für die Rückmeldung. Hab ich eben erst gelesen! ;)


    Ich werde nach Monaten glänzender Abwesenheit jetzt auch wieder aktiver.
    Wenn also Anregungen oder Ideen vorhanden sind, dann einfach melden.

  • Hallo Civer,


    danke für die Anregung, sich mal wieder näher mit deinem Script zu beschäftigen.


    Ich nutze es zwar schon länger. Bisher hat es allerdings nur semi-optimal funktioniert. D.h. beim Start eines Films, wurde zuverlässig eine neue LensMemory aktiviert. Nur beim Ende wurde zuverlässig nicht die alte LM aktiviert :think:
    Geholfen hatte ich mir bisher immer damit, einfach mit der FB wieder zurück zu stellen.


    Jetzt hab ich mir das Script aber nochmal näher angeschaut, was da wo passiert bzw nicht passiert.
    Das Problem war, dass beim ersten Kommando an den JVC und warten auf die Rückmeldung, ein Timeout kam. Das zweite Kommando am Ende des Films, kam dann irgendwie nie mehr an. Und das obwohl laut Skript alles erfolgreich ablief.
    Nachdem das Timeout zum warten auf die Antwort des Beamers (von den Default 10s) auf 30s erhöht wurde, ging alles so wie es sollte :dancewithme
    Mein Beamer ist ein X35, der braucht ca 25s zum anfahren der 21:9 Position. Hat er die erreicht, bestätigt er auch das Kommando und das Script kann normal, ohne Timeout, weiter machen.


    Dazu habe ich noch ein xbmc.Player().pause() vor dem abschicken eines Kommandos eingefügt. Sowie ein .pause() nachdem er mit dem abschicken des Kommandos fertig ist. So wartet Kodi, bis die neue Position angefahren ist und fängt dann erst mit dem Film an. Perfekt :respect:


    Deswegen besten Dank nochmal für das Skript!!! Vor allem jetzt, wo es wirklich rund läuft.

  • Hallo icebaer,
    also ich hab das Skript ja am X7900 getestet und die Zeit extra "einstellbar" gemacht. Sobald die JVCs syncen nehmen sie ja bestimmte Befehle nicht an. Deshalb sollte auch die Reihenfolge beachtet werden.
    Das Problem selbst hatte ich bisher nie, und deshalb auch keinen Bedarf gesehen, da was zu machen. Ich hab die Zeit selbst auch nur an meine Gerät ermittelt.
    Ein Log dazu würde mich mal ineteressieren, eigentlich sollte durch den Timeout ja quasi ein Abbruch erfolgen.
    Mein aktueller (und auch der X5000, den hatte ich vorher) geben direkt nach erhalt des Befehls eine Rückmeldung.

  • Ja, das ist wirklich seltsam, dass das Verhalten der PJs so geändert wurde.


    Hab jetzt mal zwei Logs erstellt, in denen man es gut sehen kann.
    Im Fehlerfall wird ein Kommando abgeschickt, nach 10s kommt ein Timeout. Dann wird ein zweites Mal probiert, was auch durchkommt. Soll dann bei Stop wieder die alte Position angefahren werden, wird das entsprechende Kommando abgeschickt und kommt direkt zurück, ohne dass der PJ was macht.
    Im Gutfall wird ein Kommando abgeschickt und kommt nach >20s erfolgreich zurück. Drückt man Stop, passiert eigentlich das gleiche wie vorher, nur diesmal mit Wirkung am PJ.


    Das Problem tritt auch auf, wenn der Film komplett fertig geschaut wurde, d.h. bei 1-2h Abstand zwischen den Kommandos. Die Verbindung sollte sich bis dahin eigentlich selbst geschlossen haben. Vielleicht bleibt der PJ dann auch in einem Zustand, in dem er irgendwas anderes erwartet, als ein neues Kommando.


    Da es mit einem Timeout von 30s aber ohne Probleme läuft, ist mir die genau Ursache auch nicht so wichtig ;)
    Zumal die Lösung den Vorteil hat, dass der Film wirklich genau so lange pausiert werden kann, bis der PJ alles eingestellt hat und fertig für das Bild ist :)

  • Danke für die beiden logfiles. Das Programm verhält sich wirklich (du hattest es ja erwähnt) genauso wie es sollte.
    Irgendwie scheint sich der Beamer anders zu verhalten. Nach dem Senden oder einem Timeout wird die Verbindung immer geschlossen und bevor ein Befehl gesendet werden kann, muss ein "3-Wege-Handschlag" durchgeführt werden. Darauf reagiert der Beamer (nach dem Stoppen des Films) ja auch noch. Wieso dieser Befehl dann doch nicht dort landet, müsste untersucht werden.
    Aber gut, wenn du so erstmal zufrieden bist, dann ist das auch ok!

  • Stimmt. Nach dem ersten Timeout schickt das Skript ja direkt den zweiten Versuch raus, der vom PJ auch erfolgreich beantwortet wird. Danach sollte der PJ eigentlich in einem sauberen Zustand sein. Trotzdem wird das Kommando am Filmende nicht angenommen.


    Mit dem erhöhten Timeout läuft es ja auch sauber und ohne Fehler durch. Insofern alles bestens.
    Alte Männer bzw Projektoren brauchen bei manchen Dingen einfach etwas länger :tire: ;)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!