Ankündigung

Einklappen
Keine Ankündigung bisher.

Smarthome.py stürzt ab mit "deque mutated during iteration "

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

    Smarthome.py stürzt ab mit "deque mutated during iteration "

    Ich lasse smarthome.py (develop) und Visu auf meiner Synology laufen. Das ist gefühl ca. 1000 mal schneller, ich habe aber das Problem, dass smarthome.py sich regelmäßig (ca. 1-2 mal pro Tag aufhängt). Ich erhalte dann einen Websocket error, erst wenn ich Smarthome.py über die Konsole gestoppt und neu gestartet habe läuft es wieder bis zum nächsten Absturz.
    Bis jetzt habe ich in den Logs nichts verdächtiges finden können, Ephem läuft nicht (kriege ich auf der Synology nicht installiert), ich habe auch probiert Stück für Stück verschiedene Plugins zu deaktivieren - das hat aber keinen Erfolg gebracht.
    Im Log war bis jetzt einfach irgendwann kein Eintrag mehr, ohne dass es eine besondere Fehlermeldung gab. nun habe ich aber folgenden Eintrag genau vor dem Abstürz geloggt:
    PHP-Code:
    2014-12-20 14:16:15 ERROR    strom.rest.kwh1h Method strom.rest.kwh1h exception: deque mutated during iteration
    Traceback 
    (most recent call last):
      
    File "/usr/local/smarthome/lib/scheduler.py", line 346, in _task
        obj
    (**value)
      
    File "/usr/local/smarthome/lib/item.py", line 336, in __run_eval
        self
    .__update(value, caller, source, dest)
      
    File "/usr/local/smarthome/lib/item.py", line 383, in __update
        self
    ._sh.trigger(name=item.id(), obj=item.__run_eval, value=args, by=caller, source=source, dest=dest)
      
    File "/usr/local/smarthome/lib/scheduler.py", line 165, in trigger
        self
    ._runc.notify()
      
    File "/volume1/@appstore/py3k/usr/local/lib/python3.4/threading.py", line 341, in notify
        waiters_to_notify 
    = _deque(_islice(all_waiters, n))
    RuntimeError: deque mutated during iteration 
    dieses steht in zusammenhang mit diesem Item:

    PHP-Code:
            [[[kwh1h]]]
                
    name = rest_kwh_1h
            cache 
    = on
                type 
    = num
                sqlite 
    = yes
            
    eval = sh.strom.rest.Zaehlerstand()- sh.strom.rest.Zaehlerstand.db('min', '1h',)
                
    eval_trigger = strom.rest.Zaehlerstand
            enforce_updates
    =yes
            visu 
    = yes 
    diese eval Funktion nutze ich auch bei anderen Zähleritems.

    die gesamte Restberechnung sieht so aus:

    PHP-Code:
    [[rest]]        
            [[[
    Zaehlerstand]]]
                
    name = rest_Zaehlerstand
                type 
    = num
                cache 
    = on
                sqlite 
    = yes
                
    eval = sh.strom.rest.WmRest() + sh.strom.rest.Zaehlerstand()
                
    eval_trigger = strom.rest.WmRest
                enforce_updates 
    = yes
        
        
            
    [[[WmRest]]]
                
    name = Wattsekunden_Rest
                type 
    = num
                sqlite 
    = yes
                
    eval =  sh.strom.rest.Momentanleistung_freq_temp.prev_value()/1000)/(3600/sh.strom.rest.Momentanleistung_freq_temp.prev_age()
                
    eval_trigger = strom.rest.Momentanleistung_freq_temp
                enforce_updates 
    = yes
                        
            
    [[[Momentanleistung_freq_temp]]]
                
    name = rest_Momentanleistung_freq_temp
                type 
    = num
                sqlite 
    = yes
                
    eval = 0 if int(value) == 0 else  sh.strom.gesamt.Momentanleistung_freq() - sh.strom.herd.Momentanleistung_freq() - sh.strom.kuehlschrank.Momentanleistung_freq() - sh.strom.waschmaschine.Momentanleistung_freq()-sh.strom.knxstrom.Momentanleistung_freq() - sh.strom.Buero.Momentanleistung_freq() - (sh.Wohnzimmer.VerbrauchBeamerAmpere()*230)
                
    eval_trigger = strom.gesamt.Momentanleistung_freq 
                autotimer 
    = 1m = 0 # Reset to zero if no impulse comes within a minute (< 0.6kW)
                
    enforce_updates=yes
            
            
             
    [[[Momentanleistung_freq]]]
                
    name = rest_Momentanleistung_freq
                type 
    = num
                sqlite 
    = yes
                
    eval = 0 if int(value) == 0 else  sh.strom.rest.Momentanleistung_freq_temp.db('avg','1i')
                
    eval_trigger = strom.rest.Momentanleistung_freq_temp 
                autotimer 
    = 1m = 0 # Reset to zero if no impulse comes within a minute (< 0.6kW)
                
    enforce_updates=yes

            
    [[[kwh7d]]]
                   
    name = rest_kwh7d
                   type 
    = num
                cache 
    = on
                sqlite 
    = yes
                
    eval = (sh.strom.rest.Zaehlerstand()- sh.strom.rest.Zaehlerstand.db('min','7d') ) 
                
    eval_trigger = strom.rest.kwh24h
                visu 
    = yes
                
            
    [[[kwh24h]]]
                
    name = rest_kwh_24h
                type 
    = num
                cache 
    = on
                sqlite 
    = yes
                
    eval = sh.strom.rest.Zaehlerstand() - sh.strom.rest.Zaehlerstand.db('min', '1d',)   # returns the kwh used in 24h
                
    eval_trigger= strom.rest.kwh1h
                enforce_updates
    =yes
                visu
    =yes

            
    [[[kwh1h]]]
                
    name = rest_kwh_1h
            cache 
    = on
                type 
    = num
                sqlite 
    = yes
            
    eval = sh.strom.rest.Zaehlerstand()- sh.strom.rest.Zaehlerstand.db('min', '1h',)
                
    eval_trigger = strom.rest.Zaehlerstand
            enforce_updates
    =yes
            visu 
    = yes 

    #2
    Hallo Marco,

    das sieht nach einem Python-Bug aus. Welche Version ist das denn?

    Bis bald

    Marcus

    Kommentar


      #3
      Hi Marcus,

      3.4.1

      gruß

      Kommentar


        #4
        Hallo Marco,

        ich denke ich kann hier nichts so schnell ändern.
        Ich bleibe dabei, das es sich um einen Python-Bug handelt.
        Bisher bist Du der einzige den es anscheinend betrifft.
        Und das war das erste und einzige Mal das der Fehler geloggt wurde?

        Bis bald

        Marcus

        Kommentar


          #5
          ja, ich habe gerade noch mal die letzten Logs durchsucht und den Fehler noch 2-3 mal in den letzten Logs gefunden, immer im Zusammenhang mit einen "Reststrom" item (teilweise auch 24H item).
          Es gibt aber offensichtlich keinen zeitlichen Zusammenhang mit den Abstürzen.
          Ich habe das Python3 Paket von Synology gegen das der Synocommunity (3.4.1-3) getauscht, vielleicht hilft das.
          Kann es sein, dass das System wegen des nicht vorhandenen Ephem abstürzt?
          Ich kann auf der Synology nur eine ältere Version von GCC installieren, damit kann ich aber kein ccache installieren und somit auch kein ephem...

          Kommentar


            #6
            Hallo,

            nein, das ziemlich sicher nichts mit dem fehlenden ephem zu tun.

            Bis bald

            Marcus

            Kommentar


              #7
              Log

              Das Pythonpaket zu ändern hat nicht geholfen. Ich hänge mal mein Log in den Anhang. Seltsamerweise ist es um 10:28 gestorben, es kommen dann aber um 14:16 noch mal logeinträge vom Whatsapp plugin.
              Angehängte Dateien

              Kommentar

              Lädt...
              X