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

    • Blind muss man sein ;) ist geändert und ich hab den Wert mal auf 60000 gesetzt, da das ja wohl Millisekunden sind, sprich auch 60 Sekunden, es passiert allerdings nichts.

      Muss ein Plugin, was Timer setzt, eventuell in nem anderen Ordern gespeichert werden ?
      Ich habe in deinem Plugin auch nichts gefunden, was "extra initialisiert".

      Mein testplugin kann ich ganz normal starten ohne irgendwelche ersichtlichen Fehler, ich ging aber davon aus, dass es jetzt automatisch startet, sprich dass enigma2 die Plugins alle durchinitialisiert und wenn eines einen Timer setzt, das Plugin dann aus/fortgeführt wird. Ist diese Annahme falsch ?
    • Ok, gesehn.. du rufts da ne Funktion autostart auf, ich habs mit der "main" versucht, und hab nen greenscreenloop bekommen. Also scheints so nicht zu gehn.

      Quellcode

      1. return [PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc = autostart),
      2. PluginDescriptor(name=_("AutoShutDown Setup"), description=_("AutoShutDown for VU+"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup),
      3. PluginDescriptor(name=_("AutoShutDown Setup"), description=_("AutoShutDown for VU+"), where = PluginDescriptor.WHERE_PLUGINMENU, icon="autoshutdown.png", fnc=main),
      4. PluginDescriptor(name=_("AutoShutDown Setup"), description=_("AutoShutDown for VU+"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=main)]



      Deine Funktion sieht wie folgt aus

      Quellcode

      1. def autostart(reason, **kwargs):
      2. global session
      3. if kwargs.has_key("session") and reason == 0:
      4. session = kwargs["session"]
      5. print "[AutoShutDown] start...."
      6. config.misc.standbyCounter.addNotifier(standbyCounterChanged, initial_call = False)
      7. ## from InfoBarGenerics.py
      8. eActionMap.getInstance().bindAction('', -0x7FFFFFFF, keyPressed)
      9. ##
      10. shutdownactions.startKeyTimer()


      Ich gehe davon aus, dass ich Zeile 5,6,8 ebenfalls aussen vor lassen kann und rufe dann nicht "startKeyTimer" auf, sondern myMsg.

      Das Problem was ich hier jetzt sehe ist allerdings, dass ich in der __init__ ja die "nextActivationTime" aus den Timern auslese und ansich hinten dran die myMsg starte.

      Ich müsste jetzt also innerhalb "myMsg" die "nextActivationTime" auslesen ?

      Ich hoffe das ist halbwegs verständlich, wie ich das, was grade in meinem Kopf rumschwirrt.

      Wenn ich das script jetzt händisch ausführe bekomme ich die Meldung, dass autostart nicht definiert ist.

      Ich gehe mal davon aus, dass ich mit "fnc = autostart" nicht zwingend in die Funktion autostart springen muss, ich dachte das ginge mit "main", resultiert aber in einem greenscreenloop.. irgendwas mit "main akzeptiert nur 1 parameter" oder so.

      Mit fnc=main(self) (keine Ahnung wieso grad self) startet die Box wieder, aber Funktion ist dennoch nicht gegeben.

      Fakt ist, man muss dem "Plugin" mitgeben, dass es automatisch starten soll. Das kann man in eine Funktion auslagern, muss man aber nicht und kann das in "main" machen. Ist das soweit richtig ?

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

    • Der Vollständigkeit halber hier nochmal das aktuelle Script, was nicht automatisch startet und bei manuellem Aufruf mit der Nachricht "global name "autostart" is not defined" nicht geladen wird.

      Wo ich autostart jetzt definieren müsste, ist mir aber unklar.

      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.startTimer(self)
      21. self.startTimer(self)
      22. self["myLabel"] = Label(_("please press ok"))
      23. self["myActionMap"] = ActionMap(["SetupActions"],
      24. {
      25. "ok": self.myMsg,
      26. "cancel": self.close # add the RC Command "cancel" to close your Screen
      27. }, -1)
      28. self.startTimer()
      29. def myMsg(self):
      30. print "\n[HalloWorldMsg] OK pressed \n"
      31. print self.myNext
      32. self.session.open(MessageBox,_(self.myNext), MessageBox.TYPE_INFO)
      33. def cancel(self):
      34. print "\n[HalloWorldMsg] cancel\n"
      35. self.close(False,self.session)
      36. def startTimer(self):
      37. shutdowntime = 30000
      38. self.AutoShutDownTimer = eTimer()
      39. self.AutoShutDownTimer.start(shutdowntime, True)
      40. self.AutoShutDownTimer.callback.append(self.myMsg)
      41. def autostart(reason, **kwargs):
      42. global session
      43. session = kwargs["session"]
      44. print "[AutoShutDown] start...."
      45. HalloWorldScreen.startTimer()
      46. ###########################################################################
      47. def main(session, **kwargs):
      48. print "\n[Hallo World] start\n"
      49. session.open(HalloWorldScreen)
      50. ###########################################################################
      51. def Plugins(**kwargs):
      52. return [PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc=autostart),
      53. PluginDescriptor(name=_("my test"), description=_("whats going on"), where = PluginDescriptor.WHERE_PLUGINMENU, icon="autoshutdown.png", fnc=main),
      54. PluginDescriptor(name=_("my test"), description=_("whats going on"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=main)]
      Alles anzeigen

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

    • Aus einem Plugin:

      Quellcode

      1. PluginDescriptor(where=PluginDescriptor.WHERE_AUTOSTART, fnc=autostart, needsRestart=False),
      2. PluginDescriptor(where=PluginDescriptor.WHERE_SESSIONSTART, fnc=sessionstart, needsRestart=False),
      Carpe diem!

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

      Vu+ Wiki
    • Ich habe keine Funktion sessionstart, plnick in seinem auch nicht. ich gehe somit davon aus, dass es nicht notwendig ist.
      needsRestart=False scheint mir ein zusätzlicher Parameter für das Plugin zu sein, was ich bei plnick auch nicht finde.
      Ich gehe somit davon aus, dass das nicht notwendig ist und mein Problemnicht löst. Sehe ich das falsch ?
    • Wenn ich den Ablauf jetzt mal Revue passieren lasse...

      - enigma startet und parst siene Plugins
      - mein Plugin definiert einen AUTOSTART auf die Funktion autostart
      - autostart registriert eine gloabe Variable namens session
      - autoststart ruft die Funktion startTimer auf
      - startTimer setzt eine Zeit-Variable für den Timer und füttert eTimer mit einem neuen Timer
      - nach Ablauf des timers wird die Funktion myMsg aufgerufen

      Wann und wie kommen bei einem autostart hier die Sachen ins Spiel, die bei __init__ zu finden sind ? Das erschleisst sich mir nicht.
    • Deine Autostart wird nicht aufgerufen weil er in der Klasse HalloWelt ist.

      Der Autostart muss eine eigene Funktion sein wie main (wie Du das Kind nennst ist Jacke wie Hose die Funktion muss nicht unbedingt autostart heissen)

      Die __init__ Funktion wird erst beim Aufruf der Klasse initialisiert und das passiert in Deinem obigen Beispiel erst wenn Du das Skript manuell aufrufst
    • Morgen plnick

      klingt verdammt logisch, war wohl spät gestern.

      D.h. im Umkehrschluss aber auch, dass ich selbst die "main" nennen könnte, wie ich will, solange ich in den Plugin-Definitionen drin stehen hab, WAS passieren soll, wenn man das Plugin wie auch immer staret, seis automatisch oder aber per Tastendruck im VTI Panel, richtig ?

      Edit:
      Gibts ne offizielle "mytest.py" unter /usr/lib/enigma2/python ?

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

    • Zur vollkommenen Verwirrung jetzt mal Dein obiges Hallo Welt Plugin anders =)

      Quellcode

      1. from datetime import datetime
      2. from enigma import eTimer
      3. from Plugins.Plugin import PluginDescriptor
      4. from RecordTimer import RecordTimer
      5. from Screens.MessageBox import MessageBox
      6. from Tools.Notifications import AddNotificationWithCallback
      7. from Tools.BoundFunction import boundFunction
      8. def myMsg():
      9. myRecords = RecordTimer()
      10. myNext = myRecords.getNextRecordingTime()
      11. if myNext == -1:
      12. myNext = "There is no timer\nStart loop again ?"
      13. else:
      14. d = datetime.fromtimestamp(myNext)
      15. myNext = d.strftime("Next record starts on %d.%m.%y at %H:%M\nStart loop again ?")
      16. AddNotificationWithCallback(
      17. boundFunction(callBackAction),
      18. MessageBox, myNext, timeout = 0
      19. )
      20. def callBackAction(callback_result = False):
      21. if callback_result == True:
      22. print "callback was YES => start timer again"
      23. startTimer()
      24. else:
      25. print "callback was NO => we start no new timer"
      26. def startTimer():
      27. timer_duration = 10000
      28. global MyTimer
      29. MyTimer = eTimer()
      30. MyTimer.start(timer_duration, True)
      31. MyTimer.callback.append(myMsg)
      32. def autostart(reason, **kwargs):
      33. if kwargs.has_key("session") and reason == 0:
      34. myMsg()
      35. def Plugins(**kwargs):
      36. return [PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc=autostart)]
      Alles anzeigen
    • Ach.. hab ich Feedback gegeben ?
      Ich habs mit meinem verkorksten Code mittlerweile auch laufen.. nach timeout wird die msg ausgegeben. Funzt also.

      Ohne Klassen is mir das alles auch schon viel lieber ;) Danke für die Schipsel.

      Ich google mich grad durch die Welt was pingerei angeht... angenommen ich will ne Liste von IPs pingen und sehen nach timput, was in meinem Netz online is.

      Muss zwingend das vielgelobte ping.py importiert werden ?
      Bastelt man sich lieber selber nen Socket, schickt n Paket und horcht was zurück kommt ?
      Da enigma2 ja die Netzwerksettings hat und auch den Test, kann man da was importieren ?

      Mir fehlt wirklich noch die Übersicht, welche Module was wie am besten machen. Hast du eventuell noch ne ausgiebigere Doku als das beim reicholf.net ? Da werden ja im Prinzip nur die ganzen py's unde deren Klassen gelistet.

      Wenn ich weiss, was online ist, wie könnte man rausfinden, ob Shares gemountet sind ? Enigma2 kann das von "allein", was könnte man da missbrauchen ?
      Ich hab kein "nfs-Modul" gefunden, müsste also über /etc/mtab gehn und auslesen.. das wäre jetzt mein Ansatz.
      dream.reichholf.net/pydoc/html…k_1_1HarddiskManager.html
      Damit könnte ich für den letzten Punkt wahrscheinlich was anfangen, auch wenns HDD heisst oder ? Das hat ne getMountedPartitions, die man filtern könnte.

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

    • Ich arbeite mich nun doch langsam n bissi weiter ein. Als Referenz gilt derzeit plnicks letztes Code-Posting.
      Wenn ich jetzt nicht nur diese "nextActivationTime" haben will, sondern auch den Namen oder .. was auch immer.. wie kann ich auf den Timer zugreifen ?

      In der /usr/lib/enigma2/python/RecordTimer.py finde ich hier zumindest etwas in der Art, was ich suche, aber keine Funktion, die mir die Daten eines timers ausgibt.
      Wenn ich aber im Webfrontend schaue (das auf Port 81), dann finde ich die Timer dort ja mit allen möglichen Infos.. nur sehe ich grade nicht, wie sich das Webfrontend die Daten besorgt.

      Python-Quellcode

      1. def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.AUTO, checkOldTimers = False, dirname = None, tags = None): timer.TimerEntry.__init__(self, int(begin), int(end))


      Hier scheine ich aber nur Timer setzen zu können.

      Das Webfrontend /usr/lib/enigma2/python/Plugins/Extensions/WebInterface/WebComponents/Sources/Timer.py sollte hier mehr Erleuchtung bringen, aber so ganz schnall ich das noch nicht, was da abgeht.

      Any hints ?
    • Mhh.. überflogen und festgestellt - nix kapiert :D
      Ist diese py dafür zuständig die Timer im Menü anzuzeigen ? Sprich Menü --> Timer diese liste ?

      Ich weiss nicht ob es dir richtige rangehensweise ist.. aber ich würde jetzt versuchen die
      from Components.TimerList import TimerList
      zu holen und zu parsen.

      Schlechtes Beispiel aber immerhin eins, wenn ich ne mysql db hätte, würde ich auch "select info from timer where start=1234567890" machen und die Daten bekommen.

      Hier müsste ich also n Array der Timerliste holen, nach der "getNextRecordingAction" suchen, die ich eh schon habe, mit den Index zurückliefern lassen und die Daten aus Array[index] ausgeben lassen ?

      Wenn ich z.b. über das Webfrontent auf /web/timerlist zugreife, bekomme ich ne prima Ausgabe.

      Quellcode

      1. <e2timerlist>
      2. <e2timer>
      3. <e2servicereference>1:0:19:7B:E:85:C00000:0:0:0:</e2servicereference>
      4. <e2servicename>TNT Serie HD</e2servicename>
      5. <e2eit>2678</e2eit>
      6. <e2name>King of Queens</e2name>
      7. <e2description>Lori mit den Scherenhänden</e2description><e2descriptionextended>Als Carrie herausfindet, dass Doug sich nur deshalb so häufig die Haare schneiden lässt, weil seine Friseurin sehr attraktiv ist, verbietet sie ihm die Friseurbesuche.
      8. USA 2005. 20 Min.</e2descriptionextended>
      9. <e2disabled>0</e2disabled>


      usw.

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

    • Versuch mal folgendes:

      Quellcode

      1. for timer in session.nav.RecordTimer.timer_list:
      2. if timer.begin == 1234567890:
      3. dein Code


      Das sollte genau deinem MySQL "select info from timer where start=1234567890" entsprechen.

      mit dem "timer" kannst du alles mögliche machen, z.b:
      timer.isRunning()
      timer.name
      timer.service_ref.ref

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