Kodi [JVC "Projector" Interface]

  • AKTUELL: V 1.0.5
    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 17 (und neuer)...

    - in Verbindung mit dem internen Player

    - in Verbindung mit dem DS Player (nur Kodi 17)

    - in Verbindung mit einem externen Player (MPC-BE) [ACHTUNG: es werden hier aber nur der Filmstart und der Filmstop erkannt]


    Kurz zur Funktion:
    Funktionieren sollte das Script mit JVC Geräten der Xx0- Generation bis zur Xx900-Generation und dem JVC N5, N7 und NX9. Aktuell sind Befehle für Lens-Memory, Maskierung (bei N5, N7, NX9 nicht nötig bzw funktionslos), Bildmodus (und EIN/AUS) eingefügt.
    Es können z.B., je nach erkanntem Bildformat (oder auch eingegeben HDR-Strings 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 behinhaltet drei Ordner, jeweils für Kodi17, Kodi18 und Kodi19.

    Bei Kodi 17 und Kodi 18:

    Der Ordner 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.

    Bei Kodi 19:

    Ab Kodi19 wird die autoexec.py nicht mehr automatisch genutzt. Das Ausführen der Datei muss über ein Addon erfolgen:

    - der Ordner "script" gehört ins Kodi-Homeverzeichnis (bei Windows: C:/Benutzer/"(User)"/AppData/Roaming/Kodi/).

    - der Inhalt des Ordners "addons" (das neue Service-Addon) gehört zu den Addons in das Kodi Installationsverzeichnis (bei Windows: C:/Programme/Kodi/addons). Nach dem kopieren des Addons muss es in Kodi unter Addons auch aktiviert werden (Service.Autoexec)




    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 63 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 106 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(n), nach der für die HDR-Erkennung gesucht werden soll! Es handelt sich ab v1.0.5 um eine Liste, es können also verschiedene HDR-Strings eingetragen werden (Beispiele in der Datei).





    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 nutzen! ;)


    Kodi-JvcInterface-V105.zip

  • 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

  • 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 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.

    "A computer lets you make more mistakes faster than any other invention in human history, with the possible exceptions of handguns and tequila." - Mitch Ratcliffe

  • 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 :)

    Dateien

    • jvc_fail.txt

      (3,75 kB, 353 Mal heruntergeladen, zuletzt: )
    • jvc_success.txt

      (3,32 kB, 378 Mal heruntergeladen, zuletzt: )

    "A computer lets you make more mistakes faster than any other invention in human history, with the possible exceptions of handguns and tequila." - Mitch Ratcliffe

  • 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:;)

    "A computer lets you make more mistakes faster than any other invention in human history, with the possible exceptions of handguns and tequila." - Mitch Ratcliffe

  • Hallo Civer, habe das Ganze nun einmal ausprobiert und das funktioniert bei mir soweit hervorragend. Nun habe ich eine Frage. Aktuell funktioniert es nur nachdem ich die Dateien auf _AR... habe umbenennen lassen. In meinen Dateien ist jedoch die Auflösung und die AR bereits in anderer Form hinterlegt. Aktuell z.B. mitten im Namen " AR1.85 " jeweils mit Leerzeichen davor und danach. Lässt sich das so in das Tool integrieren? Habe mal grob den Code überflogen, aber das ist absolut nicht mein Metier und konnte entsprechenden Reiter nicht finden. Wäre toll, wenn sich das einfach so ändern ließe?!

    auch gewerblich als User "Speaker Base" unterwegs

  • Hallo Civer, ich analysiere hier seit einer Weile meine Datenbank und muss feststellen, dass der ARD von All-Ex besser funktioniert als meine Nutzung bisher. Ist etwas lästig nun alles wieder anders zu strukturieren aber langfristig wird das so viel komfortabler und ich brauch an euren Programmen nichts ändern. Das funktioniert so wirklich fantastisch und ist zudem automatisiert. Bisher habe ich da noch viel Zeit investiert. Dennoch danke für deine Hilfsbereitschaft!

    auch gewerblich als User "Speaker Base" unterwegs

  • Nachdem ich nun alles umstrukturiert und angepasst habe, muss ich noch einmal ausdrücken, wie begeistert ich von dem Tool bin! Ich kann daher komplett auf die Zoom Control verzichten im MadVR verzichten und so CopyBack raushauen, was mir ~20-25% niedrigere Renderzeiten beschert. Zudem funktioniert es wesentlich zuverlässiger und steuert nicht nur die LM sondern auch die passende Maskierung und auch die Umschaltung auf mein HDR-Profil. Noch besser, es schaltet auch zuverlässig zurück. Da hat es bei MadVR immer gehakt. Das macht die ganze Sache insgesamt so viel "professioneller". Einfach spitze. Vielen vielen Dank dafür! Echt top, was manche so drauf haben und der Community beisteuern :sbier:





    Auch hier noch einmal als Anregung, wie ich das Tool aktuell nutze:


    Zunächst lasse ich mit All-Ex' ARD die AR bestimmen und auf diese Werte runden 1,78; 1,85; 2,0; 2,35 und 2,4 da ich nur 5LM habe und dieses die verbreitetsten Formate sind. Mein Ziel ist es die Höhe immer voll auszufüllen um wenigstens die obere Maskierung der Leinwand immer nutzen zu können. Da meine Leinwand ein Format von ~2.33 aufweist, beschneide ich zusätzliche alle Formate mit einer höheren AR seitlich. Aufgrund der drei Maskierungsslots habe ich mich zudem auf nur 4 LM beschränkt und schreibe die auf 2,0 benamten Filme händisch auf 2,35 um. Wenn ich 2,0 einfach weglassen würde im ARD, würden alle Filme mit 2 oder 2,1 zu AR1,85 zugeordnet werden udn ich könnte diese nicht mehr so einfach filtern.


    AR1,78 (entspricht einer Höhe von 1080/2160 Pixeln, jedoch ist eine AR von bis zu 1.791045 recht häufig, was 1072/2044 Pixeln entspricht)

    AR1,85 (entspricht einer Höhe von 1040/2080 Pixeln, jedoch ist eine AR von bis zu 1,875 sehr häufig, so dass ich die LM auf 1024/2048 Pixel Höhe einstelle inkl. 28 Pixel Maskierung oben und unten)

    AR2,35 (entspricht einer Höhe von 817/1634 Pixeln, jedoch ist eine AR von bis zu 2,352941 recht häufig, so dass ich die LM auf 816/1632 Pixel Höhe einstelle inkl. 132 Pixel Maskierung oben und unten + seitlich, da die Leinwand ein AR von ~2,33 aufweist)

    AR2,4 (entspricht einer Höhe von 800/1600 Pixeln, jedoch ist eine AR von bis zu 2,44898 recht häufig, so dass ich die LM auf 784/1568 Pixel Höhe inkl. 148 Pixel Maskierung oben und unten ...)


    Dabei deckt AR1,78 ~15%, AR1,85 ~20%, AR2,35 ~15% und AR2,4 den Rest von ~50% ab, um noch einen Überblick über die Gewichtung zu geben (wenn der Desktop noch Standardmäßig nicht 1,78 hätte, wäre das wohl das nächste Format, dass ich bei Notwendigkeit wegreduzieren würde).


    Somit habe ich ab einer AR von 2,33 ein maximal gefülltes Bild auf meiner Leinwand, was die Immersion deutlich erhöht. Dafür verliere ich zum Teil Bildinhalte und etwas Helligkeit. Mit einer seitlichen Maskierung für den Bereich <2,33 wäre ich jedoch optimal ausgerüstet.


    Man merkt schon, dass ich in manchen Bereichen ausgeprägte Zwänge habe und Spaß an Statistiken :beated:

    auch gewerblich als User "Speaker Base" unterwegs

  • Hab mich noch ein wenig mit der Maskierung des PJs beschäftigt.


    In dem Tool sind ja bereits die Befehle für Custom1-3 eingepflegt, um verschiedene Custom-Maskierungen aktivieren zu können.

    Dummerweise hat mein betagter X35 nur eine Custom-Einstellung, nicht drei verschiedene. Da ich aber zwei verschiedene seitliche Maskierungen brauche, müsste der Bereich dafür immer jeweils angepasst werden. Da es dafür extra Kommandos gibt, ist es mit dem Tool hier sehr einfach zu realisieren :thumbup:


    JVC bietet dafür ein Kommando für die Maskierung links, rechts, oben & unten an. Man muss dem Kommando nur noch den Betrag, d.h. wieviele Pixel maskiert werden sollen, mitschicken.

    Dafür werden die Pixel zuerst in Hex umgerechnet und danach in 4 Byte ASCII umgewandelt. Der Wert wird dann dem eigentlichen Kommando hinten angehängt.


    Das Kommando für die Maskierung ist:

    • Links: 21890149534D4C
    • Rechts: 21890149534D52
    • Oben: 21890149534D54
    • Unten: 21890149534D42


    Will man bspw 35 Pixel maskieren, ergibt sich:

    35 Dezimal = 23 Hexadezimal

    23 als 4 Byte Zeichenkette = "0023"

    "0023" in ASCII = 0x30 0x30 0x32 0x33


    Daraus ergibt sich das gesamte Kommando als: 21890149534D4C303032330A

    (jedes Kommando muss immer mit 0A abschließen & in dem Beispiel für links)


    Beim abschicken muss nur noch beachtet werden, dass vorher eine Custom-Maskierung aktiviert werden sollte.

    Ansonsten klappt das umschalten auf die Art aber wunderbar :sbier:

    "A computer lets you make more mistakes faster than any other invention in human history, with the possible exceptions of handguns and tequila." - Mitch Ratcliffe

Jetzt mitmachen!

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