Ankündigung

Einklappen
Keine Ankündigung bisher.

Python 3.2 Migration in develop bzw. 1.0 Release

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Hallo Ihr beiden,

    ich habe an der Performance-Schraube gedreht. Es müsste jetzt wesentlich schneller als vorher sein.

    Bis bald

    Marcus

    Kommentar


      Hi!

      Die Verzögerungen hatte ich auch gestern bemerkt - schätze mal lib/connection wartetete auf Timeouts?

      //edit: Fix für unten stehendes Problem:

      Code:
      diff --git a/lib/logic.py b/lib/logic.py
      index faafd05..23ee2ac 100755
      --- a/lib/logic.py
      +++ b/lib/logic.py
      @@ -97,7 +97,7 @@ class Logic():
               self.prio = int(self.prio)
               if self.crontab is not None:
                   if isinstance(self.crontab, list):
      -                self.crontab = ','.join(self.crontab)  # rejoin crontab entry to a string
      +                self.crontab = '|'.join(self.crontab)  # rejoin crontab entry to a string
      
           def id(self):
               return self.name

      Habe leider Probleme mit crontab-Einträgen nach der Konvertierung:

      crontab = 45 5 * 0,1,2,3,4 | 0 7 * 5,6
      führt zu

      Code:
      2013-10-09 07:27:05 ERROR    Main         Unhandled exception: too many values to unpack (expected 4)
      <class 'ValueError'>
        File "/usr/local/smarthome/bin/smarthome.py", line 646, in <module>
          sh.start()
        File "/usr/local/smarthome/bin/smarthome.py", line 334, in start
          self._logics = lib.logic.Logics(self, configfile=self._logic_conf)
        File "/usr/local/smarthome/lib/logic.py", line 50, in __init__
          self._sh.scheduler.add(name, logic, logic.prio, logic.crontab, logic.cycle)
        File "/usr/local/smarthome/lib/scheduler.py", line 211, in add
          self._next_time(name, offset)
        File "/usr/local/smarthome/lib/scheduler.py", line 265, in _next_time
          ct = self._crontab(entry)
        File "/usr/local/smarthome/lib/scheduler.py", line 340, in _crontab
          next_event = self._parse_month(crontab, offset=0)  # this month
        File "/usr/local/smarthome/lib/scheduler.py", line 347, in _parse_month
          minute, hour, day, wday = crontab.split(' ')
      zudem (wenn obiges auskommentiert):

      crontab = init | 00 21 * *
      führt zu

      Code:
      2013-10-09 07:31:02 ERROR    Main         Unhandled exception: invalid literal for int() with base 10: 'init'
      <class 'ValueError'>
        File "/usr/local/smarthome/bin/smarthome.py", line 646, in <module>
          sh.start()
        File "/usr/local/smarthome/bin/smarthome.py", line 334, in start
          self._logics = lib.logic.Logics(self, configfile=self._logic_conf)
        File "/usr/local/smarthome/lib/logic.py", line 50, in __init__
          self._sh.scheduler.add(name, logic, logic.prio, logic.crontab, logic.cycle)
        File "/usr/local/smarthome/lib/scheduler.py", line 211, in add
          self._next_time(name, offset)
        File "/usr/local/smarthome/lib/scheduler.py", line 265, in _next_time
          ct = self._crontab(entry)
        File "/usr/local/smarthome/lib/scheduler.py", line 340, in _crontab
          next_event = self._parse_month(crontab, offset=0)  # this month
        File "/usr/local/smarthome/lib/scheduler.py", line 349, in _parse_month
          minute_range = self._range(minute, 00, 59)
        File "/usr/local/smarthome/lib/scheduler.py", line 459, in _range
          item = int(item)
      scheinbar funktioniert das Parsen noch nicht zuverlässig bei kombinierten Einträgen?

      Kommentar


        Hallo Robert,

        Zitat von Robert Beitrag anzeigen
        Habe leider Probleme mit crontab-Einträgen nach der Konvertierung:
        ja, da gab es ein Problem. Ist gefixed. Dein Fix ist ein Teil der Lösung.

        Ich habe geraden noch einmal massiv an der Performance-Schraube gedreht.
        Schneller geht es nicht.

        Bis bald

        Marcus

        Kommentar


          Bitte schön!

          Gut, gleich das ganze gesplitte/gejoine mit der eh vorhandenen Liste zu umgehen ist wohl effizienter.

          Kommentar


            Hallo,

            bei mir kommt jetzt kurz nach dem Start die Meldung:
            Code:
            >>> Exception in thread Main:
            Traceback (most recent call last):
              File "/usr/lib/python3.2/threading.py", line 740, in _bootstrap_inner
                self.run()
              File "/usr/lib/python3.2/threading.py", line 693, in run
                self._target(*self._args, **self._kwargs)
              File "/usr/smarthome/bin/smarthome.py", line 338, in start
                self._logics = lib.logic.Logics(self, configfile=self._logic_conf)
              File "/usr/smarthome/lib/logic.py", line 50, in __init__
                self._sh.scheduler.add(name, logic, logic.prio, logic.crontab, logic.cycle)
              File "/usr/smarthome/lib/scheduler.py", line 223, in add
                self._next_time(name, offset)
              File "/usr/smarthome/lib/scheduler.py", line 279, in _next_time
                if ct < next_time:
            TypeError: can't compare offset-naive and offset-aware datetimes
            Ich habe da schon mal hinterhergetraced und festgestellt, dass bei
            Code:
            tz = 'Europe/Berlin'
            in etc/smarthome.conf von dateutil.tz.gettz (in bin/smarthome.py) ein None geliefert wird.

            Platform ist Raspberry Pi.

            Hat jemand eine Idee?

            Grüße
            Mike

            Kommentar


              Python 3.2 Migration in develop bzw. 1.0 Release

              Lass mal die Anführungszeichen weg. Fix ich heute Abend.

              Kommentar


                Zitat von mknx Beitrag anzeigen
                Lass mal die Anführungszeichen weg. Fix ich heute Abend.
                Ohne Anführungszeichen funktioniert es.

                Danke und Grüße
                Mike

                Kommentar


                  Ansonsten habe ich noch das hier als einfachen Fix für xbmc:

                  Code:
                  diff --git a/plugins/xbmc/__init__.py b/plugins/xbmc/__init__.py
                  index a9fee48..ed7f46c 100755
                  --- a/plugins/xbmc/__init__.py
                  +++ b/plugins/xbmc/__init__.py
                  @@ -62,7 +62,7 @@ class xbmc(lib.connection.Client):
                           else:
                               port = 9090
                           host = item.conf['xbmc_host']
                  -        lib.connetion.Client.__init__(self, host, port, monitor=True)
                  +        lib.connection.Client.__init__(self, host, port, monitor=True)
                           self.terminator = b'}'
                           self._sh = smarthome
                           self._id = 1
                  und dann hier noch kleine Änderungen am xbmc-Plugin:
                  * es wird nicht mehr immer davon ausgegangen, dass alle Features genutzt werden (z.B. Zugriff auf 'media'-Items)
                  * ist der titel nicht gesetzt, wird ein evtl. vorhandenes Label übernommen
                  Code:
                  diff --git a/plugins/xbmc/__init__.py b/plugins/xbmc/__init__.py
                  index eed39bd..1913e94 100755
                  --- a/plugins/xbmc/__init__.py
                  +++ b/plugins/xbmc/__init__.py
                  @@ -142,8 +142,10 @@ class xbmc(lib.connection.Client):
                                   self._items['state']('Pause', 'XBMC')
                               elif event['method'] == 'Player.OnStop':
                                   self._items['state']('Menu', 'XBMC')
                  -                self._items['media']('', 'XBMC')
                  -                self._items['title']('', 'XBMC')
                  +                if 'media' in self.items:
                  +                    self._items['media']('', 'XBMC')
                  +                if 'title' in self.items:
                  +                    self._items['title']('', 'XBMC')
                               if event['method'] in ['Player.OnPlay']:
                                   # use a different thread for event handling
                                   self._sh.trigger('xmbc-event', self._parse_event, 'XBMC', value={'event': event})
                  @@ -162,10 +164,14 @@ class xbmc(lib.connection.Client):
                               if typ == 'video':
                                   result = self._send('Player.GetItem', {"properties": ["title"], "playerid": playerid}, "VideoGetItem")['result']
                                   title = result['item']['title']
                  +                if title == '' and 'label' in result['item']:
                  +                    title = result['item']['label']
                                   typ = result['item']['type']
                  -                self._items['media'](typ.capitalize(), 'XBMC')
                  +                if 'media' in self._items:
                  +                    self._items['media'](typ.capitalize(), 'XBMC')
                               elif typ == 'audio':
                  -                self._items['media'](typ.capitalize(), 'XBMC')
                  +                if 'media' in self._items:
                  +                    self._items['media'](typ.capitalize(), 'XBMC')
                                   result = self._send('Player.GetItem', {"properties": ["title", "artist"], "playerid": playerid}, "AudioGetItem")['result']
                                   artist = result['item']['artist'][0]
                                   title = artist + ' - ' + result['item']['title']
                  @@ -175,4 +181,5 @@ class xbmc(lib.connection.Client):
                               else:
                                   logger.warning("Unknown type: {0}".format(typ))
                                   return
                  -            self._items['title'](title, 'XBMC')
                  +            if 'title' in self._items:
                  +                self._items['title'](title, 'XBMC')
                  Grüße
                  Mike

                  Kommentar


                    Etwas funktioniert nicht mehr bei mir:
                    Plugin aus Logik direkt aufrufen:

                    Wahrscheinlich ist der Aufruf nun anders.

                    logik.py
                    Code:
                    sh.dmx1(3,255)
                    plugin.conf
                    Code:
                    [dmx1]
                        class_name = ArtNet
                        class_path = plugins.artnet
                        artnet_subnet = 0
                        artnet_net = 0
                        artnet_universe = 0
                        ip = '192.168.1.2'
                        port = 6454
                    Log
                    Code:
                    2013-10-09 16:24:27,014 ERROR    Logi_Init    Logic: Logi_Init, File: logi_init.py, Line: 3, Method: <module>, Exception: 'SmartHome' object has no attribute 'dmx1' -- scheduler.py:_task:334
                    Traceback (most recent call last):
                      File "/home/mode/smarthome/lib/scheduler.py", line 327, in _task
                        exec(obj.bytecode)
                      File "logi_init.py", line 3, in <module>
                    AttributeError: 'SmartHome' object has no attribute 'dmx1'

                    Kommentar


                      Hab noch etwas gefunden wobei ich mir nicht sicher bin ob es ein Bug ooder ein Feature ist ;-)
                      Wird einem Attribut eines Items ein String zugwiesen:
                      Code:
                      [test]
                          [[gesamt]]
                              type       = num
                              vz_uuid    = "Kauderwelsch"
                      So enthält .conf['vz_uuid'] den Wert "Kauderwelsch" mit Anführungszeichen. Vor zwei Tagen war noch der Wert ohne Anführungszeichen enthalten.


                      Edit: Scheint der gleiche Fehler wie in Post #125 zu sein

                      Kommentar


                        Hallo Mike,

                        danke für die XBMC Fixes.

                        Zitat von mode Beitrag anzeigen
                        Etwas funktioniert nicht mehr bei mir:
                        Plugin aus Logik direkt aufrufen:

                        Wahrscheinlich ist der Aufruf nun anders.
                        da hat sich nichts geändert. Und es gibt vorher keine Fehlermeldung bzgl. dmx1 im Log?

                        Generell ist ist es nun 'böse' in der Config ' oder " zu verwenden um Strings zu umschließen. Mal sehen ob mir da noch eine gute Lösung dazu einfällt.

                        Bis bald

                        Marcus

                        Kommentar


                          Ok ein dir(sh) hat gezeigt dass das ArtNet Plugin nicht geladen wurde weil in der config '' um eine IP Adresse positioniert war.

                          Diese Neuerung fällt mir jetzt hoffentlich nicht mehr auf die Füsse ;-)

                          Kommentar


                            Zitat von mknx Beitrag anzeigen
                            Generell ist ist es nun 'böse' in der Config ' oder " zu verwenden um Strings zu umschließen. Mal sehen ob mir da noch eine gute Lösung dazu einfällt.
                            Mir ist eine gute Lösung eingefallen. Die ist eingecheckt.

                            Bis bald

                            Marcus

                            Kommentar


                              Hi!

                              Scheinbar gibt es im Mail-Plugin ein Memleak!?

                              Code:
                              2013-10-11 13:09:31 INFO     System       System.Smarthome.Laufzeit = 1h 10m via Logic None
                              2013-10-11 13:09:31 INFO     System       Threads (8): idle: 4, Main: 1, 1w-io: 1, System: 1, Scheduler: 1
                              2013-10-11 13:09:31 INFO     System       Objects (Top 10): tuple: 92, WeakSet: 107, ExtensionFileLoader: 109, str: 151, SourceFileLoader: 156, BaseException:   193, Exception: 239, Item: 457, Condition: 488, object: 1424
                              2013-10-11 13:09:31 WARNING  System       Garbage: [<email.feedparser.FeedParser object at 0x7ff27ce60a10>, <cell at 0x7ff27cee7a60: FeedParser object at 0x7ff  27ce60a10>, {'policy': Compat32(), '_factory_kwds': <function FeedParser.__init__.<locals>.<lambda> at 0x7ff27cf367a0>, '_cur': None, '_last': <http.client.HTT  PMessage object at 0x7ff27ceae090>, '_factory': <class 'http.client.HTTPMessage'>, '_headersonly': False, '_msgstack': [], '_parse': <method-wrapper '__next__'   of generator object at 0x7ff27ced5af0>, '_input': <email.feedparser.BufferedSubFile object at 0x7ff27ce64d90>}, (<cell at 0x7ff27cee7a60: FeedParser object at   0x7ff27ce60a10>,), <function FeedParser.__init__.<locals>.<lambda> at 0x7ff27cf367a0>, <email.feedparser.BufferedSubFile object at 0x7ff27ce64d90>, [], {'_eof  stack': [], '_closed': True, '_lines': [], '_partial': ''}, [], [], <generator object _parsegen at 0x7ff27ced5af0>, <method-wrapper '__next__' of generator obj  ect at 0x7ff27ced5af0>, <http.client.HTTPMessage object at 0x7ff27ceae090>, {'policy': Compat32(), '_charset': None, 'preamble': None, '_default_type': 'text/p  lain', 'epilogue': None, '_headers': [('Server', 'nginx/0.8.55'), ('Date', 'Fri, 11 Oct 2013 11:03:01 GMT'), ('Content-Type', 'text/xml; charset=utf-8'), ('Tra  nsfer-Encoding', 'chunked'), ('Connection', 'keep-alive'), ('Vary', 'Accept-Encoding'), ('Cache-Control', 'private'), ('Alternate-Protocol', '443:quic')], '_un  ixfrom': None, 'defects': [], '_payload': ''}, [('Server', 'nginx/0.8.55'), ('Date', 'Fri, 11 Oct 2013 11:03:01 GMT'), ('Content-Type', 'text/xml; charset=utf-  8'), ('Transfer-Encoding', 'chunked'), ('Connection', 'keep-alive'), ('Vary', 'Accept-Encoding'), ('Cache-Control', 'private'), ('Alternate-Protocol', '443:qui  c')], []]
                              2013-10-11 13:09:31 INFO     System       System.Last = 0.04 via Logic None
                              2013-10-11 13:09:31 INFO     System       System.Laufzeit = 3d 4h 8m via Logic None
                              Die betreffende eMail wurde in der Tat um 13:01/13:03 erfolgreich versendet (über T-Online), hatte einen Umlaut drin (falls es da hängen könnte), der aber auch korrekt angezeigt wurde.

                              Kommentar


                                Hallo Robert,

                                danke, werde ich mir näher ansehen.

                                Bis bald

                                Marcus

                                Kommentar

                                Lädt...
                                X