Hallo zuaammen
Ich wohne seit gut zwei Jahren in einer Eigentumswohnung. Die Beheizung erfolgt über Fernwärme mit separater Heizkostenabrechnung. Die Wärmeabgabe erfolgt über eine Fußbodenheizung. Die Abrechnung erfolgt über einen Wärmemengenzähler der Firma Neovac. Ich habe zunächst versucht, den digitalen Zähler mittels ESP-Cam auszulesen und in einen Sensor im Homeassistant zu übertragen. Die Qualität und Zuverlässigkeit war nicht zufriedenstellend, so dass ich das Projekt abbrechen musste. Das Problem war, dass das Display des Wärmemengenzählers beim Fotografieren mit Licht zu stark reflektierte, so dass die Zahlen nicht gut lesbar waren. Das Licht abzudunkeln war auch keine Lösung.
Also habe ich mir überlegt, welche anderen Möglichkeiten es gibt, den Wärmeverbrauch zu ermitteln. Wenn ich den Zähler nicht ablesen kann, muss ich den Wert berechnen.
Die Berechnung der momentanen Wärmeleistung erfolgt in der Regel nach der Formel
P = Q * ρ * c * ΔT
Dabei sind:
P
: Wärmeleistung in Watt (W)Q
: Volumenstrom in m³/sρ
: Dichte des Wassers in kg/m³c
: Spezifische Wärmekapazität in J/(kg-K)ΔT
: Temperaturdifferenz in Kelvin (bzw. °C, da die Differenz gleich ist)
Der Volumenstrom (Q
) kann am Heizkreisverteiler abgelesen werden. Hier ist zu beachten, dass man sich an den Wert herantasten muss, da eine exakte Ablesung an meinem Heizungsverteiler nur grob möglich ist.
Die Dichte des Wassers (ρ
) beträgt ca. 1000 kg/m³
und die spezifische Wärmekapazität (c
) 4186 J/(kg-K)
.
Um die Temperaturdifferenz (ΔT
) zu bestimmen, musste ich noch zwei Temperaturfühler besorgen und am Vor- und Rücklauf montieren. Dafür habe ich mir einen Shelly Plus 1PM WiFi Switch
, ein AddOn Plus für Shelly Plus
und zwei DS18B20
gekauft. Da ich keine Lust und Zeit hatte, mich in die ESP-Welt einzuarbeiten, war meine zweite Wahl ein einfaches, günstiges und zuverlässiges System. Das war alles, was ich an Hardware brauchte.
In Home Assistant erstellte ich jeweils einen Zahlenwert-Helfer für Q
, ρ
und c
, sowie für jeden Heizkreis einen Zahlenwert-Helfer für Q
mit jeweils den abgelesenen bzw. oben aufgeführten Werten.
Nun geht es an P
. Hier habe ich für jeden Heizkreis einen Templatesensor erstellt.
template:
- sensor:
- name: "Heizung Verbrauch Leistung Wohnen W"
unit_of_measurement: "W"
device_class: power
unique_id: "heizung_verbrauch_leistung_wohnen_w"
state: >
{% if state_attr('climate.heizung_wohnen', 'hvac_action') == 'heating' %}
{% set flow = states('input_number.heizung_verbrauch_volumenstrom_wohnen_q') | float %}
{% set Q = (flow * 0.001) / 60 %}
{% set c = states('input_number.heizung_verbrauch_warmekapazitat_c') | float %}
{% set rho = states('input_number.heizung_verbrauch_dichte_p') | float %}
{% set t_vl = states('sensor.vl_heizverteilung_temperature') | float %}
{% set t_rl = states('sensor.rl_heitzverteilung_temperature') | float %}
{% set delta_t = t_vl - t_rl %}
{{ (Q * rho * c * delta_t) | round(2) }}
{% else %}
0
{% endif %}
Hier wird geprüft, ob das Attribut hvac_action der Entität climate.x den Wert Heating hat:
{% if state_attr('climate.heizung_wohnen', 'hvac_action') == 'heating' %}
Q wird von L/min in m3/s umgerechnet. Dies ist wichtig, da der Volumenstrom in den Heizkreisverteilern bei mir in L/min angegeben wird. Wenn bei dir in m3/s, kannst du auf die Umrechnung verzichten.
{% set flow = states('input_number.heizung_verbrauch_volumenstrom_wohnen_q') | float %} {% set Q = (flow * 0.001) / 60 %}
Die restlichen Zeilen sollten selbsterklärend sein. Die Sensoren für VL und RL befinden sich vor und nach den Heizkreisen. Ergo fasse ich jetzt alle Sensoren für P zusammen.
template:
- sensor:
- name: "Heizung Verbrauch Leistung Gesamt W"
unit_of_measurement: "W"
device_class: power
unique_id: "heizung_verbrauch_leistung_gesamt"
state: >
{{ (
states('sensor.heizung_verbrauch_leistung_wohnen_w') | float +
states('sensor.heizung_verbrauch_leistung_kinderzimmer_w') | float +
states('sensor.heizung_verbrauch_leistung_buro_w') | float +
states('sensor.heizung_verbrauch_leistung_schlafen_w') | float +
states('sensor.heizung_verbrauch_leistung_bad_1_w') | float +
states('sensor.heizung_verbrauch_leistung_bad_2_w') | float
) | round(2) }}
Ich verwende nun einen Integrationssensor, um den Energieverbrauch (kWh) aus der momentanen Leistung (W) über die Zeit zu bestimmen:
sensor:
- platform: integration
unique_id: heizung_verbrauch_energie_gesamt
source: sensor.heizung_verbrauch_leistung_gesamt_w
name: "Heizung Verbrauch Energie Gesamt"
unit_prefix: k
round: 2
Durch die Option unit_prefix: k
wird das Ergebnis in kWh (anstatt Wh) dargestellt. Wird 0 W übermittelt, akkumuliert auch der Energieverbrauch nicht weiter.
Diese Methode hat einen Nachteil. Es handelt sich um theoretische Werte. Eine exakte Ausgabe wie beim Wärmezähler wird nur schwer zu erreichen sein. Das liegt zum einen an der Ungenauigkeit von ΔT
- die direkte Temperaturmessung im Wasserkreislauf wäre genauer. Zum anderen am Volumenstrom Q
. Hier werde ich mich sukzessive annähern müssen, so dass ich zwar keine exakte, aber eine relative Genauigkeit erhalte. In ein paar Wochen weiß ich sicher mehr, ob mein Projekt etwas taugt oder eben nicht.