enigma2 module benutzen - timer

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • enigma2 module benutzen - timer

      Aloha ihr Codequäler,

      das leidige Problem: Ich will bissi spielen,aber bin offensichtlich zu doof und sowieso schonmal kein "Programmierer" ;)
      Also schreits Hilfe im Forum.

      Ich spiele ein wenig mit den enigma2-Plugin Tutorials rum und möchte nun einfach mal ein bissi weiter gehn.

      Das typische "Hello World" in einer meeeagebox soll mir jetzt einfach mal was anderes ausgeben, also hab ich mich auf die Suche nach irgendwas "sinnvollen" begeben und bin auf die Timerlist gestossen.

      Ziel: Plugin ausführen --> nächsten Timer anzeigen

      Zum testen geeignet erscheint mir dieses Modul:
      dream.reichholf.net/pydoc/html…Timer_1_1RecordTimer.html
      bzw.
      dream.reichholf.net/pydoc/html…namespaceRecordTimer.html

      Also

      Quellcode

      1. from RecordTimer import getNextActivation


      Damit müsste sich doch z.b. die nächste Aufnahmezeit einfach mal in der msgbox anzeigen lassen.


      Mein Codeschnipsel hier sieht so aus

      Python-Quellcode

      1. def __init__(self, session, args = None):
      2. self.session = session
      3. Screen.__init__(self, session)
      4. next_activation = getNextActivation.next_activation
      5. self["myLabel"] = Label(_("please press ok"))
      6. self["myActionMap"] = ActionMap(["SetupActions"],
      7. {
      8. "ok": self.myMsg,
      9. "cancel": self.close # add the RC Command "cancel" to close your Screen
      10. }, -1)
      11. def myMsg(self):
      12. print "\n[HalloWorldMsg] OK pressed \n"
      13. self.session.open(MessageBox,_(next_activation), MessageBox.TYPE_INFO)
      Alles anzeigen


      Wenn ich aber auf die Erweiterungen gehe sagt mir eine Infobox, dass er den "name" getNextActivation nicht einbinden kann oder sowas in der Art.

      Wo ist denn hier mein Denkfehler ?
      Ich importiere die Funktion, ich weise meiner lokalen Variable "next_activation" den Rückgabewert aus der Funktion getNextActivation und hier genauer next_activation zu und wills ausgeben.
      Ich blick das grad nicht.

      Danke schonmal im voraus

      Gruss Hoschi
    • Ok, eine Schritt weiter bin ich...

      Quellcode

      1. from RecorTimer import RecordTimer, RecordTimerEntry

      und schon läd das Plugin, produziert aber nen greenscreen.. nichts anderes ahb ich erwartet :D


      Screen <class 'Plugins.Extensions.chtest.plugin.HalloWorldScreen'>((), {}): <type 'exceptions.NameError'>
      Traceback (most recent call last):
      File "/usr/lib/enigma2/python/mytest.py", line 239, in create
      return screen(self, *arguments, **kwargs)
      File "/usr/lib/enigma2/python/Plugins/Extensions/mytest/plugin.py", line 41, in __init__
      self.next_activation = getNextActivation.next_activation
      NameError: global name 'getNextActivation' is not defined


      Quellcode

      1. self.next_activation = getNextActivation.next_activation
      2. self["myLabel"] = Label(_("please press ok"))
      3. self["myActionMap"] = ActionMap(["SetupActions"],
      4. {
      5. "ok": self.myMsg,
      6. "cancel": self.close # add the RC Command "cancel" to close your Screen
      7. }, -1)
      8. def myMsg(self):
      9. print "\n[HalloWorldMsg] OK pressed \n"
      10. self.session.open(MessageBox,_(self.next_activation), MessageBox.TYPE_INFO)
      Alles anzeigen
    • RE: enigma2 module benutzen - timer

      Is zwar zum Spielen OK, aber das Plugin "InfoBarTunerState" zeigt die anliegenden (nächsten) Aufnahmen in einer Betaversion schon an.
      ----------------------------------------------------------------------------------------------------------------------------------------------------------------
      KAPIERVORGANG beendet.

      Zubehör : Philips 46PFL-9705 / 37PFL-9604, Samsung HT-E6759W, Samsung SPF 107H-105P-87H, Qnap TS-253A, Harmony 650, Fritzbox 7490, Cisco WAP4410N, Netgear M4100-D12G, TPLink HS100/HS110/LB110
    • Ich würde sagen nein, weil
      NameError: global name 'getNextActivation' is not defined


      Ich denke ich hab grundsätzlich n Verständnisproblem, da ich der Meimung war, wenn ich importiere, kann ich direkt drauf zugreifen, vielleicht ist aber ein bissi Mehraufwand nötig.
    • Hab mal in der RecordTimer.py nachgeschaut:

      Quellcode

      1. def getNextRecordingTime(self):
      2. now = time()
      3. for timer in self.timer_list:
      4. next_act = timer.getNextActivation()
      5. if timer.justplay or next_act < now:
      6. continue
      7. return next_act
      8. return -1
      Carpe diem!

      Skin: CerX FHD | Plugins: TMDb, BacksNcovers, FritzDect, AutoShredder, PluginMover | EPG: GraphMultiEPG | ... [Alle anzeigen]

      Vu+ Wiki
    • Die init Funktion vom RecordTimerEntry braucht sechs(bzw. sieben) Parameter/Argumente (was der eigentliche Timer ist) die übergeben werden müssen um überhaupt die getNextActivation Funktion der RecordTimerEntry Klasse aufrufen zu können.

      In der RecordTimer Klasse kannst die Funktion getNextRecordingTime ohne vorher Parameter anzugeben aufrufen.

      Quellcode

      1. from RecordTimer import RecordTimer
      2. myrecords = RecordTimer() #hier bekommst die Klasse
      3. mynextactivation = myrecords.getNextRecordingTime() # hier bekommst den Wert
      4. oder
      5. mynextactivation = myrecords.getNextRecordingTime # hier bekommst die verbundene Funktion und nicht den Wert

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von removed ()

    • Wird sofort probiert :)
      Mal schauen, wann die Kiste anfängt Rauchzeichen zu geben :)


      EDIT:

      muss vor

      myrecords = RecordTimer() #hier bekommst die Klasse
      mynextactivation = myrecords.getNextRecordingTime() # hier bekommst den Wert

      jweils noch n self ?

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von hoschi78 ()

    • kommt drauf an was Du vor hast, willst Du es nur in einer Funktion verwenden brauchst keines, willst es in der ganzen Klasse verfügbar haben würde ich es voranstellen



      PS: Thread editieren kann gefährlich sein, hab jetz nur durch Zufall Deinen Nachtrag gelesen
    • Dem besseren Verständnis bzw. der besseren Fehlersuche wegen hier mal das komplette Script plugin.py

      Python-Quellcode

      1. from Screens.Screen import Screen
      2. from Components.Label import Label
      3. from Components.ActionMap import ActionMap
      4. from Plugins.Plugin import PluginDescriptor
      5. from Screens.MessageBox import MessageBox
      6. from RecordTimer import RecordTimer
      7. ###########################################################################
      8. class HalloWorldScreen(Screen):
      9. skin = """
      10. <screen position="130,150" size="460,150" title="test 123" >
      11. <widget name="myLabel" position="10,60" size="200,40" font="Regular;20"/>
      12. </screen>"""
      13. def __init__(self, session, args = None):
      14. self.session = session
      15. Screen.__init__(self, session)
      16. myRecords = RecordTimer()
      17. myNext = myRecords.getNextRecordingTime()
      18. self["myLabel"] = Label(_("please press ok"))
      19. self["myActionMap"] = ActionMap(["SetupActions"],
      20. {
      21. "ok": self.myMsg,
      22. "cancel": self.close # add the RC Command "cancel" to close your Screen
      23. }, -1)
      24. def myMsg(self):
      25. print "\n[HalloWorldMsg] OK pressed \n"
      26. self.session.open(MessageBox,_(myNext), MessageBox.TYPE_INFO)
      27. def cancel(self):
      28. print "\n[HalloWorldMsg] cancel\n"
      29. self.close(False,self.session)
      30. ###########################################################################
      31. def main(session, **kwargs):
      32. print "\n[Hallo World] start\n"
      33. session.open(HalloWorldScreen)
      34. ###########################################################################
      35. def Plugins(**kwargs):
      36. l = [PluginDescriptor(name="my test", description=_("whats going on?"), where = PluginDescriptor.WHERE_PLUGINMENU, icon="tuxbox.png", fnc=main)]
      37. l.append(PluginDescriptor(name="my test", description=_("schaumerma"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, icon="tuxbox.png", fnc=main))
      38. return l
      Alles anzeigen


      Es öffnet sich wie erwartet zuerst eine Textbox mit dem Label "test 123" und dem Test "please press ok". Nach drücken auf OK kommt aber der GreenScreen.
      Es wird im Prinzip nur angemeckert, dass es kein "myNext" in der MsgBox gibt, soweit ich das sehen konnte.


      ProcessRepeated
      It's now Mon Jul 30 23:04:56 2012
      next real activation is Tue Jul 31 13:04:40 2012
      [timer.py] next activation: 1343682396 (in 99205 ms)
      Looking for embedded skin
      allocating new converter!
      action -> SetupActions ok

      [HalloWorldMsg] OK pressed

      Traceback (most recent call last):
      File "/usr/lib/enigma2/python/Components/ActionMap.py", line 46, in action
      res = self.actions[action]()
      File "/usr/lib/enigma2/python/Plugins/Extensions/chtest/plugin.py", line 35, in myMsg
      self.session.open(MessageBox,_(myNext), MessageBox.TYPE_INFO)
      NameError: global name 'myNext' is not defined
      (PyObject_CallObject(<bound method ActionMap.action of <Components.ActionMap.ActionMap instance at 0x20f7350>>,('SetupActions', 'ok')) failed)


      Hier ist wohl eher Python lernen angesagt als enigma2 verstehen oder ?
      Wo isser, der Fehlerteugel, der Dreggsagg ?

      Liegts daran, dass ich die Variablen in der init drin habe ? Müssen die in die myMsg ?

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von hoschi78 ()

    • OK, der crashlog sieht nun schon anders aus...
      So wie ich das lese ist die Ausgabe nicht das, was msgbox erwartet ?

      ProcessRepeated
      It's now Mon Jul 30 23:22:04 2012
      next real activation is Tue Jul 31 13:04:40 2012
      [timer.py] next activation: 1343683424 (in 99320 ms)
      Looking for embedded skin
      allocating new converter!
      action -> SetupActions ok

      [HalloWorldMsg] OK pressed

      Traceback (most recent call last):
      File "/usr/lib/enigma2/python/Components/ActionMap.py", line 46, in action
      res = self.actions[action]()
      File "/usr/lib/enigma2/python/Plugins/Extensions/chtest/plugin.py", line 35, in myMsg
      self.session.open(MessageBox,_(self.myNext), MessageBox.TYPE_INFO)
      File "/usr/lib/enigma2/python/mytest.py", line 312, in open
      dlg = self.current_dialog = self.instantiateDialog(screen, *arguments, **kwargs)
      File "/usr/lib/enigma2/python/mytest.py", line 247, in instantiateDialog
      return self.doInstantiateDialog(screen, arguments, kwargs, self.desktop)
      File "/usr/lib/enigma2/python/Plugins/Extensions/SerienFilm/plugin.py", line 74, in doInstantiateDialogSF
      dlg.applySkin()
      File "/usr/lib/enigma2/python/Components/GUISkin.py", line 112, in applySkin
      self.createGUIScreen(self.instance, self.desktop)
      File "/usr/lib/enigma2/python/Components/GUISkin.py", line 28, in createGUIScreen
      val.GUIcreate(parent)
      File "/usr/lib/enigma2/python/Components/GUIComponent.py", line 108, in GUIcreate
      self.postWidgetCreate(self.instance)
      File "/usr/lib/enigma2/python/Components/VariableText.py", line 24, in postWidgetCreate
      instance.setText(self.message or "")
      TypeError: in method 'eLabel_setText', argument 2 of type 'std::string const &'
      (PyObject_CallObject(<bound method ActionMap.action of <Components.ActionMap.ActionMap instance at 0x221ef08>>,('SetupActions', 'ok')) failed)
      getResolvedKey config.plugins.crashlogautosubmit.sendAnonCrashlog failed !! (Typo??)
      resolve: resolve ${sysconfdir}/enigma2/settings
      resolve: -> /etc/enigma2/settings
      getResolvedKey config.plugins.crashlogautosubmit.addNetwork failed !! (Typo??)
      resolve: resolve ${sysconfdir}/enigma2/settings
      resolve: -> /etc/enigma2/settings
      getResolvedKey config.plugins.crashlogautosubmit.addWlan failed !! (Typo??)
      resolve: resolve ${sysconfdir}/enigma2/settings
      resolve: -> /etc/enigma2/settings


      Ehrlich gesagt sagt mir das jetzt gar nichts mehr, der crahs kommt zwar, wenn ich OK gedrückt habe beim ersten Infos-Screen, aber ich kann da jetzt keienn Fehler finden, der auf "mich" zurückzuführen ist.. aber DU bist das Oberbrain.. was meckert der gute denn ?
    • MUHAHAHA :D
      Funktioniert :D

      Wie krieg ich jetzt n virtuelles Bier zu dir ? ;)

      Meine Vermutung war zwar richtig, was ansich bedeutet, dass ich nicht ganz so blöde bin, aber bis ich das richtige gefunden hätte, wäre .. naja.. morgen geworden ;)

      Vielen Dank für deine Hilfe... aber.. darfst dir denThread gern bookmarken.. ich wette ich hab bald wieder Fragen :D

      JETZT kanns weiter gehn.. ich mach das ja nich ohne Hintergedanken ;)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von hoschi78 ()

    • @MODs
      Für den Fall, dass dieser Post lieber in einem neuen Thread gesehen wird, bitte entsprechend hier cutten. Danke.

      Nächstes Ziel:
      Plugin (oder Funktion daraus) "automatisiert" starten, sprich ausführen anhand eines Events, der KEIN Tastendruck auf der FB ist.

      Auf der VU gibts kein "at" für eine Zeitsteurung und im cron.d oder crontab finde ich auch nichts, also gehe ich davon aus, dass ein wie auch immer geartetes event handling implementiert ist.
      Bestes Beispiel hierfür ist wieder das vorher schon angesprochene InfoBarTunerState-Plugin

      In meiner einzig bekannten enigma2-Doku finde ich das wohl am naheliegenste
      dream.reichholf.net/pydoc/html…ls_1_1Event_1_1Event.html
      was ich aber wiederum nicht als import in den py-Dateien des Beispiel-Plugins finde.

      Was dem Ganzen wohl am naheliegensten erscheint, wenn ich mir die Sourcen anschaue, ist das
      from Components.ServiceEventTracker import ServiceEventTracker
      und/oder
      from ServiceReference import ServiceReference


      Schlau bin ich aus dem Quellcode allerdings auch nicht geworden.

      Interessant zu wissen ist hier also für mich, ob ich zum einen auf dem richtigen Weg bin udn nicht in den falschen Ecken rumsuche und ob es überhaupt eine umfangreiche enigma2-Doku gibt und natürlich wo ich die finde.

      Tips und Beispielcode sind natürlich auch gern gesehen, da ich schon immer am meisten gelernt habe, wenn ich rumprobiert hab in diversen scripten.

      Danke im Voraus
      Hoschi
    • Installiert und reingeschaut, ich finde dort import für eTimer, was ich auch schon im InfoBarTunerState Plugin gefunden habe. Ich denke hier bin ich an der richtigen Stelle.

      Ich habe mein script um eine "timer-Funktion" erweiter und hoffte nun, dass mein Plugin nach 10000µS automatisch ausgeführt wird, tuts aber nicht.

      Python-Quellcode

      1. from Screens.Screen import Screen
      2. from Components.Label import Label
      3. from Components.ActionMap import ActionMap
      4. from Plugins.Plugin import PluginDescriptor
      5. from Screens.MessageBox import MessageBox
      6. from RecordTimer import RecordTimer
      7. from enigma import eTimer
      8. import os
      9. ###########################################################################
      10. class HalloWorldScreen(Screen):
      11. skin = """
      12. <screen position="130,150" size="460,150" title="test 123" >
      13. <widget name="myLabel" position="10,60" size="200,40" font="Regular;20"/>
      14. </screen>"""
      15. def __init__(self, session, args = None):
      16. self.session = session
      17. Screen.__init__(self, session)
      18. myRecords = RecordTimer()
      19. self.myNext = str(myRecords.getNextRecordingTime())
      20. self["myLabel"] = Label(_("please press ok"))
      21. self["myActionMap"] = ActionMap(["SetupActions"],
      22. {
      23. "ok": self.myMsg,
      24. "cancel": self.close # add the RC Command "cancel" to close your Screen
      25. }, -1)
      26. self.startTimer
      27. def myMsg(self):
      28. print "\n[HalloWorldMsg] OK pressed \n"
      29. print self.myNext
      30. self.session.open(MessageBox,_(self.myNext), MessageBox.TYPE_INFO)
      31. def cancel(self):
      32. print "\n[HalloWorldMsg] cancel\n"
      33. self.close(False,self.session)
      34. def startTimer(self):
      35. shutdowntime = 10000
      36. self.AutoShutDownTimer = eTimer()
      37. self.AutoShutDownTimer.start(shutdowntime, True)
      38. self.AutoShutDownTimer.callback.append(self.myMsg)
      39. ###########################################################################
      40. def main(session, **kwargs):
      41. print "\n[Hallo World] start\n"
      42. session.open(HalloWorldScreen)
      43. ###########################################################################
      44. def Plugins(**kwargs):
      45. l = [PluginDescriptor(name="my test", description=_("whats going on?"), where = PluginDescriptor.WHERE_PLUGINMENU, icon="tuxbox.png", fnc=main)]
      46. l.append(PluginDescriptor(name="my test", description=_("schaumerma"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, icon="tuxbox.png", fnc=main))
      47. return l
      Alles anzeigen

      Im __init__ wird der "startTimer" aufgerufen, der startTimer gibt eTimer ein "addTimer".
      Den callback habe ich so verstanden, dass bei der Rückgabe von "eTimer-->meinTimer" = "ich leg jetzt los" myMsg aufegrufen wird.

      Scheinbar ist das nicht so.