Jump to content
nuts

Einfaches Eventghost Plugin für den DVBViewer

Recommended Posts

nuts
File "win32com\client\dynamic.pyc", line 516, in __getattr__

AttributeError: DVBViewerServer.DVBViewer.SendCommand

 

 

Hm das sieht nach einen Fehler direkt in der python lib. (win32com) aus?

 

Ich kann das leider nicht reproduzieren. :(

Schonmal mit verschiedenen Wartezeiten experimentiert?

 

P.S. Hat das Problem sonst noch jemand?

 

Share this post


Link to post
dbraner

Ich vermute auch ein COM-Problem. Der COM-Server vom DVBViewer ist noch nicht da, wenn EG gestartet wird. Allerdings würde das bedeuten, dass Dein Plugin bereits bei der Initialisierung im EG-Autostart versucht, eine Verbindung zum DVBViewer aufzubauen und dabei nachhaltig aus dem Tritt kommt. Dagegen spricht, dass beim Starten von EG trotz fehlendem DVBViewer keine Fehlermeldung in EG kommt.

 

Der Fehler tritt ja auf wenn alles läuft, also DVBViewer und EG sind beide gestartet. Dann löse ich eine Action im EG aus, Dein Plugin wird aufgerufen und fällt auf die Schnauze.

Edited by dbraner

Share this post


Link to post
nuts

Das Plugin versucht schon direkt beim Start eine Verbindung zum DVBViewer aufzubauen, aber wie du auch schon festgestellt hast ist es eigentlich kein Problem.

 

Ich nehme an da schmeisst "win32com" Fehler und kommt aus dem Tritt. :(

 

Die entsprechenden Zeilen sehen so aus:

class Sendcommand_through_COM(eg.ActionBase):

def __call__(self):

if self.plugin.dvbviewer2 is None:

try:

self.plugin.dvbviewer2 = GetObject(Class="DVBViewerServer.DVBViewer")

except pythoncom.com_error:

self.plugin.dvbviewer2=None

self.plugin.TriggerEvent('DVBViewer not available')

#eg.PrintError("Error GetObject - DVBViewer not available?")

return

try:

self.plugin.dvbviewer2.SendCommand(self.value)

except pythoncom.com_error:

self.plugin.dvbviewer2=None

self.plugin.TriggerEvent('DVBViewer not available')

#eg.PrintError("Error self.plugin.dvbviewer2.SendCommand - DVBViewer not available?")

Ich schau nochmal ob ich das nachstellen kann.

Sonst kann ich da wenig machen. :(

Edited by nuts

Share this post


Link to post
nuts

Du könntest den Verbindungsaufbau beim Start auch mal auskommentieren:

class DVBViewerPlugin(eg.PluginBase):

def __init__(self):

self.AddActionsFromList(ACTIONS, Sendcommand_through_COM)
self.AddActionsFromList(MyACTIONS, Sendcommand_through_COM)
self.AddAction(Start)
self.AddAction(SendAction)
self.AddAction(OSDisvisible)

#try:
#self.dvbviewer2 = GetObject(Class="DVBViewerServer.DVBViewer")

#except pythoncom.com_error:
#eg.PrintError("Error GetObject - DVBViewer not available?")
self.dvbviewer2=None

self.dvbviewerpath="C:\Program Files\DVBViewer\DVBViewer.exe"
self.oMyFunctions=MyFunctions()

 

 

Share this post


Link to post
dbraner

Ich schau mir das mal an. Scheint so als müsste ich auf meine alten Tage auch noch Python lernen.

Share this post


Link to post
nuts

Dann mal viel Spaß. :D

 

Hab verschiedenes ausprobiert und kanns nicht nachvolllziehen - sorry würde gerne helfen aber weiss auch nicht weiter. :(

Kannst du deine EG Konfig. mal anhängen? Vielleicht klappts ja mit der?

Share this post


Link to post
dbraner

Yep! Das Auskommentieren der DVBViewer Verbindung bei der Plugin-Initialisierung hat geholfen. Der Fehler tritt jetzt nicht mehr auf. Allerdings kommt beim ersten SendAction nach dem Aufwachen immer die Meldung "DVBViewer not available". Schau ich mir auch noch mal an.

 

Eine Frage noch: Ich habe jetzt die Datei __init__.py im DVBViewer Simple Verzeichnis angepasst. Im gleichen Verzeichnis gibt es noch eine __init__pyc

 

Was ist damit? Ist eine Binärdatei. Die wurde nicht geändert. Muss ich da noch was machen?

 

EDIT: Jetzt hab ich noch eine Idee. Bei der Initialisierung des Plugins wird ja in self.dvbviewer2 die COM-Referenz auf den DVBViewer gespeichert. Wenn jetzt beim Standby EG nicht beendet wird, bleibt das alte Handle gespeichert, d.h. nach dem Aufwachen (bei dem der DVBViewer neu gestartet wird) ist dieser Wert nicht mehr gültig. Er wird aber in Deinem Plugin trotzdem verwendet wegen der Prüfung auf "self.plugin.dvbviewer2 is None".

 

Also gibt es 2 Möglichkeiten: 1) man beendet vor dem Standby EG. oder 2) Man initialisiert das Plugin beim Aufwachen aus dem Standby neu.

 

Die Frage ist: Wie initialisiert man ein Plugin neu? Deaktivieren und wieder Aktivieren hilft nicht.

Edited by dbraner

Share this post


Link to post
nuts

Die "__init__pyc" wird vom Interpreter (zur Laufzeit?) erzeugt.

Ich lösch die vor Code-Änderungen sicherheitshalber meistens, aber nötig scheint das nicht zu sein.

Genaue Details wie man richtig mit Python umgeht hab ich auch nicht. :D

 

Ich würde vermuten, dass nach dem Standby eine Komponente nicht bereit ist und irgendwo das Errorhandling (win32com, EG Core?) nicht ganz sauber ist.

 

"DVBViewer not available" kommt immer dann wenn ein Befehl zum DVBV geschickt wird und dieser nicht erreicht werden kann.

In dem Fall versucht mein Plugin erneut eine Verbindung aufzubauen und erzeugt das Event "DVBViewer not available", damit man darauf reagieren kann.

Die entsprechenden Skriptzeilen hab ich oben schon gepostet.

Man könnte den Befehl dann einfach nochmal an den DVBViewer schicken.

Also Verbindung erneut aufbauen + Event absetzen + Sendcommand erneut senden.

Weiss nicht ob das besser ist.

 

P.S: HIlft vielleicht ein einfaches sleep im Autostart von EG? (1-2 Sekunden)

Edited by nuts

Share this post


Link to post
nuts
EDIT: Jetzt hab ich noch eine Idee. Bei der Initialisierung des Plugins wird ja in self.dvbviewer2 die COM-Referenz auf den DVBViewer gespeichert. Wenn jetzt beim Standby EG nicht beendet wird, bleibt das alte Handle gespeichert, d.h. nach dem Aufwachen (bei dem der DVBViewer neu gestartet wird) ist dieser Wert nicht mehr gültig. Er wird aber in Deinem Plugin trotzdem verwendet wegen der Prüfung auf "self.plugin.dvbviewer2 is None".

Nicht zwangsläufig, aber in deinem Fall natürlich schon.

Allerdings sollte das keinen Crash zur Folge haben sondern einen erneuten Verbindungsaufbau und das absetzen des Events.

 

edit\

Ich nehme auch an, dass EG nach dem Standby alle Plugins neu initalisiert? Sonst dürfte das auskommentieren ja keine Wirkung zeigen?

Edited by nuts

Share this post


Link to post
dbraner

Habs jetzt. EG Initialisiert die Plugins nach dem Aufwachen nicht neu! Auch nicht beim Deaktivieren und Aktivieren. Wenn nun wie in meinem Fall beim Standby der DVBViewer beendet wird, EG aber nicht, verliert die in self.dvbviewer2 gespeicherte COM-Referenz ihre Gültigkeit. Da in Deinem Plugin auf =None geprüft wird, trifft diese Bedingung nach dem Aufwachen nicht zu und die COM-Referenz wird nicht mit der Verbindung zu dem neu gestarteten DVBViewer aktualisiert.

 

Abhilfe: Ich habe Deinem Plugin eine neue Funktion "ConnectDVBViewer" hinzugefügt. Diese wird als Reaktion auf den System-Event "Resume" aufgerufen und initialisiert die Verbindung zum DVBViewer neu. Sollte der DVBViewer zu diesem Zeitpunkt noch nicht laufen ist das auch kein Problem. In diesem Fall wird self.DVBViewer auf None gesetzt und dann eben beim ersten SendCommand neu initialisiert.

 

Hier der Code:

class ConnectDVBViewer(eg.ActionBase):

   def __call__(self):

      try:
         self.plugin.dvbviewer2 = GetObject(Class="DVBViewerServer.DVBViewer)

      except pythoncom.com.error:
         self.plugin.dvbviewer2 = None
         self.plugin.TriggerEvent("DVBViewer is not available")

Dann noch das Ganze in class DVBViewerPlugin mit self.AddAction(ConnectDVBViewer) für EG verfügbar gemacht. Fertig.

 

Nebeneffekt: Meiner Programmiersprachensammlung eine weitere hinzugefügt.

Share this post


Link to post
nuts

Habs jetzt. EG Initialisiert die Plugins nach dem Aufwachen nicht neu! Auch nicht beim Deaktivieren und Aktivieren. Wenn nun wie in meinem Fall beim Standby der DVBViewer beendet wird, EG aber nicht, verliert die in self.dvbviewer2 gespeicherte COM-Referenz ihre Gültigkeit. Da in Deinem Plugin auf =None geprüft wird, trifft diese Bedingung nach dem Aufwachen nicht zu und die COM-Referenz wird nicht mit der Verbindung zu dem neu gestarteten DVBViewer aktualisiert.

Da hast du schon recht, aber sowas kann ja immer passieren.

z.B. auch wenn der DVBViewer beendet wird und EG davon nichts mitbekommt.

Der Fall wird eigentlich ja auch abgefangen.

 

Den Befehl ConnectDVBViewer(eg.ActionBase): nehm ich gerne ins Plugin auf.

 

P.S. Ich schau nochmal ob sich nicht eine andere Lösung finden lässt.

Heute ist Hochwasser in Baden-Würtemberg und ich bin mit dem Keller beschäftigt. :glare:

 

Share this post


Link to post
nuts

edit\

Hm so gehts doch nicht. :(

Edited by nuts

Share this post


Link to post
nuts

Also ich hab das grundsätzliche Problem denke ich gefunden und auch den Grund wieso ich damals mit "none" rumgeeiert habe.

Mein Errorhandling war schlecht. Von daher nehme ich die Vorwürfe an win32com bzw. den EG-Core zurück. :)

 

edit\ Update im Startpost auf Version 0.4

 

Imho sollte dadurch auch das Standby-Problem behoben sein (ohne den Trick) von @dbraner).

Sollte das absetzen eines Befehls mal nicht funktionieren versucht das Plugin jetzt immer sich erneut mit dem DVBViewer zu verbinden und den Befehl erneut loszuschicken.

Dadurch sollte eine ungültig gewordene COM-Referenz keine Rolle mehr spielen.

 

Den Befehl ConnectDVBViewer hab ich trotzdem eingebaut. Könnte man ja trotzdem mal noch brauchen. :)

 

P.S: Der Python Editor treibt mich noch in den Wahnsinn ...

Edited by nuts

Share this post


Link to post
dbraner

Danke für die schnelle Anpassung. Werde es testen.

Share this post


Link to post
dbraner

Weißer Rauch :D

 

Das Plugin funktioniert jetzt auch dann, wenn Eventghost beim Standby nicht beendet wird, der DVBViewer jedoch schon.

Share this post


Link to post
nuts

Auf Wunsch anbei nochmal Version 0.3

 

Scheinbar lässt sich eine gesicherte Konfig.-Datei mit Version 0.3 nicht mehr mit Version 0.4 verwenden.

Jemand ne Ahnung woran das genau liegt?

 

Edited by nuts
  • Like 1

Share this post


Link to post
Famous

So erst einmal Danke für's nochmalige hochladen. Hab's nun getestet und es funktioniert einwandfrei mit der Version 0.3. Nun ist mir aber eine Idee gekommen. Und zwar hab ich einfach mal die 0.4er Files in den mit "DVBViewer simple_0_3" benannten Ordner geschoben und vorher natürlich die Original 0.3er Files gelöscht. Siehe da die Version 0.4 funktioniert in dem Ordner der Version 0.3. Warum das so ist? Absolut keinen Schimmer :D

 

Danke an nuts für die schnelle freundliche Rückmeldung!

Share this post


Link to post
nuts

Liegt der Schluss nahe, dass der Ordner-Name (DVBViewer simple_0_3 vs DVBViewer simple_0_4) im Pluginverzeichnis eine Rolle für die Sicherungsdatei spielt?
Müsste mal bei Gelegenheit die Konfigurationsdateien anschauen.

Edit\ So ist es:

 

<Plugin Identifier="DVBViewerPlugin" Guid="DVBViewer simple" File="DVBViewer simple">
gAIpLg==
</Plugin>

File="DVBViewer simple" beschreibt das Verzeichnis wonach gesucht wird.

Eine Konfig-Datei mit File="DVBViewer simple_0_3" sucht den Ordner "DVBViewer simple_0_3" und findet "DVBViewer simple_0_4".

Werde den Ordner Dowanload dann wohl mal besser in "DVBViewer simple" umbenennen.

Vom Plugin her kann ich daran aber eh nichts ändern.
Wäre wohl am besten das Plugin in einen Ordner ohne Versionhinweis abzulegen.

Wird 0.3 dann noch benötigt?

Edited by nuts

Share this post


Link to post
Famous

 

Wird 0.3 dann noch benötigt?

 

Von meiner Seite nicht :)

Share this post


Link to post
nuts

Ok 0.3 ist wieder entfernt worden.

Im Startpost gibt es ein mini Update mit geändertem Ordnername.

Edited by nuts

Share this post


Link to post
nuts

Ich arbeite gerade wieder am Plugin um ein paar Funktionen hinzuzufügen.

Punkt1: Erweiterte Events bei nicht verfügbarem DVBViewer

Punkt2: OSD-ShowInfo um aus EG eine Nachricht im DVBViewer anzeigen zu können.

Punkt3: Ein erweiterter Stopp Befehl (Abhängigkeit zu LiveTV, Timeshift, Mediawiedergabe)

 

Wer noch Wünsche hat sollte die möglichst zeitnah posten, da mich Python schon wieder in dem Wahnsinn treibt und ich jetzt gerade etwas drin bin.

Edited by nuts

Share this post


Link to post
VinoRosso

Ich hab mir mal ein isPlaying() dazugebaut um zu prüfen ob gerade was abgespielt wird (TV oder Medien), brauchte das irgendwann mal.

Wäre praktisch wenn das gleich mit drin ist :-)

Share this post


Link to post
nuts

Ok das dürfte kein Problem sein.

Wird eingebaut.

 

Wie soll die Rückgabe Aussehen? Ein Event jeweils für den Status?

Edited by nuts

Share this post


Link to post
VinoRosso

Ich hab nur true/false benötigt, hab einfach das Ergebnis von comschnittstelle.isPlaying() zurückgegeben. Mehr brauchte ich persönlich nicht und würde mir reichen.

Share this post


Link to post
nuts

Ok das dürfte kein Problem sein.

Wenn du dazu kommst kannst du mal bitte die entsprechenden Zeile raussuchen? Nur damit die Events auch wirklich gleich sind, damit sich das nahtlos in deine Konfiguration einfügt.

Share this post


Link to post
VinoRosso

Ich hab das leider aus versehen gelöscht :-)

 

Wollte das bei Gelegenheit wieder in Angriff nehmen, aber ich dachte wenn du das gleich mit einbauen könntest kann ich mir das sparen.

Mach einfach wie du möchtest, ich pass mich dann an die Gegebenheiten an ;-)

Share this post


Link to post
nuts

Na gut macht dann ja auch nichts. Zu kompliziert sollte das nicht sein.

Ich würde ein Event abfeuern wie:

"DVBViewer simple isPlaying: true" und "DVBViewer simple isPlaying: false" und das true/false wenn möglich im payload oder Suffix unterbringen, damit man damit ggf. als Python-Skript in EG selbst direkt weiterarbeiten kann.

Edited by nuts

Share this post


Link to post
nuts

Im Startpost ist ein Update des Plugins. :)

 

edit\ Die alte Version 0.4.1 habe ich noch im Startpost gelassen, da die Änderungen im Code recht umfangreich waren.

Edited by nuts

Share this post


Link to post
_Oli_

gibt es eine Möglichkeit, den Audiokanal auf A oder B zu bestimmen? Wenn ich radio hören möchte, tue ich das auf Audio B und TV auf Audio A. Wäre also sehr praktisch für mich, wenn ich das meiner lernbaren FB irgendwie beibringen könnte

 

EDIT: Habs mit einer Auto B Bedingung gelöst

Edited by _Oli_

Share this post


Link to post
nuts

Ok gut.

 

Den Audio/Video A/B Toggle kannst du auch jetzt schon per Action ID (Ordner actions.ini) verwenden.

Einen Befehl um gezielt Audio A oder Audio B anzuwählen könnte ich fürs nächste Update einbauen.

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...