Ankündigung

Einklappen
Keine Ankündigung bisher.

smarthome.py "überlastet"

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

    smarthome.py "überlastet"

    Ich habe das Problem, dass mein System regelmäßig nach ca. 6-12 Stunden abstürzt. Dieses Verhalten tritt nicht auf, wenn ich meine Logiken zur Stromberechnung deaktiviere, hier ein Beispiel:
    PHP-Code:
    sh.strom.gesamt.kwh7d(sh.strom.gesamt.Zaehlerstand()- sh.strom.gesamt.Zaehlerstand.db('min','7d'))
    sh.strom.gesamt.kwh24h(sh.strom.gesamt.Zaehlerstand()- sh.strom.gesamt.Zaehlerstand.db('min','1d'))
    sh.strom.gesamt.kwh1h(sh.strom.gesamt.Zaehlerstand()- sh.strom.gesamt.Zaehlerstand.db('min','1h')) 
    Im (debug) Log kann ich nichts besonderes erkennen, außer, dass er anscheinend recht viel zu rechnen hat (ca. 30 Meldungen pro Sekunde). Vor dem Absturzzeitpunkt gibt es keine besonderen, wiederkehrenden Ereignisse. Was mir auffällt ist, dass die Anzahl der Threads immer weiter ansteigt, ist das normal (er zeigt mir gegen Ende immer ca. 45 Threads an, nach dem Start nur ca. 10).
    Ich habe neun Logiken und sie werden durch den Zählerstand getriggert - ist das schlicht und ergreifend zu viel Rechenarbeit?
    Das Log im Anhang ist nur ca. die letzte Stunde (Datei wird sonst zu groß).

    hier meine Config:

    PHP-Code:
    # plugin.conf

    [knx]
       
    class_name = KNX
       class_path 
    = plugins.knx
       host 
    = 192.168.10.23
       port 
    = 6720
    #   send_time = 600 # update date/time every 600 seconds, default none
    #   time_ga = 1/1/1 # default none
    #   date_ga = 1/1/2 # default none

    [uzsu]

        
    class_name = UZSU
        class_path 
    = plugins.uzsu

    [ow]
       
    class_name = OneWire
       class_path 
    = plugins.onewire
      host 
    = 192.168.10.23
      port 
    = 4304

    [cli]
        
    class_name = CLI
        class_path 
    = plugins.cli
        ip 
    = 0.0.0.0
        update 
    = True

    [visu]
        
    class_name = WebSocket
        class_path 
    = plugins.visu
        ip
    ='192.168.10.33'
        
    port=2424
        acl 
    = rw
        smartvisu_dir 
    = /volume1/web/smartVISU

    [sql]
        
    class_name = SQL
        class_path 
    = plugins.sqlite

    [rrd]
        
    class_name = RRD
        class_path 
    = plugins.rrd
        step 
    = 300

    [squeezebox]
        
    class_name = Squeezebox
        class_path 
    = plugins.squeezebox
        host 
    = 192.168.10.33
        port 
    = 9090


    [nma]
        
    class_name = NMA
        class_path 
    = plugins.nma
        apikey 
    = c83eb6592f6a3c8440704f5ba9f16ed3b1801e5d00ec702a

    [whatsapp]
        
    class_name = Whatsapp
        class_path 
    = plugins.whatsapp
        account 
    = 'NUMMER'
        
    password = 'XXX' 

    meine logic.conf:

    PHP-Code:
    # logic.conf

    [hello]
        
    filename = hello.py
        crontab 
    = init

    #[dummy]
     
    #   filename = dummy_series.py
      #    cycle = 300
        
        
    [uvr]
         
    filename = uvr.py
        cycle 
    = 120

    [fenster]
           
    filename = fenster.py
        cycle 
    = 180

    [fenster_melanie]
           
    filename = fenster_melanie.py
        cycle 
    = 180

    [verschluss]
        
    filename = verschluss.py
        watch_item 
    = Flur.TuerSchloss

    [verschluss_melanie]
        
    filename = verschluss.py
        watch_item 
    = Flur.TuerSchloss

    [zeit]
        
    filename = zeit.py
        crontab 
    = init | * * * *

    [
    strom_gesamt]
        
    filename = strom_gesamt.py
        watch_item 
    = strom.gesamt.Zaehlerstand

    [strom_herd]
        
    filename = strom_herd.py
        watch_item 
    = strom.herd.Zaehlerstand

    [strom_WP]
        
    filename = strom_WP.py
        watch_item 
    = strom.WP.Zaehlerstand

    [strom_Buero]
        
    filename = strom_Buero.py
        watch_item 
    = strom.Buero.Zaehlerstand

    [strom_Heizungspumen]
        
    filename = strom_Heizungspumpen.py
        watch_item 
    = strom.Heizungspumpen.Zaehlerstand

    [strom_knxstrom]
        
    filename = strom_knxstrom.py
        watch_item 
    = strom.knxstrom.Zaehlerstand

    [strom_kuehlschrank]
        
    filename = strom_kuehlschrank.py
        watch_item 
    = strom.kuehlschrank.Zaehlerstand

    [strom_waschmaschine]
        
    filename = strom_waschmaschine.py
        watch_item 
    = strom.waschmaschine.Zaehlerstand

    [strom_rest]
        
    filename = strom_rest.py
        watch_item 
    = strom.rest.Zaehlerstand 
    Angehängte Dateien

    #2
    Naja, eine Datenbankabfrage ist immer eine Menge an Arbeit. Und wenn Du das bei jedem neuen Stromwert machst...

    Allerdings würde ich erstmal an Deiner Stelle die ganzen Fehler (ERROR = 2504 in der kurzen Zeit) und WARNING wegkriegen wollen bevor ich weiter suche:
    z.B.
    --------------------------------------
    2014-12-27 14:18:52,654 WARNING strom.herd.tagesverbrauch Item strom.herd.tagesverbrauch: problem evaluating sh.strom.herd.Zaehlerstand() -sh.strom.herd.Zaehlerstand.db('max', sh.minute.since.midnight.dbstr(), sh.minute.since.midnight.dbstr()): unsupported operand type(s) for -: 'float' and 'NoneType' -- item.py:__run_eval:331
    2014-12-27 14:18:52,720 WARNING strom.herd.wochenverbrauch Item strom.herd.wochenverbrauch: problem evaluating sh.strom.herd.Zaehlerstand() -sh.strom.herd.Zaehlerstand.db('max', sh.day.since.week.dbstr(), sh.day.since.week.dbstr()): unsupported operand type(s) for -: 'float' and 'NoneType' -- item.py:__run_eval:331
    2014-12-27 14:18:52,785 WARNING strom.herd.monatsverbrauch Item strom.herd.monatsverbrauch: problem evaluating sh.strom.herd.Zaehlerstand() -sh.strom.herd.Zaehlerstand.db('max', sh.day.since.month.dbstr(), sh.day.since.month.dbstr()): unsupported operand type(s) for -: 'float' and 'NoneType' -- item.py:__run_eval:331
    -------------------------------------------
    2014-12-27 14:18:51,769 ERROR strom_herd Logic: strom_herd, File: /usr/local/smarthome/logics/strom_herd.py, Line: 2, Method: <module>, Exception: unsupported operand type(s) for -: 'float' and 'NoneType' -- scheduler.py:_task:334
    Traceback (most recent call last):
    File "/usr/local/smarthome/lib/scheduler.py", line 327, in _task
    exec(obj.bytecode)
    File "/usr/local/smarthome/logics/strom_herd.py", line 2, in <module>
    sh.strom.herd.kwh24h(sh.strom.herd.Zaehlerstand()- sh.strom.herd.Zaehlerstand.db('min','1d'))
    TypeError: unsupported operand type(s) for -: 'float' and 'NoneType'

    --------------------------------------
    2014-12-27 14:24:58,301 ERROR env_stat Logic: env_stat, File: /usr/local/smarthome/lib/env/stat.py, Line: 33, Method: <module>, Exception: 'Orb' object has no attribute 'light' -- scheduler.py:_task:334
    Traceback (most recent call last):
    File "/usr/local/smarthome/lib/scheduler.py", line 327, in _task
    exec(obj.bytecode)
    File "/usr/local/smarthome/lib/env/stat.py", line 33, in <module>
    sh.env.location.moonlight(sh.moon.light())
    AttributeError: 'Orb' object has no attribute 'light'
    --------------------------------------


    Schlußendlich solltest Du Dir überlegen ob Dich die sekündliche Strommeldung Deiner Wärmepumpe weiterbringt oder ob Du dem Aktor nicht einfach sagst das er sich bitte erst ab einer Mindeständerung meldet.

    Gruß,
    Bernd

    PS: Läuft das ganze auf Pi oder in einer VM? Evtl. ist das Log auch nach 6 Stunden zu gross geworden für das Filesystem...

    Kommentar


      #3
      Hallo,

      danke für Deine Rückmeldung, die Datenbankabfragen habe ich jetzt reduziert indem ich die Logiken nur noch all 5 Minuten aufrufe, statt über den Zählerstand:
      PHP-Code:
      [strom_gesamt]
          
      filename = strom_gesamt.py
          cycle 
      = 300 
      Es läuft jetzt seit ca. einer Stunde mit lediglich neun Threads und im Log sind nur noch die Fehlermeldungen bezüglich Ephem.
      Ich beobachte es jetzt mal und schaue dann, ob ich ggf. auch den Zählerstand nicht mit jeder WattStunde neu berechne.
      Die Fehlermeldung rühren glaube ich daher, dass die Datenbank keinen Wert zurückgibt (das bedeutet NoneType), das würde dafür sprechen, dass SQLITE etwas überfordert ist.
      Das läuft auf einer Synology (deshalb auch die Fehlermeldungen bezüglich Ephem, das habe ich nämlich nicht ans Laufen gebracht).
      Das Log wird nur im Debug-mode so groß.

      Kommentar


        #4
        Hallo,


        was meinst Du mit System abstürzt? Wirklich das OS oder nur SH.py?

        Das mit den Errors/Warnings bezüglich None ist ein Bug im SQlite Plugin. Dafür kannst Du oder die DB nichts. Das fixe ich noch.

        Das eigentliche Problem bei Dir war das sehr viele Logiken/Evals häufig und gleichzeitig auf die DB zugreifen wollten. Die DB unterstütz allerdings nur einen Zugriff zur gleichen Zeit. So haben sich viele Thread angestaut, die dazu führten das immer mehr Threads allokiert wurden. Am Ende sah es dann so aus:

        Code:
        2014-12-27 14:14:32,328 INFO     Scheduler    Threads: idle: 18, strom_WP: 7, strom.WP.wochenverbrauch: 3, strom.herd.monatsverbrauch: 1, strom.gesamt.tagesverbrauch: 2, strom_Heizungspumen: 2, strom.WP.monatsverbrauch: 3, Main: 1, strom.WP.tagesverbrauch: 4, strom_gesamt: 2, strom.herd.wochenverbrauch: 1, strom.gesamt.wochenverbrauch: 2, strom.gesamt.monatsverbrauch: 3, strom_herd: 3, strom_kuehlschrank: 1, Thread-78: 1, strom.herd.tagesverbrauch: 1, Scheduler: 1, Thread-63: 1 -- scheduler.py:_add_worker:305
        Davon abgesehen:

        Code:
        [verschluss]
            filename = verschluss.py
            watch_item = Flur.TuerSchloss
        
        [verschluss_melanie]
            filename = verschluss.py
            watch_item = Flur.TuerSchloss
        scheint doppelt vorhanden.

        Bis bald

        Marcus

        Kommentar


          #5
          Hi Marcus,

          danke für Deine Hilfe. Das OS stürzt nicht ab, nur Smarthome.py ist nicht mehr erreichbar (läuft aber noch). Den NoneType Fehler war bei mir seit Umstieg auf Develop eigentlich weg (und taucht jetzt auch nicht mehr auf).
          Ich denke es ist genauso wie von Dir beschrieben, jetzt habe ich es in den Logiken die alle fünf Minuten laufen und seitdem bleibt die Zahl der threads bei 9-15.
          Danke für den Hinweis mit dem doppelten Logikaufruf.

          Kommentar

          Lädt...
          X