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