[solved] altes OE2.0 Plugin portieren

    • [solved] altes OE2.0 Plugin portieren

      Hallo an die Python kundigen, vor Jahren haben ein Arbeitskollege und ich waehrend eines Kurses ein kleines Plugin fuer eine DM8000 gebaut. Das Plugin liest auf Knopfdruck Werte aus einer auf dem lokalen Apache liegenden .html aus (Fuellstande eines Unterboden-Wassertanks). Die Werte werden per Skript stuendlich von der API auf die Webseite gelegt. Von dort hat die Dreambox mit dem Plugin die Werte auf dem TV angezeigt.

      Ich verwende nun eine DM900 mit aktuellem NN² und habe das Plugin manuell in die entsprechende Directory geschoben, bei Aufruf crashed das Plugin. Was ich bereits gemacht habe sind alle Timer Callbacks entsprechend anzupassen. Kann mir evtl. anhand des Crashlogs jemand einen Schubs in die richtige Richtung geben, was ich noch aendern muss, um das Plugin unter OE2.5 lauffaehig zu machen?


      Quellcode

      1. Screen <class 'Plugins.Extensions.Werte-Ermitteln.plugin.getvaluesMain'>((), {}): <type 'exceptions.AssertionError'>
      2. Traceback (most recent call last):
      3. File "/usr/lib/enigma2/python/mytest.py", line 350, in create
      4. return screen(self, *arguments, **kwargs)
      5. File "/usr/lib/enigma2/python/Plugins/Extensions/get-values/plugin.py", line 150, in __init__
      6. self.makeValueTimer_conn = self.makeValueTimer.timeout.connect(self.downloadValue(self.link, self.checkValue))
      7. File "/usr/lib/enigma2/python/enigma.py", line 7626, in connect
      8. slot = ePythonSlot0X(WeakMethodReference(func))
      9. File "/usr/lib/enigma2/python/enigma.py", line 7493, in __init__
      10. raise AssertionError("ERROR!!! try to create not callable WeakMethodReference", function)
      11. AssertionError: ('ERROR!!! try to create not callable WeakMethodReference', None)
      12. swig director exception (SWIG director method error.)
      13. 0xb4028068(sp=0xbebdb670) <__cxa_throw+168>
      14. 0x3993dc(sp=0xbebdb688) <SwigDirector_eActionSlot::action_func2(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)+848>
      15. 0xcefac(sp=0xbebdb6d0) <eActionMap::unbindKeyDomain(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)+1164>
      16. 0xcd75c(sp=0xbebdb720) <eActionMap::keyPressed(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, int)+1480>
      17. 0xc5600(sp=0xbebdb7a8) <keyEvent(eRCKey const&)+276>
      18. 0x2807f8(sp=0xbebdb7d8) <eRCInput::keyPressed(eRCKey const&)+252>
      19. 0x2821f0(sp=0xbebdb800) <eRCDeviceInputDev::handleCode(long)+160>
      20. 0x27f644(sp=0xbebdb820) <eRCInputEventDriver::keyPressed(int)+120>
      21. 0xd4288(sp=0xbebdb848) <eSocketNotifier::activate(int)+272>
      22. 0xd5d70(sp=0xbebdb888) <eMainloop_native::processOneEvent(int)+2664>
      23. 0x2b2660(sp=0xbebdba38) <eMainloopQt::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)+156>
      24. 0xb517122c(sp=0xbebdbb60) <QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>)+276>
      25. 0xb517a498(sp=0xbebdbba8) <QCoreApplication::exec()+148>
      26. 0x2b25a0(sp=0xbebdbbd8) <eMainloopQt::runLoop()+24>
      27. 0x2b8dc0(sp=0xbebdbbe0) <our_terminate()+4228>
      28. 0xb4aa350c(sp=0xbebdbbf8) <PyEval_EvalFrameEx+24024>
      29. Traceback (most recent call last):
      30. File "/usr/lib/enigma2/python/enigma.py", line 7533, in __call__
      31. return ret(*args, **kwargs)
      32. File "/usr/lib/enigma2/python/Components/ActionMap.py", line 51, in action
      33. res = self.actions[action]()
      34. File "/usr/lib/enigma2/python/Screens/PluginBrowser.py", line 48, in save
      35. self.run()
      36. File "/usr/lib/enigma2/python/Screens/PluginBrowser.py", line 52, in run
      37. plugin(session=self.session)
      38. File "/usr/lib/enigma2/python/Plugins/Extensions/get-values/plugin.py", line 840, in main
      39. session.open(getvaluesMain)
      40. File "/usr/lib/enigma2/python/mytest.py", line 459, in open
      41. dlg.isTmp = True
      42. AttributeError: 'NoneType' object has no attribute 'isTmp'
      Alles anzeigen
    • So einen Fehler hab ich noch gar nie gesehen. Warum musst du die zwei Parameter übergeben? Die Variablen stehen dir ja auch so zur Verfügung. Oder mit Hilfe von boundFunction.

      Aber wenn es sowieso eine API gibt, dann kannst du diese doch sicherlich auch gleich direkt aufrufen. Wird ja dann wohl ein json zurückgegeben
      Gruss
      Dre

      Boxen: 1 x DM8000-SSCC, 1 x DM7020HD-T, 1 x DM7080HD-S
      Developer Project Merlin
    • danke Dre, habe seither nichts mehr in Python gemacht und erinnere nicht warum wir das damals so gemacht haben, habe mich nie mehr darum gekuemmert (war im Rahmen eines Python Kurses mit eher ueberschaubarem Tiefgang), weil es ja funktioniert hat bzw. auf der 8000´er immer noch funktioniert.

      Ob die API ein json zurueckgibt weiss ich nicht, die Loesung mit der .html auf dem Apache war schon vor dem Plugin da. Ich wollte da nun nicht wirklich viel Zeit investieren, um etwas Neues zu stricken, dafuer fehlen mir auch schlicht die tiefgreifenden Python Kenntnisse, wollte das Plugin eben gerne so wie es ist auf der DM900 zum Laufen bringen, ohne auf NN² verzichten zu muessen. Ist halt doof wenn wg. dem Fuellstand jedesmal der PC hochgefahren werden muss.
    • So ganz ohne Sourcen ist es halt nicht ganz so einfach, aber ich würde mal folgendes versuchen:

      Alt:

      Quellcode

      1. self.makeValueTimer_conn = self.makeValueTimer.timeout.connect(self.downloadValue(self.link, self.checkValue))

      Neu:

      Quellcode

      1. self.makeValueTimer_conn = self.makeValueTimer.timeout.connect(boundFunction(self.downloadValue(self.link, self.checkValue)))

      Natürlich den Import nicht vergessen (from Tools.BoundFunction import boundFunction).

      Der direkte Aufruf einer API sollte eigentlich nicht so kompliziert sein. Heute rufst du ja die HTML-Seite auch schon auf (vermutlich mit urllib). Das gleiche kannst du mit der API machen, wobei eine Umstellung auf twisted sowieso besser wäre, falls nicht bereits verwendet.
      Gruss
      Dre

      Boxen: 1 x DM8000-SSCC, 1 x DM7020HD-T, 1 x DM7080HD-S
      Developer Project Merlin
    • wow - danke! es crasht immer noch, aber ich kann zumindest vorher den Screen des Plugins kurz sehen. Das Crashlog sieht auch ganz anders aus, das Plugin selbst taucht nicht mehr auf, liegt das jetzt am Skin?

      Quellcode

      1. action -> InfobarExtensions extensions
      2. libpng warning: iCCP: known incorrect sRGB profile
      3. libpng warning: iCCP: known incorrect sRGB profile
      4. libpng warning: iCCP: known incorrect sRGB profile
      5. libpng warning: iCCP: known incorrect sRGB profile
      6. libpng warning: iCCP: known incorrect sRGB profile
      7. libpng warning: iCCP: known incorrect sRGB profile
      8. libpng warning: iCCP: known incorrect sRGB profile
      9. libpng warning: iCCP: known incorrect sRGB profile
      10. libpng warning: iCCP: known incorrect sRGB profile
      11. libpng warning: iCCP: known incorrect sRGB profile
      12. libpng warning: iCCP: known incorrect sRGB profile
      13. libpng warning: iCCP: known incorrect sRGB profile
      14. libpng warning: iCCP: known incorrect sRGB profile
      15. I/ [TemplatedListFonts.__init__] :: Bigger: 32, Regular
      16. I/ [TemplatedListFonts.__init__] :: Big: 30, Regular
      17. I/ [TemplatedListFonts.__init__] :: Medium: 28, Regular
      18. I/ [TemplatedListFonts.__init__] :: Small: 26, Regular
      19. I/ [TemplatedListFonts.__init__] :: Smaller: 24, Regular
      20. warning, skin is missing element text in <class 'Screens.ChoiceBox.ChoiceBox'>
      21. create buffer for widget 660 x 1080
      22. nr_read 342 nr_write 21
      23. sum 363 prev_sum 363
      24. hdd IDLE!
      25. [IDLE] 708.000246048 120 True
      26. action -> WizardActions right
      27. unknown action WizardActions/right! typo in keymap?
      28. action -> InputActions right
      29. unknown action InputActions/right! typo in keymap?
      30. action -> DirectionActions right
      31. unknown action DirectionActions/right! typo in keymap?
      32. action -> DirectionActions rightUp
      33. unknown action DirectionActions/rightUp! typo in keymap?
      34. action -> WizardActions up
      35. action -> DirectionActions upUp
      36. unknown action DirectionActions/upUp! typo in keymap?
      37. action -> WizardActions ok
      38. Looking for embedded skin
      39. Looking for embedded skin
      40. libpng warning: iCCP: known incorrect sRGB profile
      41. libpng warning: iCCP: known incorrect sRGB profile
      42. libpng warning: iCCP: known incorrect sRGB profile
      43. Looking for embedded skin
      44. libpng warning: iCCP: known incorrect sRGB profile
      45. create buffer for widget 800 x 530
      46. swig director exception (SWIG director method error.)
      47. 0xb4036068(sp=0xbeda8980) <__cxa_throw+168>
      48. 0x394e58(sp=0xbeda8998) <SwigDirector_eSlot0X::cb_func()+284>
      49. 0xd4adc(sp=0xbeda89a8) <eTimer::activate()+388>
      50. 0xd553c(sp=0xbeda89d8) <eMainloop_native::processOneEvent(int)+564>
      51. 0x2b2660(sp=0xbeda8a38) <eMainloopQt::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)+156>
      52. 0xb517f22c(sp=0xbeda8b60) <QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>)+276>
      53. 0xb5188498(sp=0xbeda8ba8) <QCoreApplication::exec()+148>
      54. 0x2b25a0(sp=0xbeda8bd8) <eMainloopQt::runLoop()+24>
      55. 0x2b8dc0(sp=0xbeda8be0) <our_terminate()+4228>
      56. 0xb4ab150c(sp=0xbeda8bf8) <PyEval_EvalFrameEx+24024>
      57. Traceback (most recent call last):
      58. File "/usr/lib/enigma2/python/enigma.py", line 7533, in __call__
      59. return ret(*args, **kwargs)
      60. File "/usr/lib/enigma2/python/Tools/BoundFunction.py", line 10, in __call__
      61. return self.fnc(*self.args + args, **newkwargs)
      62. TypeError: 'NoneType' object is not callable
      63. -------
      Alles anzeigen
    • ah, mein Fehler.

      Quellcode

      1. self.makeValueTimer_conn = self.makeValueTimer.timeout.connect(boundFunction(self.downloadValue, self.link, self.checkValue))
      Gruss
      Dre

      Boxen: 1 x DM8000-SSCC, 1 x DM7020HD-T, 1 x DM7080HD-S
      Developer Project Merlin
    • Letztenendes ist es eigentlich nichts kompliziertes. Wenn du Parameter übergeben musst, dann braucht es in einem Fall wie obigem die Hilfe von boundFunction.
      Gruss
      Dre

      Boxen: 1 x DM8000-SSCC, 1 x DM7020HD-T, 1 x DM7080HD-S
      Developer Project Merlin