Ich bin jetzt meinem Ziel ein ganzes Stück näher gekommen und wollte nur mal mein Ergebnis hier teilen, für den Fall das es doch jemand interessiert:
Basis-Sensor für den Stromverbrauch (kWh)
In meinem Netz habe ich einen “Shelly Pro 3EM” der mir 3-phasig den Stromverbrauch und auch die Rückspeisung misst und über den Sensor “Total Active Energy” ausgibt. Für die weiteren Aktionen ist es wichtig zu wissen das dieser Sensor die Class “total_increasing” hat. Bei Custom Integrationen wie die von Shelly hat man keine YAML Datei mit den Sensordefinitionen, aber es gibt einen Trick dies über die Developer Tools nachzuprüfen:
Dieser Zähler erhöht sich seit Installation des Shelly kontinuierlich bei den aus dem Stromnetz (“Grid”) bezogenen kWh.
Der Shelly hat ja zwei Zählerstände, einen für die konsumierte Energie aus dem Stromnetz (Total active energy” und eine für die ins Netz zurückgespeiste “Total active returned energy”.
Für meine Berechnungen ist ja relevant was ich effektiv verbraucht habe, also habe ich mir einen Template-Sensor “Stromverbrauch (Total)” mit folgendem Jinja2-Code gebaut, der als Grundlage für all meine Berechnungen dienen soll:
{{ states('sensor.powermeter_hausanschluss_total_active_energy')|float(0) - states('sensor.powermeter_hausanschluss_total_active_returned_energy')|float(0) }}
Das braucht man natürlich nicht, wenn man keine Rückspeisung durch PV hat, klar, dann nimmt man den “nativen” Zähler von Shelly.
Stromzähler für Tag, Monat, Jahr
Basierend darauf habe ich dann drei weitere Hilfs-Zähler in “Settings → Devices → Helpers” über “+ Create helper” erzeugt:

In “Meter reset cycle” kann man das automatische Rückstellintervall eingeben. In diesem Sensor ist es täglich (“Daily”), dort gibt es aber auch andere Intervalle. Der Bezugssensor woraus sich dieser Sensor speist ist der o.g. “Stromverbrauch Total”:
Anschließend wird der Sensor von HA automatisch mit Werteänderung vom Bezugssensor mit aktualisiert und man erhält einen schönen Graphen der sich, gut erkennbar jeden Tag um 00:00 Uhr zurücksetzt:
Auf diese Weise habe ich folgende Sub-Zähler erstellt:
- “Stromverbrauch (heute)”
- “Stromverbrauch (diesen Monat)”
- “Stromverbrauch (dieses Jahr)”
Vertragsdaten für Stromkostenberechnung erfassen
Auf dieser Basis kann ich nun die Kosten berechnen. Dazu erzeuge ich erstmal zwei “input_number” Helper für:
- “Strompreis (Arbeitspreis)”
- “Strompreis (Grundpreis)”

Den Wert kann man dann in dem jeweils erzeugten Helper direkt erfassen:
Gleiches für den Grundpreis pro Monat:
Verbrauchskosten pro Tag/Monat/Kalenderjahr berechnen
Zur Ausgabe der Kosten erzeuge ich mir dann einen Sensor Template Helper “Stromkosten (heute)”:

Folgenden Jinja2 Template Code habe ich dafür erstellt:
{% set tage_im_monat = ((now().replace(day=28) + timedelta(days=4)).replace(day=1) - timedelta(days=1) ).day %}
{{ (states('input_number.strompreis_grundpreis_monat') | float(0) / tage_im_monat) + ( states('sensor.stromzaehler_tag') | float(0) * states('input_number.strompreis_arbeitspreis') | float(0) ) }}
Die Idee dahinter:
- Der aktuelle Zählerstandswert “sensor.stromzaehler_tag” multipliziert mit dem erfassten Wert “strompreis_arbeitspreis” ergibt die Verbrauchskosten
- Der erfasste Wert “strompreis_grundpreis_monat” geteilt durch “tage_im_monat” ergibt die Anteiligen Grundkosten pro Tag
- Beides zusammen ergibt die tatsächlichen Verbrauchskosten zum Zeitpunkt der Betrachtung
Raus kommt dann so ein Wert
Das gleiche mache ich mit den Kosten im aktuellen Monat, hier verwende ich nur einen anderen Code, bei dem ich den erfassten Grundpreis + dem Arbeitspreis * Monatszählerstand berechne:
{{ states('input_number.strompreis_grundpreis_monat') | float(0) + ( states('sensor.stromzaehler_monat') | float(0) * states('input_number.strompreis_arbeitspreis') | float(0) ) }}
So weit, so gut und hoffentlich auch stimmig.
Verbrauchskosten seit Vertragsbeginn berechnen
Mich interessiert ja besonders wie ich den Stromverbrauch seit Vertragsbeginn berechnen kann. Darüber möchte ich dann erkennen wie weit ich von meiner ursprünglichen Prognose und Meldung beim Stromlieferant weg bin. Daraus ergibt sich dann ja eine mögliche Nachzahlung oder Rückzahlung was einem dann ja eine Anpassung der Abschlagshöhe ermöglicht um das zu kompensieren.
Diese Daten basieren ja nicht auf den Tags/Monats-Verbrauchswerten, die dienen eher meiner eigenen Orientierung, sondern den Verbrauchswerten seit Vertragsbeginn/Wechsel. Also habe ich mir erstmal einen Datums Helper “Stromvertrag (Beginn)” erzeugt in dem ich diesen erfassen kann:

Als nächstes brauche ich den Stromverbrauch seit Vertragsbeginn. Leider können Template-Sensoren keine historischen Daten aus einem anderen Sensor aufsummieren, das wäre am einfachste gewesen. Daher muss ich einen Hilfszähler erzeugen:
Beim Versorgerwechsel gibt man ja auch immer den Zählerstand an, von daher ist es ein leichtes da ran zu kommen. Mein ganz persönliches Problem hierbei liegt eher am Versäumnis den Shelly-Verbrauchszähler damals (jemals) mit meinem offiziellen Zählerstand abzugleichen.
Daher habe ich mir eine Hilfsautomation gebaut um den Shelly-Zählerstand aus den historischen Daten zum Zeitpunkt des Vertragsbeginns zu ermitteln und dort einzutragen:
alias: Stromverbrauch Total auf Wert seit Vertragsbeginn einstellen
description: >-
Setzt den Zählerstand der Entity 'Stromzähler (Total)' auf den Wert seit
'Stromvertrag (Beginn)'
triggers:
- at: input_datetime.stromvertrag_beginn
trigger: time
actions:
- target:
entity_id: input_number.stromverbrauch_seit_vertragsbeginn
data:
value: "{{ states('sensor.stromverbrauch_total') | float(0) }}"
action: input_number.set_value
mode: single
Die brauche ich also nur dann laufen lassen wenn ich einen Anbieterwechsel hatte und das Datum eingetragen hab:
Damit kann ich nun den gewünschten Stromkosten-Sensor erstellen:
{% set start = states('input_datetime.stromvertrag_beginn') %}
{% set start_date = strptime(start, '%Y-%m-%d') %}
{% set now = now() %}
{% set months = (now.year - start_date.year) * 12 + (now.month - start_date.month) %}
{% if now.day > start_date.day %}
{% set months = months + 1 %}
{% endif %}
{{ (states('input_number.strompreis_grundpreis_monat')|float(0) * months) + ( states('sensor.stromzaehler_seit_vertragsbeginn')|float(0) * states('input_number.strompreis_arbeitspreis')|float(0) ) }}
Der Code errechnet die Anzahl der Monate (months) zwischen dem Vertragsstartdatum und heute, dabei berücksichtigt er auch einen Jahreswechsel bzw. mehrjährige Verträge. Dabei zähle ich auch einen gerade angebrochenen Monat.