Ankündigung

Einklappen

Sammelbestellung ETS6 Vollversionen aktiv!

Sammelbestellung für ETS6 Vollversionen (Prof., Home, Lite) mit 40% Rabatt aktiv! Infos im Forum!
Mehr anzeigen
Weniger anzeigen

Item mit Zeitberechnung bspw für Verbrauchsauswertung als Systemitems bereitstellen

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

  • Msinn
    antwortet
    Du kannst in einer Logik das triggernde Item abfragen und dann abhängig von dem Item unterschiedlich reagieren.

    Das was Du gebaut hast ist für einige Items ok. Es traten nur Probleme auf, weil in einer Installation mehrere hundert Items ein crontab Attribut hatten und damit mehrere hndert Scheduler Tasks aufgesetzt wurden. Damit wurden die internen Queues im Scheduler extrem lang und jedes dieser Items hat zum Update ein Worker-Thread im Scheduler initialisert.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Hallo Onkelandy ,

    Zitat von Onkelandy Beitrag anzeigen
    - Das Item selbst, in dem das struct steckt, muss auch noch irgendwie aktualisiert werden, oder? Momentan gibt es für heute, gestern, etc. zwar ein eval und eval_trigger, aber das "Über-Item" hat kein cycle.
    Bei mir werden die "Überitems" durch die neuen Werte bspw. der Leseköpfe aktualisiert. Immer wenn das "Überitem" einen neuen Wert bekommt, werden die entsprechenden "lebenden" Items (so die, auf die die neuen Werte direkten Einfluss haben wie "heute", "Woche", "Monat") aktualisiert.
    Bespw so:
    Code:
    %YAML 1.1
    ---
    stromzaehler:
        bezug:
            energie:
                name: Wirkarbeit Bezug total
                type: num
                sml_obis: 1-0:1.8.0*255
                sml_prop: valueReal
                eval: round(value / 1000, 2)
                database: init
                struct: wertehistorie_total
    Die Items mit Werten, die nicht immer bei neuen Live-Werten aktualisiert werden müssen (wie gestern, vorgestern, letzte Woche, ...) habe ich den Crontab gesetzt, der wenigstmöglich (neue Woche, neuer Monat, ...) oder eben bei Neustart das Item triggert.

    Zitat von Onkelandy Beitrag anzeigen
    - Noch wichtiger: Die crontabs können zu extrem vielen Schedulern führen, wenn das struct in etlichen Items integriert wird. Es wäre deutlich effizienter, die Items über eine einzelne Logik, die z.B. alle 5 Minuten getriggert wird, zu aktualisieren.
    Wie gesagt, den Crontab nutze ich nur für die Items, die selten aktualisiert werden müssen. Nichtsdestotrotz bin ich offen für den Vorschlag. Man brächte eine Logik, die in Abhängigkeit des letzten Teils des Item-Pfades unterschiedlich triggered. Bspw alle Items deren Pfad auf ".vorwoche" enden, immer Montag früh um 0.05 Uhr.
    Geht das mit Wildcards?

    Michael

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Zwei wichtige Hinweise noch zum struct oben:
    - Das Item selbst, in dem das struct steckt, muss auch noch irgendwie aktualisiert werden, oder? Momentan gibt es für heute, gestern, etc. zwar ein eval und eval_trigger, aber das "Über-Item" hat kein cycle.
    - Noch wichtiger: Die crontabs können zu extrem vielen Schedulern führen, wenn das struct in etlichen Items integriert wird. Es wäre deutlich effizienter, die Items über eine einzelne Logik, die z.B. alle 5 Minuten getriggert wird, zu aktualisieren.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von Onkelandy Beitrag anzeigen
    Ich hab jetzt alles auf develop gezogen und passt.
    Dann passt es ja.

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Das einfache Ersetzen der shtime hat zu diesem Fehler geführt:
    Code:
    File "bin/smarthome.py", line 1322, in <module>
    sh = SmartHome(extern_conf_dir=extern_conf_dir)
    File "bin/smarthome.py", line 358, in __init__
    self.shtime._initialize_holidays()
    File "/usr/local/smarthome/lib/shtime.py", line 986, in _initialize_holidays
    c_logtext = self.translate('not defined')
    File "/usr/local/smarthome/lib/shtime.py", line 118, in translate
    return lib_translate(txt, vars, additional_translations='lib/shtime')
    TypeError: translate() got multiple values for argument 'additional_translations'
    Ich hab jetzt alles auf develop gezogen und passt.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von Onkelandy Beitrag anzeigen
    Irgendeine Idee warum ich diese Fehler bei "woche" und "vorwoche" erhalte? Hab mal periphär mitbekommen, dass in der Wochenzählung einen Bug gab - kann der schuld sein?
    Ja, es gab einen Bug, der ist schon gefixed. Siehe hier

    Dann sollte es gehen.

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Irgendeine Idee warum ich diese Fehler bei "woche" und "vorwoche" erhalte? Hab mal periphär mitbekommen, dass in der Wochenzählung einen Bug gab - kann der schuld sein?
    Code:
    2020-05-26 14:10:37 WARNING plugins.database Database: Unknown time frame '(0, 0)'
    2020-05-26 14:10:37 WARNING plugins.database Database: Unknown time frame '(0, 0)'
    2020-05-26 14:10:38 ERROR lib.shtime time_since: Aufgerufen mit Zeitpunkt in der Zukunft
    2020-05-26 14:10:38 ERROR lib.shtime time_since: Aufgerufen mit Zeitpunkt in der Zukunft

    Einen Kommentar schreiben:


  • z1marco
    antwortet
    Oh sorry Du hast Recht. Ich hab heute Nacht die Items geändert und davon sind natürlich keine von gestern in der Datenbank. Dann werde ich mal ein paar Tage warten. Danke für den Tip mit der Evaluierung in der Admin Oberfläche.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von z1marco Beitrag anzeigen
    Hast Du noch eine Idee?
    Der Fehler kommt immer dann, wenn es in dem Abfragezeitraum keine Daten gibt.
    Bist Du sicher, dass die db für den Zeitraum Werte enthält?

    Du kannst folgendes mal probieren:
    Du gehst im Admin Interface auf "Dienste" und dann "eval Syntax Prüfer". Dort kannst Du unter "Ausdruck (Eingabe im Python eval-Format" Deinen gesamten Ausdruck eingeben oder reinkopieren. Mit "Prüfen" startest Du die gleiche Abfrage, wie sonst beim Triggern des Items.

    Wenn der Fehler immer noch kommt, kannst du sukzessive Deinen eval-Asudruck zurückbauen, um den Fehler einzugrenzen.

    Einen Kommentar schreiben:


  • z1marco
    antwortet
    Hallo Michael,

    die Berechnung für heute klappt wunderbar, leider kommt bei gestern und vielen anderen Berechnungen der Fehler

    unsupported operand type(s) for -: 'float' and 'NoneType'

    Hast Du das genauso bei Dir am laufen oder kann da ein Copy Paste Fehler drinnen sein?

    Folgender Eval Wert für heute funktioniert:
    round((sh.Energie.Haushalt.Verbrauch() - sh.Energie.Haushalt.Verbrauch.db('max', str(shtime.time_since(shtime.today(), 'im')) + 'i', str(shtime.time_since(shtime.today(), 'im')) + 'i')), 2)


    Folgender Eval Wert für gestern kommt o.g. Fehler:
    round((sh.Energie.Haushalt.Verbrauch.db('max', str(shtime.time_since(shtime.today(), 'im')) + 'i', str(shtime.time_since(shtime.today(), 'im')) + 'i') - sh.Energie.Haushalt.Verbrauch.db('max', str(shtime.time_since(shtime.yesterday(), 'im')) + 'i', str(shtime.time_since(shtime.yesterday(), 'im')) + 'i')), 2)

    Ich finde leider den Fehler nicht und denke, dass es eigentlich gehen müsste.

    Hast Du noch eine Idee?

    vielen Dank

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Hallo,

    ich habe mir basierend auf sh.time ein struct für die Verbrauchsauswertung gebaut.
    Verwendet werden kann dieses struct bei allen Items, die fortlaufende Zählerstände enthalten.

    struct.yaml

    Code:
    wertehistorie_total:
        name: Struct für Wertehistorie total
        heute:
            type: num
            visu_acl: ro
            eval: round((sh...() - sh...db('max', str(shtime.time_since(shtime.today(), 'im')) + 'i', str(shtime.time_since(shtime.today(), 'im')) + 'i')), 2)
            eval_trigger:
              - ..
            cache: yes
    
        woche:
            type: num
            visu_acl: ro
            eval: round((sh...() - sh...db('max', str(shtime.time_since(shtime.beginning_of_week(), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(), 'im')) + 'i')), 2)
            eval_trigger:
              - ..
            cache: yes
    
        monat:
            type: num
            visu_acl: ro
            eval: round((sh...() - sh...db('max', str(shtime.time_since(shtime.beginning_of_month(), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(), 'im')) + 'i')), 2)
            eval_trigger:
              - ..
            cache: yes
    
        jahr:
            type: num
            visu_acl: ro
            eval: round((sh...() - sh...db('max', str(shtime.time_since(shtime.beginning_of_year(), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_year(), 'im')) + 'i')), 2)
            eval_trigger:
              - ..
            cache: yes
    
        gestern:
            type: num
            visu_acl: ro
            eval: round((sh...db('max', str(shtime.time_since(shtime.today(), 'im')) + 'i', str(shtime.time_since(shtime.today(), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.yesterday(), 'im')) + 'i', str(shtime.time_since(shtime.yesterday(), 'im')) + 'i')), 2)
            crontab:
             - 1 0 * * = 1
             - init+20 = 1
            database: init
    
        gestern_minus1:
            type: num
            visu_acl: ro
            eval: round((sh...db('max', str(shtime.time_since(shtime.yesterday(), 'im')) + 'i', str(shtime.time_since(shtime.yesterday(), 'im')) + 'i') - sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 1440) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 1440) + 'i')), 2)
            crontab:
             - 1 0 * * = 1
             - init+20 = 1
            cache: yes
        
        gestern_minus2:
            type: num
            visu_acl: ro
            eval: round((sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 1440) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 1440) + 'i') - sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 2880) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 2880) + 'i')), 2)
            crontab:
             - 1 0 * * = 1
             - init+20 = 1
            cache: yes
            
        gestern_minus3:
            type: num
            visu_acl: ro
            eval: round((sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 2880) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 2880) + 'i') - sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 4320) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 4320) + 'i')), 2)
            crontab:
             - 1 0 * * = 1
             - init+20 = 1
            cache: yes
            
        gestern_minus4:
            type: num
            visu_acl: ro
            eval: round((sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 4320) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 4320) + 'i') - sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 5760) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 5760) + 'i')), 2)
            crontab:
             - 1 0 * * = 1
             - init+20 = 1
            cache: yes
    
        gestern_minus5:
            type: num
            visu_acl: ro
            eval: round((sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 5760) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 5760) + 'i') - sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 7200) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 7200) + 'i')), 2)
            crontab:
             - 1 0 * * = 1
             - init+20 = 1
            cache: yes                
            
        vorwoche:
            type: num
            visu_acl: ro
            eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 1), 'im')) + 'i')), 2)
            crontab:
             - 1 0 * * = 1
             - init+20 = 1
            database: init
    
        vorwoche_minus1:
            type: num
            visu_acl: ro
            eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 1), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 2), 'im')) + 'i')), 2)
            crontab:
             - 1 0 * * = 1
             - init+20 = 1
            cache: yes
            
        vorwoche_minus2:
            type: num
            visu_acl: ro
            eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 2), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 3), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 3), 'im')) + 'i')), 2)
            crontab:
             - 1 0 * * = 1
             - init+20 = 1
            cache: yes
            
        vorwoche_minus3:
            type: num
            visu_acl: ro
            eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 3), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 3), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 4), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 4), 'im')) + 'i')), 2)
            crontab:
             - 1 0 * * = 1
             - init+20 = 1
            cache: yes
            
        vormonat:
            type: num
            visu_acl: ro
            eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 1), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_month(shtime.current_month() - 2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(shtime.current_month() - 2), 'im')) + 'i')), 2)
            crontab:
             - 1 0 1 * = 1
             - init+20 = 1
            database: init
            
        vormonat_minus1:
            type: num
            visu_acl: ro
            eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 1), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_month(shtime.current_month() - 2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(shtime.current_month() - 2), 'im')) + 'i')), 2)
            crontab:
             - 1 0 1 * = 1
             - init+20 = 1
            cache: yes    
            
        vormonat_minus2:
            type: num
            visu_acl: ro
            eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week() - 2), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_month(shtime.current_month() - 3), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(shtime.current_month() - 3), 'im')) + 'i')), 2)
            crontab:
             - 1 0 1 * = 1
             - init+20 = 1
            cache: yes  
    
        vormonat_zaehlerstand:
            type: num
            visu_acl: ro
            eval: round(sh...db('max', str(shtime.time_since(shtime.beginning_of_month(), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(), 'im')) + 'i'), 2)
            crontab:
             - 1 0 1 * = 1
             - init+20 = 1
            database: init
            
        vormonat_minus1_zaehlerstand:
            type: num
            visu_acl: ro
            eval: round(sh...db('max', str(shtime.time_since(shtime.beginning_of_month(shtime.current_month() - 1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(shtime.current_month() - 1), 'im')) + 'i'), 2)
            crontab:
             - 1 0 1 * = 1
             - init+20 = 1
            cache: yes
        
        vormonat_minus2_zaehlerstand:
            type: num
            visu_acl: ro
            eval: round(sh...db('max', str(shtime.time_since(shtime.beginning_of_month(shtime.current_month() - 2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(shtime.current_month() - 2), 'im')) + 'i'), 2)
            crontab:
             - 1 0 1 * = 1
             - init+20 = 1
            cache: yes
    item.yaml:
    Code:
    heizung:
        brenner:
            starts_knx:
                name: Brennerstarts via KNX
                struct: wertehistorie_total
    Die Angaben zur Ermittlung der Datenbankabfragezeiträume sind etwas lang, dafür kommt man ohne Logik aus.
    Vielleicht hilft es jemanden.

    Michael

    Einen Kommentar schreiben:


  • z1marco
    antwortet
    Kannst Du mir Deine funktionierenden Items mal zur Verfügung stellen? Die Logik wird dann nicht mehr gebraucht oder?

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Ja, habe ich bzw wird nun keine Logik mehr gebraucht, sondern man kann sh.time direkt in den Items zur db-Abfrage verwenden.

    Einen Kommentar schreiben:


  • z1marco
    antwortet
    Hi Sisamiwe,

    hast Du Deine Logik schon auf shtime umgestellt? Ich nutze Deine Logik schon ziemlich lange und bin damit sehr zufrieden.

    Gruß und Danke

    Einen Kommentar schreiben:


  • psilo
    antwortet
    https://github.com/smarthomeNG/smart...shtime.py#L309

    Einen Kommentar schreiben:

Lädt...
X