nachdem Onkelandy die Funktionen der shtime erweitert hat und somit auch die relative Zeitpunkt-Ermittlung einfach möglich ist (wird wahrscheinlich im Release 1.8 kommen) hier mal ein Update der evals für die Ermittlung von historischen Verbrauchswerten.
Ich habe ein struct für die Berechnung der historischen Verbrauchswerte und den passenden evals angelegt. Dabei wird auch geprüft, ob zum Abfragezeitpunkt auch Daten in der DB vorhanden sind. Nur dann werden auch die Berechnungen durchgeführt, ansonsten wird der Wert 0 gesetzt.
struct.yaml im Ordern \etc
Code:
wertehistorie_total:
# Aktualisierung erfolgt über Logik, die täglich um Mitternacht getriggert wird.
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) if sh...db('max', str(shtime.time_since(shtime.beginning_of_month(), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(), 'im')) + 'i') is not None else 0
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) if sh...db('max', str(shtime.time_since(shtime.beginning_of_year(), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_year(), 'im')) + 'i') is not None else 0
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.today(-1), 'im')) + 'i', str(shtime.time_since(shtime.today(-1), 'im')) + 'i')), 2) if sh...db('max', str(shtime.time_since(shtime.today(-1), 'im')) + 'i', str(shtime.time_since(shtime.today(-1), 'im')) + 'i') is not None else 0
enforce_updates: yes
gestern_minus1:
type: num
visu_acl: ro
eval: round((sh...db('max', str(shtime.time_since(shtime.today(-1), 'im')) + 'i', str(shtime.time_since(shtime.today(-1), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.today(-2), 'im')) + 'i', str(shtime.time_since(shtime.today(-2), 'im')) + 'i')), 2) if sh...db('max', str(shtime.time_since(shtime.today(-2), 'im')) + 'i', str(shtime.time_since(shtime.today(-2), 'im')) + 'i') is not None else 0
cache: yes
enforce_updates: yes
gestern_minus2:
type: num
visu_acl: ro
eval: round((sh...db('max', str(shtime.time_since(shtime.today(-2), 'im')) + 'i', str(shtime.time_since(shtime.today(-2), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.today(-3), 'im')) + 'i', str(shtime.time_since(shtime.today(-3), 'im')) + 'i')), 2) if sh...db('max', str(shtime.time_since(shtime.today(-3), 'im')) + 'i', str(shtime.time_since(shtime.today(-3), 'im')) + 'i') is not None else 0
cache: yes
enforce_updates: yes
gestern_minus3:
type: num
visu_acl: ro
eval: round((sh...db('max', str(shtime.time_since(shtime.today(-3), 'im')) + 'i', str(shtime.time_since(shtime.today(-3), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.today(-4), 'im')) + 'i', str(shtime.time_since(shtime.today(-4), 'im')) + 'i')), 2) if sh...db('max', str(shtime.time_since(shtime.today(-4), 'im')) + 'i', str(shtime.time_since(shtime.today(-4), 'im')) + 'i') is not None else 0
cache: yes
enforce_updates: yes
gestern_minus4:
type: num
visu_acl: ro
eval: round((sh...db('max', str(shtime.time_since(shtime.today(-4), 'im')) + 'i', str(shtime.time_since(shtime.today(-4), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.today(-5), 'im')) + 'i', str(shtime.time_since(shtime.today(-5), 'im')) + 'i')), 2) if sh...db('max', str(shtime.time_since(shtime.today(-5), 'im')) + 'i', str(shtime.time_since(shtime.today(-5), 'im')) + 'i') is not None else 0
cache: yes
enforce_updates: yes
gestern_minus5:
type: num
visu_acl: ro
eval: round((sh...db('max', str(shtime.time_since(shtime.today(-5), 'im')) + 'i', str(shtime.time_since(shtime.today(-5), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.today(-6), 'im')) + 'i', str(shtime.time_since(shtime.today(-6), 'im')) + 'i')), 2) if sh...db('max', str(shtime.time_since(shtime.today(-6), 'im')) + 'i', str(shtime.time_since(shtime.today(-6), 'im')) + 'i') is not None else 0
cache: yes
enforce_updates: 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(), None, - 1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, - 1), 'im')) + 'i')), 2) if sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, - 1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, - 1), 'im')) + 'i') is not None else 0
database: init
enforce_updates: yes
vorwoche_minus1:
type: num
visu_acl: ro
eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -1), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -2), 'im')) + 'i')), 2) if sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -2), 'im')) + 'i') is not None else 0
cache: yes
enforce_updates: yes
vorwoche_minus2:
type: num
visu_acl: ro
eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -2), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -3), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -3), 'im')) + 'i')), 2) if sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -3), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -3), 'im')) + 'i') is not None else 0
cache: yes
enforce_updates: yes
vorwoche_minus3:
type: num
visu_acl: ro
eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -3), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -3), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -4), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -4), 'im')) + 'i')), 2) if sh...db('max', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -4), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(shtime.calendar_week(), None, -4), 'im')) + 'i') is not None else 0
cache: yes
enforce_updates: yes
vormonat:
type: num
visu_acl: ro
eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, 0), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, 0), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, -1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, -1), 'im')) + 'i')), 2) if sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, -1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, -1), 'im')) + 'i') is not None else 0
database: init
enforce_updates: yes
vormonat_minus1:
type: num
visu_acl: ro
eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, -1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, -1), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, -2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, -2), 'im')) + 'i')), 2) if sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, -2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, -2), 'im')) + 'i') is not None else 0
cache: yes
enforce_updates: yes
vormonat_minus2:
type: num
visu_acl: ro
eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, -2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, -2), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, -3), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, -3), 'im')) + 'i')), 2) if sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, -3), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, -3), 'im')) + 'i') is not None else 0
cache: yes
enforce_updates: yes
vormonat_zaehlerstand:
type: num
visu_acl: ro
eval: round(sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, 0), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, 0), 'im')) + 'i'), 2) if sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, 0), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, 0), 'im')) + 'i') is not None else 0
database: init
enforce_updates: yes
vormonat_minus1_zaehlerstand:
type: num
visu_acl: ro
eval: round(sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, -1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, -1), 'im')) + 'i'), 2) if sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, -1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, -1), 'im')) + 'i') is not None else 0
cache: yes
enforce_updates: yes
vormonat_minus2_zaehlerstand:
type: num
visu_acl: ro
eval: round(sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, -2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, -2), 'im')) + 'i'), 2) if sh...db('max', str(shtime.time_since(shtime.beginning_of_month(None, None, -2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(None, None, -2), 'im')) + 'i') is not None else 0
cache: yes
enforce_updates: yes
item.yaml:
Code:
heizung:
brenner:
name: Brennerstatus Heizung
type: bool
betriebsstunden_knx:
name: Betriebsstundenzähler Brenner in Stunden
type: num
database: init
struct: wertehistorie_total
Eine manuelle Berechnung kann durch das "manuelle" Auslösen der Logik erreicht werden.
berechnung_wertehistorie.py
Code:
#!/usr/bin/env python3
# berechnung_wertehistorie.py
# Die Logik stößt die Neuberechnung der Wertehistorie gemäß struct an.
# Alle Item werden nach gestern, vorwoche und vormonat durchsucht und entsprechende Aktionen ausgeführt
logger.info("Logik 'Berechnung Wertehistorie' durch: {} und {}".format(trigger['by'], trigger['source'] ))
from lib.item import Items
items = Items.get_instance()
if not hasattr(logic, 'all_historical_items_gestern'):
logic.all_historical_items_gestern = items.match_items('*gestern*')
logger.info("Logik 'Berechnung Wertehistorie' hat folgende Items für GESTERN gefunden: {}".format(logic.all_historical_items_gestern))
if not hasattr(logic, 'all_historical_items_vorwoche'):
logic.all_historical_items_vorwoche = items.match_items('*vorwoche*')
logger.info("Logik 'Berechnung Wertehistorie' hat folgende Items für VORWOCHE gefunden: {}".format(logic.all_historical_items_vorwoche))
if not hasattr(logic, 'all_historical_items_vormonat'):
logic.all_historical_items_vormonat = items.match_items('*vormonat*')
logger.info("Logik 'Berechnung Wertehistorie' hat folgende Items für VORMONAT gefunden: {}".format(logic.all_historical_items_vormonat))
if trigger['by'] == 'Scheduler':
if sh.now().hour == 0 and sh.now().minute == 0:
logger.info("Logik 'Berechnung Wertehistorie' hat Aktualisierung der Item GESTERN durchgeführt")
for item in logic.all_historical_items_gestern:
item(1)
else:
logger.debug("Logik 'Berechnung Wertehistorie' hat Aktualisierung der Item GESTERN nicht durchgeführt")
if sh.now().hour == 0 and sh.now().minute == 0 and shtime.weekday(shtime.today()) == 1:
logger.info("Logik 'Berechnung Wertehistorie' hat Aktualisierung der Item VORWOCHE durchgeführt")
for item in logic.all_historical_items_vorwoche:
item(1)
else:
logger.debug("Logik 'Berechnung Wertehistorie' hat Aktualisierung der Item VORWOCHE nicht durchgeführt")
if sh.now().hour == 0 and sh.now().minute == 0 and sh.now().day == 1:
logger.info("Logik 'Berechnung Wertehistorie' hat Aktualisierung der Item VORMONAT durchgeführt")
for item in logic.all_historical_items_vormonat:
item(1)
else:
logger.debug("Logik 'Berechnung Wertehistorie' hat Aktualisierung der Item VORMONAT nicht durchgeführt")
elif trigger['by'] == 'Admin':
logger.info("Logik 'Berechnung Wertehistorie' manuell ausgelöst und Aktualisierung aller Items durchgeführt")
for item in logic.all_historical_items_gestern:
item(1)
for item in logic.all_historical_items_vorwoche:
item(1)
for item in logic.all_historical_items_vormonat:
item(1)
Beste Grüße




Einen Kommentar schreiben: