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.
X
-
Hallo Onkelandy ,
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.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.
Bespw so:
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.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
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.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.
Geht das mit Wildcards?
Michael
Einen Kommentar schreiben:
-
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:
-
Dann passt es ja.Zitat von Onkelandy Beitrag anzeigenIch hab jetzt alles auf develop gezogen und passt.
Einen Kommentar schreiben:
-
Das einfache Ersetzen der shtime hat zu diesem Fehler geführt:
Ich hab jetzt alles auf develop gezogen und passt.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'
Einen Kommentar schreiben:
-
Ja, es gab einen Bug, der ist schon gefixed. Siehe hierZitat von Onkelandy Beitrag anzeigenIrgendeine 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?
Dann sollte es gehen.
Einen Kommentar schreiben:
-
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:
-
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:
-
Der Fehler kommt immer dann, wenn es in dem Abfragezeitraum keine Daten gibt.Zitat von z1marco Beitrag anzeigenHast Du noch eine Idee?
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:
-
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:
-
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
item.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
Die Angaben zur Ermittlung der Datenbankabfragezeiträume sind etwas lang, dafür kommt man ohne Logik aus.Code:heizung: brenner: starts_knx: name: Brennerstarts via KNX struct: wertehistorie_total
Vielleicht hilft es jemanden.
Michael
- Likes 1
Einen Kommentar schreiben:
-
Kannst Du mir Deine funktionierenden Items mal zur Verfügung stellen? Die Logik wird dann nicht mehr gebraucht oder?
Einen Kommentar schreiben:
-
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:
-
-


Einen Kommentar schreiben: