86 lines
5.5 KiB
Python
Executable File
86 lines
5.5 KiB
Python
Executable File
import hassapi as hass
|
|
import datetime
|
|
import statistics
|
|
|
|
class AveragePowerUsageAdvanced(hass.Hass):
|
|
def initialize(self):
|
|
self.listen_state(self.calculate_average, "sensor.daily_total_consumed_energy") #Angepasst
|
|
self.listen_state(self.calculate_average, "input_number.anzahl_wochen")
|
|
self.run_daily(self.calculate_average, datetime.time(0, 0, 0))
|
|
self.calculate_average(None, None, None, None, None)
|
|
|
|
def calculate_average(self, entity, attribute, old, new, kwargs):
|
|
try:
|
|
anzahl_wochen = int(self.get_state("input_number.anzahl_wochen"))
|
|
except (ValueError, TypeError):
|
|
anzahl_wochen = 5
|
|
self.log("Variable input_number.anzahl_wochen nicht gefunden oder ungültig. Verwende Standardwert 5 Wochen.")
|
|
|
|
heute = datetime.date.today()
|
|
wochentage = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]
|
|
modi = wochentage + ["Wochentag (Mo-Fr)", "Wochenende (Sa-So)", "Letzte Ferien daheim Wochentags", "Nicht Daheim"]
|
|
attributes = {}
|
|
|
|
for modus in modi:
|
|
attributes[modus] = {}
|
|
for wochentag_num in range(7):
|
|
wochentag_name = wochentage[wochentag_num]
|
|
attributes[modus][wochentag_name] = {}
|
|
for stunde in range(24):
|
|
attributes[modus][wochentag_name][f"{stunde:02d}-{stunde+1:02d}"] = {"durchschnitt": None, "letzte_woche": None} #Angepasst
|
|
data_durchschnitt = []
|
|
data_letzte_woche = []
|
|
|
|
for woche in range(anzahl_wochen):
|
|
current_date = heute - datetime.timedelta(weeks=woche)
|
|
start_time = current_date.replace(hour=stunde, minute=0, second=0, microsecond=0)
|
|
end_time = current_date.replace(hour=stunde + 1, minute=0, second=0, microsecond=0)
|
|
bedingung_erfuellt = False
|
|
|
|
# Modus-spezifische Filterung (bleibt gleich)
|
|
if modus == "Letzte Ferien daheim Wochentags":
|
|
letzte_ferien = self.get_state('calendar.ferien', attribute='start_time')
|
|
if letzte_ferien:
|
|
letzte_ferien_date = datetime.datetime.fromisoformat(letzte_ferien[:-1])
|
|
else:
|
|
letzte_ferien_date = datetime.datetime.now()
|
|
if start_time.date() >= letzte_ferien_date.date() and 0 < current_date.weekday() < 6:
|
|
bedingung_erfuellt = True
|
|
elif modus == "Nicht Daheim":
|
|
bedingung_erfuellt = True
|
|
elif modus == "Wochentag (Mo-Fr)" and 0 < current_date.weekday() < 6:
|
|
bedingung_erfuellt = True
|
|
elif modus == "Wochenende (Sa-So)" and current_date.weekday() in (5, 6):
|
|
bedingung_erfuellt = True
|
|
elif wochentage[current_date.weekday()] == modus:
|
|
bedingung_erfuellt = True
|
|
|
|
if bedingung_erfuellt and current_date.weekday() == wochentag_num:
|
|
history = self.get_history(entity_id="sensor.daily_total_consumed_energy", start_time=start_time, end_time=end_time) #Angepasst
|
|
if history and history[0] and history[0][0] and 'state' in history[0][0]:
|
|
try:
|
|
verbrauch = float(history[0][0]['state'])
|
|
#Differenz zum Vortag berechnen (für stündlichen Verbrauch)
|
|
start_time_vortag = start_time - datetime.timedelta(days=1)
|
|
end_time_vortag = end_time - datetime.timedelta(days=1)
|
|
history_vortag = self.get_history(entity_id="sensor.daily_total_consumed_energy", start_time=start_time_vortag, end_time=end_time_vortag)
|
|
if history_vortag and history_vortag[0] and history_vortag[0][0] and 'state' in history_vortag[0][0]:
|
|
verbrauch_vortag = float(history_vortag[0][0]['state'])
|
|
stuendlicher_verbrauch = verbrauch - verbrauch_vortag
|
|
if woche == 0:
|
|
data_letzte_woche.append(stuendlicher_verbrauch)
|
|
data_durchschnitt.append(stuendlicher_verbrauch)
|
|
else:
|
|
self.log(f"Keine Daten für den Vortag gefunden für {start_time}")
|
|
except ValueError:
|
|
self.log(f"Ungültiger Wert in der Historie: {history[0][0]['state']}")
|
|
else:
|
|
self.log(f"Keine Daten gefunden für {start_time}")
|
|
|
|
if data_durchschnitt:
|
|
attributes[modus][wochentag_name][f"{stunde:02d}-{stunde+1:02d}"]["durchschnitt"] = round(statistics.mean(data_durchschnitt), 2)
|
|
if data_letzte_woche:
|
|
attributes[modus][wochentag_name][f"{stunde:02d}-{stunde+1:02d}"]["letzte_woche"] = round(statistics.mean(data_letzte_woche), 2)
|
|
|
|
self.set_state("sensor.durchschnittlicher_stromverbrauch_advanced", state="Berechnet", attributes=attributes)
|