Voor het eerst met Gemini zelf een stukje YAMLgeschreven.
Moet eerlijk toegeven dat het best leuk werkt.
Ik ben zelf een Rocket Stove aan het bouwen i.c.m. een vlambuis wisselaar. Deze verbrand hout wat lijkt op dat van een houtvergasser, er wordt dus niet gesmoord en de verbranding is altijd optimaal.
De temperaturen hiervan lees ik uit via thermokoppels, DS18B20 sensoren en een flowmeter.
Het water dat opgewarmd wordt gebruik ik voor zowel sanitair warm water als voor de lage temperatuur vloerverwarming.
De epshome leest de verschillende waardes van de kachel, de 300L boiler en het 1500L CV buffervat uit.
Aan de hand van de temperatuur van het beschikbare SWW water maak ik een inschatting hoeveel warm water van 40 graden ik nog uit de boiler kan halen, daarnaast kijkt die ook nog hoeveel douchetijd er nog over is voor er weer bijgestookt moet worden.
Met behulp van een automation en helper haalt die elk half uur de forecast temperaturen op van de komende 12 uur hier thuis. Aan de hand daarvan maak ik een warmteverlies schatting van de woning. Hierdoor kan ik zien of er volgende warm water in de 1500L CV buffer zit opgeslagen om de komende 12 uur door te komen, en zo niet hoeveel er te kort is aan energie.
Vervolgens komen hier 2 waardes uit;
- 1 waarde voor het aantal KG hout dat bijgestookt moet worden om de SWW boiler weer volledig te vullen en om de CV buffer zover te verwarmen dat er minimaal de komende 12uur verwarmt kan worden.
- 1 waarde met het maximaal aantal KG hout dat er bijgestookt kan worden om zowel de SWW boiler als de CV buffer volledig te vullen.
Het idee is om dit in de toekomst uit te gaan breiden met een warmtepomp en mijn PV panelen. Hieruit wordt er dan een keuze gemaakt welke energie op dat moment het goedkoopste is om mee te verwarmen.
Zou er eens iemand met verstand van YAML overheen willen kijken en wat er wel of niet goed is?
Ik kan het wel een beetje lezen maar ik vind het nog behoorlijk lastig, ik heb alleen wat ervaring met C++ machine programmering.
/f/image/VwnIiyFs8ghXq6gbAsAdq1Fk.png?f=fotoalbum_large)
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
| template:
- sensor:
#################################################
# SWW GEMIDDELDE TEMPERATUUR
#################################################
- name: "SWW Buffer Gemiddelde Temperatuur"
unique_id: sww_gem_temp
unit_of_measurement: "°C"
state: >
{{ ((states('sensor.kachel_sww_boven') | float(0) + states('sensor.kachel_sww_onder') | float(0) ) / 2) | round(0) }}
#################################################
# SWW TOTALE MAXIMALE ENERGIE
# Invoer 10°C
# Uitvoer 40°C
#################################################
- name: "SWW Buffer Maximale Energie"
unique_id: sww_max_energy
unit_of_measurement: "kWh"
state: >
{{ (300 * 0.001163 * (70 - 10)) | round(1) }}
#################################################
# SWW BESCHIKBARE ENERGIE
#################################################
- name: "SWW Buffer Beschikbare Energie"
unique_id: sww_available_energy
unit_of_measurement: "kWh"
state: >
{% set avg = (states('sensor.kachel_sww_boven') | float(0) + states('sensor.kachel_sww_onder') | float(0)) / 2 %}
{% set usable = avg - 40 %}
{% if usable <= 0 %}
0
{% else %}
{{ (300 * 0.001163 * usable) | round(1) }}
{% endif %}
#################################################
# SWW 40°C DOUCHEWATER
#################################################
- name: "SWW Buffer Douchewater 40°C"
unique_id: sww_shower_water
unit_of_measurement: "L"
state: >
{% set avg = (states('sensor.kachel_sww_boven') | float(0) + states('sensor.kachel_sww_onder') | float(0)) / 2 %}
{% set hot = avg %}
{% set cold = 10 %}
{% set target = 40 %}
{% if hot <= target %}
0
{% else %}
{{ ( 300 * ((hot - cold) / (target - cold))) | round(0) }}
{% endif %}
#################################################
# SWW DOUCHETIJD
# Regendouche 15L/min
#################################################
- name: "SWW Buffer Douchetijd"
unique_id: sww_shower_minutes
unit_of_measurement: "min"
state: >
{{ (states('sensor.sww_buffer_douchewater_40c') | float(0) / 15) | round(0) }}
#################################################
# CV GEWOGEN GEMIDDELDE TEMPERATUUR
#################################################
- name: "CV Buffer Gemiddelde Temperatuur"
unique_id: cv_avg_temp
unit_of_measurement: "°C"
state: >
{{ ((states('sensor.kachel_cv_boven') | float(0) + states('sensor.kachel_cv_midden') | float(0) + states('sensor.kachel_cv_onder') | float(0)) / 3) | round(0) }}
#################################################
# CV MAXIMALE ENERGIE
# 1500L van 30°C -> 90°C
#################################################
- name: "CV Buffer Maximale Energie"
unique_id: cv_max_energy
unit_of_measurement: "kWh"
state: >
{{ (1500 * 0.001163 * (90 - 30)) | round(1) }}
#################################################
# CV BESCHIKBARE ENERGIE
# Bruikbaar boven 30°C
#################################################
- name: "CV Buffer Beschikbare Energie"
unique_id: cv_available_energy
unit_of_measurement: "kWh"
state: >
{% set avg = (states('sensor.kachel_cv_boven') | float(0) + states('sensor.kachel_cv_midden') | float(0) + states('sensor.kachel_cv_onder') | float(0)) / 3 %}
{% set usable = avg - 30 %}
{% if usable <= 0 %}
0
{% else %}
{{ (1500 * 0.001163 * usable) | round(1) }}
{% endif %}
#################################################
# CV WARMTEVRAAG 12U (Op basis van input_text)
#################################################
- name: "CV Warmtevraag 12u"
unique_id: cv_heat_demand_12h
unit_of_measurement: "kWh"
icon: mdi:heating-coil
state: >
{% set temp_string = states('input_text.cv_forecast_12u') %}
{% if temp_string in ['unknown', 'unavailable', ''] %}
0
{% else %}
{% set temp_list = temp_string.replace('[','').replace(']','').split(',') %}
{% set total = namespace(value=0) %}
{% for temp_raw in temp_list[:12] %}
{% set temp = temp_raw | float(0) %}
{% set demand = (-0.2 * temp) + 8 %}
{% set demand = [demand, 0] | max %}
{% set total.value = total.value + demand %}
{% endfor %}
{{ total.value | round(1) }}
{% endif %}
#################################################
# BENODIGD HOUT: MINIMAAL COMFORT (SWW MAX + CV VRAAG 12U)
#################################################
- name: "Benodigd Hout Minimale Vraag"
unique_id: wood_needed_minimal
unit_of_measurement: "kg"
icon: mdi:wood-enclosed-fire
state: >
{% set kwh_per_kg = 4.5 * 0.85 %}
{# SWW herberekening #}
{% set sww_avg = (states('sensor.kachel_sww_boven') | float(0) + states('sensor.kachel_sww_onder') | float(0)) / 2 %}
{% set sww_usable = [ (sww_avg - 40), 0 ] | max %}
{% set sww_now = 300 * 0.001163 * sww_usable %}
{% set sww_max = 300 * 0.001163 * (70 - 10) %}
{% set sww_needed = [ (sww_max - sww_now), 0 ] | max %}
{# CV herberekening #}
{% set cv_avg = (states('sensor.kachel_cv_boven') | float(0) + states('sensor.kachel_cv_midden') | float(0) + states('sensor.kachel_cv_onder') | float(0)) / 3 %}
{% set cv_usable = [ (cv_avg - 30), 0 ] | max %}
{% set cv_now = 1500 * 0.001163 * cv_usable %}
{# 12u warmtevraag #}
{% set cv_demand = states('sensor.cv_warmtevraag_12u') | float(0) %}
{% set cv_needed = [ (cv_demand - cv_now), 0 ] | max %}
{% set total_kwh_needed = sww_needed + cv_needed %}
{{ (total_kwh_needed / kwh_per_kg) | round(1) }}
#################################################
# BENODIGD HOUT: MAXIMAAL LADEN (SWW MAX + CV MAX)
#################################################
- name: "Benodigd Hout Maximale Vulling"
unique_id: wood_needed_maximal
unit_of_measurement: "kg"
icon: mdi:weight-kilogram
state: >
{% set kwh_per_kg = 4.5 * 0.85 %}
{# SWW herberekening #}
{% set sww_avg = (states('sensor.kachel_sww_boven') | float(0) + states('sensor.kachel_sww_onder') | float(0)) / 2 %}
{% set sww_usable = [ (sww_avg - 40), 0 ] | max %}
{% set sww_now = 300 * 0.001163 * sww_usable %}
{% set sww_max = 300 * 0.001163 * (70 - 10) %}
{% set sww_needed = [ (sww_max - sww_now), 0 ] | max %}
{# CV herberekening #}
{% set cv_avg = (states('sensor.kachel_cv_boven') | float(0) + states('sensor.kachel_cv_midden') | float(0) + states('sensor.kachel_cv_onder') | float(0)) / 3 %}
{% set cv_usable = [ (cv_avg - 30), 0 ] | max %}
{% set cv_now = 1500 * 0.001163 * cv_usable %}
{% set cv_max = 1500 * 0.001163 * (90 - 30) %}
{% set cv_needed = [ (cv_max - cv_now), 0 ] | max %}
{% set total_kwh_needed = sww_needed + cv_needed %}
{{ (total_kwh_needed / kwh_per_kg) | round(1) }} |
[
Voor 1% gewijzigd door
Septillion op 19-05-2026 09:36
]
Plannen voorbereiden: Renovatie Boerderij > Hout CV, 300L SWW, 1500L CV buffer, 15.000WP, 3-fase Victron Mulri RS, 48kWh LFP