Code kopieren & zu File Editor
1# Energy Optimization Integration
2# Intelligente Energieverteilung und PV-Überschuss-Management
3
4# Basis-Sensoren für Energiebilanz
5sensor:
6 # Aktueller Energieüberschuss (PV - Verbrauch)
7 - platform: template
8 sensors:
9 energy_surplus:
10 friendly_name: "Energie-Überschuss"
11 unit_of_measurement: "W"
12 value_template: >
13 {% set pv_power = states('sensor.solar_power') | float(0) %}
14 {% set house_power = states('sensor.house_consumption') | float(0) %}
15 {{ (pv_power - house_power) | round(0) }}
16 icon_template: >
17 {% if states('sensor.energy_surplus') | float > 500 %}
18 mdi:solar-power
19 {% elif states('sensor.energy_surplus') | float > 0 %}
20 mdi:flash
21 {% else %}
22 mdi:transmission-tower
23 {% endif %}
24
25 # Dynamischer Strompreis (für Tibber/aWATTar)
26 - platform: template
27 sensors:
28 electricity_price_level:
29 friendly_name: "Strompreis-Level"
30 value_template: >
31 {% set price = states('sensor.electricity_price_current') | float(0.30) %}
32 {% if price < 0.20 %}sehr günstig
33 {% elif price < 0.25 %}günstig
34 {% elif price < 0.35 %}normal
35 {% elif price < 0.45 %}teuer
36 {% else %}sehr teuer
37 {% endif %}
38 icon_template: >
39 {% set price = states('sensor.electricity_price_current') | float(0.30) %}
40 {% if price < 0.20 %}mdi:currency-eur-off
41 {% elif price < 0.25 %}mdi:currency-eur
42 {% elif price < 0.35 %}mdi:currency-eur
43 {% elif price < 0.45 %}mdi:alert-circle
44 {% else %}mdi:alert
45 {% endif %}
46
47 # Batteriespeicher Effizienz
48 - platform: template
49 sensors:
50 battery_efficiency:
51 friendly_name: "Batterie Effizienz"
52 unit_of_measurement: "%"
53 value_template: >
54 {% set charge_power = states('sensor.battery_charge_power') | float(0) %}
55 {% set discharge_power = states('sensor.battery_discharge_power') | float(0) %}
56 {% if charge_power > 0 %}
57 {{ ((discharge_power / charge_power) * 100) | round(1) }}
58 {% else %}
59 95
60 {% endif %}
61
62 # Optimaler Geräte-Zeitplan basierend auf PV-Prognose
63 - platform: template
64 sensors:
65 optimal_washing_time:
66 friendly_name: "Optimale Waschzeit"
67 value_template: >
68 {% set now_hour = now().hour %}
69 {% set pv_forecast = state_attr('sensor.pv_forecast_today', 'hourly') %}
70 {% if pv_forecast %}
71 {% set max_pv_hour = pv_forecast.index(pv_forecast | max) + 6 %}
72 {% if max_pv_hour > 23 %}{{ max_pv_hour - 24 }}:00{% else %}{{ max_pv_hour }}:00{% endif %}
73 {% else %}
74 12:00
75 {% endif %}
76
77 # Energiekosten-Prognose für heute
78 - platform: template
79 sensors:
80 energy_cost_forecast:
81 friendly_name: "Energiekosten Prognose"
82 unit_of_measurement: "€"
83 value_template: >
84 {% set base_consumption = 15 %} # kWh Grundverbrauch
85 {% set pv_generation = states('sensor.pv_forecast_today') | float(0) %}
86 {% set price = states('sensor.electricity_price_current') | float(0.30) %}
87 {% set cost = (base_consumption - pv_generation) * price %}
88 {{ cost | round(2) if cost > 0 else 0 }}
89
90# Geräte-Prioritäten für Überschuss-Management
91input_select:
92 energy_device_priority:
93 name: "Geräte-Priorität bei Überschuss"
94 options:
95 - "Warmwasser > E-Auto > Waschmaschine > Spülmaschine"
96 - "E-Auto > Warmwasser > Waschmaschine > Spülmaschine"
97 - "Waschmaschine > Warmwasser > E-Auto > Spülmaschine"
98 initial: "Warmwasser > E-Auto > Waschmaschine > Spülmaschine"
99
100# Optimierungs-Modi
101input_select:
102 energy_optimization_mode:
103 name: "Energieoptimierung Modus"
104 options:
105 - "Aus"
106 - "Nur PV-Überschuss"
107 - "Günstige Strompreise"
108 - "Vollautomatisch"
109 initial: "Nur PV-Überschuss"
110
111# Schwellenwerte für Optimierung
112input_number:
113 energy_surplus_threshold:
114 name: "PV-Überschuss Schwelle"
115 min: 500
116 max: 3000
117 step: 100
118 initial: 1000
119 unit_of_measurement: "W"
120 icon: "mdi:solar-power"
121
122 energy_cheap_price_threshold:
123 name: "Günstiger Strompreis Schwelle"
124 min: 0.15
125 max: 0.30
126 step: 0.01
127 initial: 0.22
128 unit_of_measurement: "€/kWh"
129 icon: "mdi:currency-eur"
130
131 battery_min_soc:
132 name: "Mindest-Batterieladung"
133 min: 10
134 max: 50
135 step: 5
136 initial: 20
137 unit_of_measurement: "%"
138 icon: "mdi:battery"
139
140# Boolean-Helper für manuelle Steuerung
141input_boolean:
142 energy_optimization_enabled:
143 name: "Energieoptimierung aktiviert"
144 initial: true
145 icon: "mdi:lightning-bolt"
146
147 force_device_start:
148 name: "Geräte-Start erzwingen"
149 initial: false
150 icon: "mdi:play-circle"
151
152 battery_save_mode:
153 name: "Batterie-Sparmodus"
154 initial: false
155 icon: "mdi:battery-heart"
156
157# Binäre Sensoren für Optimierungs-Bedingungen
158binary_sensor:
159 - platform: template
160 sensors:
161 pv_surplus_available:
162 friendly_name: "PV-Überschuss verfügbar"
163 value_template: >
164 {{ states('sensor.energy_surplus') | float >
165 states('input_number.energy_surplus_threshold') | float }}
166 delay_on: "00:02:00"
167 delay_off: "00:05:00"
168
169 electricity_price_cheap:
170 friendly_name: "Günstiger Strompreis"
171 value_template: >
172 {{ states('sensor.electricity_price_current') | float <
173 states('input_number.energy_cheap_price_threshold') | float }}
174
175 battery_needs_charging:
176 friendly_name: "Batterie muss geladen werden"
177 value_template: >
178 {{ states('sensor.battery_soc') | float <
179 states('input_number.battery_min_soc') | float }}
180 delay_on: "00:10:00"
181
182 optimal_time_window:
183 friendly_name: "Optimales Zeitfenster"
184 value_template: >
185 {% set current_hour = now().hour %}
186 {% set optimal_hour = states('sensor.optimal_washing_time').split(':')[0] | int %}
187 {{ (current_hour >= optimal_hour and current_hour <= optimal_hour + 3) }}
188
189 energy_optimization_conditions_met:
190 friendly_name: "Optimierungs-Bedingungen erfüllt"
191 value_template: >
192 {% set mode = states('input_select.energy_optimization_mode') %}
193 {% if mode == 'Aus' %}
194 false
195 {% elif mode == 'Nur PV-Überschuss' %}
196 {{ is_state('binary_sensor.pv_surplus_available', 'on') }}
197 {% elif mode == 'Günstige Strompreise' %}
198 {{ is_state('binary_sensor.electricity_price_cheap', 'on') }}
199 {% elif mode == 'Vollautomatisch' %}
200 {{ is_state('binary_sensor.pv_surplus_available', 'on') or
201 is_state('binary_sensor.electricity_price_cheap', 'on') or
202 is_state('binary_sensor.optimal_time_window', 'on') }}
203 {% endif %}
204
205# Scripts für Geräte-Management
206script:
207 energy_start_water_heater:
208 alias: "Warmwasser starten"
209 sequence:
210 - condition: template
211 value_template: >
212 {{ states('sensor.water_heater_temperature') | float < 55 }}
213 - service: switch.turn_on
214 target:
215 entity_id: switch.water_heater
216 - service: notify.mobile_app
217 data:
218 title: "🔥 Warmwasser"
219 message: "Warmwasserbereitung gestartet (PV-Überschuss)"
220
221 energy_start_car_charging:
222 alias: "E-Auto laden starten"
223 sequence:
224 - condition: template
225 value_template: >
226 {{ states('sensor.car_battery_level') | float < 80 }}
227 - condition: state
228 entity_id: binary_sensor.car_connected
229 state: "on"
230 - service: switch.turn_on
231 target:
232 entity_id: switch.car_charger
233 - service: notify.mobile_app
234 data:
235 title: "⚡ E-Auto"
236 message: "Laden gestartet ({{ states('sensor.energy_surplus') }}W Überschuss)"
237
238 energy_start_washing_machine:
239 alias: "Waschmaschine starten"
240 sequence:
241 - condition: state
242 entity_id: binary_sensor.washing_machine_ready
243 state: "on"
244 - service: switch.turn_on
245 target:
246 entity_id: switch.washing_machine
247 - service: notify.mobile_app
248 data:
249 title: "👕 Waschmaschine"
250 message: "Waschgang gestartet zur optimalen Zeit"
251
252 energy_start_dishwasher:
253 alias: "Spülmaschine starten"
254 sequence:
255 - condition: state
256 entity_id: binary_sensor.dishwasher_ready
257 state: "on"
258 - service: switch.turn_on
259 target:
260 entity_id: switch.dishwasher
261 - service: notify.mobile_app
262 data:
263 title: "🍽️ Spülmaschine"
264 message: "Spülgang gestartet bei günstigem Strom"
265
266 energy_stop_non_essential:
267 alias: "Nicht-essentielle Geräte stoppen"
268 sequence:
269 - service: switch.turn_off
270 target:
271 entity_id:
272 - switch.pool_pump
273 - switch.garden_irrigation
274 - switch.workshop_heater
275 - service: climate.set_temperature
276 target:
277 entity_id: climate.heat_pump
278 data:
279 temperature: 19 # Temperatur reduzieren
280 - service: notify.mobile_app
281 data:
282 title: "⚡ Energiesparmodus"
283 message: "Nicht-essentielle Verbraucher gestoppt"
284
285# Automatisierungen für intelligente Energieverteilung
286automation:
287 - alias: "PV-Überschuss Management"
288 trigger:
289 - platform: state
290 entity_id: binary_sensor.pv_surplus_available
291 to: "on"
292 for: "00:03:00"
293 condition:
294 - condition: state
295 entity_id: input_boolean.energy_optimization_enabled
296 state: "on"
297 action:
298 - choose:
299 # Priorität 1: Warmwasser
300 - conditions:
301 - condition: template
302 value_template: >
303 {{ 'Warmwasser' in states('input_select.energy_device_priority') and
304 states('sensor.water_heater_temperature') | float < 55 }}
305 sequence:
306 - service: script.energy_start_water_heater
307
308 # Priorität 2: E-Auto (falls verfügbar)
309 - conditions:
310 - condition: state
311 entity_id: binary_sensor.car_connected
312 state: "on"
313 - condition: template
314 value_template: >
315 {{ states('sensor.car_battery_level') | float < 80 }}
316 sequence:
317 - service: script.energy_start_car_charging
318
319 # Priorität 3: Waschmaschine
320 - conditions:
321 - condition: state
322 entity_id: binary_sensor.washing_machine_ready
323 state: "on"
324 sequence:
325 - service: script.energy_start_washing_machine
326
327 # Fallback: Batterie laden
328 default:
329 - condition: template
330 value_template: >
331 {{ states('sensor.battery_soc') | float < 95 }}
332 - service: script.energy_charge_battery
333
334 - alias: "Teurer Strom - Verbrauch reduzieren"
335 trigger:
336 - platform: template
337 value_template: >
338 {{ states('sensor.electricity_price_current') | float > 0.40 }}
339 for: "00:05:00"
340 condition:
341 - condition: state
342 entity_id: input_boolean.energy_optimization_enabled
343 state: "on"
344 action:
345 - service: script.energy_stop_non_essential
346 - service: notify.mobile_app
347 data:
348 title: "💸 Teurer Strom"
349 message: "Aktuell {{ states('sensor.electricity_price_current') }}€/kWh - Verbrauch reduziert"
350
351 - alias: "Batterie-Notladung bei günstigen Preisen"
352 trigger:
353 - platform: state
354 entity_id: binary_sensor.electricity_price_cheap
355 to: "on"
356 condition:
357 - condition: state
358 entity_id: binary_sensor.battery_needs_charging
359 state: "on"
360 - condition: time
361 after: "23:00:00"
362 before: "06:00:00"
363 action:
364 - service: switch.turn_on
365 target:
366 entity_id: switch.battery_charger
367 - service: notify.mobile_app
368 data:
369 title: "🔋 Batterie-Notladung"
370 message: "Ladung bei günstigem Nachtstrom ({{ states('sensor.electricity_price_current') }}€/kWh)"
371
372 - alias: "Optimaler Waschzeitpunkt"
373 trigger:
374 - platform: state
375 entity_id: binary_sensor.optimal_time_window
376 to: "on"
377 condition:
378 - condition: state
379 entity_id: binary_sensor.washing_machine_ready
380 state: "on"
381 - condition: template
382 value_template: >
383 {{ 'Vollautomatisch' in states('input_select.energy_optimization_mode') }}
384 action:
385 - service: script.energy_start_washing_machine
386
387 - alias: "Energieoptimierung Tagesreport"
388 trigger:
389 platform: time
390 at: "20:00:00"
391 action:
392 - service: notify.mobile_app
393 data:
394 title: "📊 Energie-Tagesreport"
395 message: >
396 PV-Ertrag: {{ states('sensor.pv_energy_today') }}kWh
397 Verbrauch: {{ states('sensor.energy_consumption_today') }}kWh
398 Kosten: {{ states('sensor.energy_cost_forecast') }}€
399 Optimierungen: {{ states('counter.energy_optimizations_today') }}
400
401# Counter für Optimierungen
402counter:
403 energy_optimizations_today:
404 name: "Optimierungen heute"
405 initial: 0
406 step: 1
407 icon: "mdi:lightning-bolt-circle"
408
409# Utility Meter für Energiestatistiken
410utility_meter:
411 energy_savings_daily:
412 source: sensor.energy_cost_savings
413 cycle: daily
414 name: "Tägliche Energieeinsparung"
415
416 pv_surplus_utilization_daily:
417 source: sensor.pv_surplus_used
418 cycle: daily
419 name: "Tägliche PV-Überschuss-Nutzung"
420
421# Template für Einsparungsberechnung
422sensor:
423 - platform: template
424 sensors:
425 energy_cost_savings:
426 friendly_name: "Energiekosteneinsparung"
427 unit_of_measurement: "€"
428 value_template: >
429 {% set normal_cost = states('sensor.energy_consumption_today') | float * 0.30 %}
430 {% set actual_cost = states('sensor.energy_cost_today') | float %}
431 {{ (normal_cost - actual_cost) | round(2) if normal_cost > actual_cost else 0 }}
432
433 pv_surplus_used:
434 friendly_name: "Genutzter PV-Überschuss"
435 unit_of_measurement: "kWh"
436 value_template: >
437 {% set surplus = states('sensor.energy_surplus') | float %}
438 {% if surplus > 0 %}
439 {{ (surplus * 0.25 / 1000) | round(2) }} # 15min Intervall
440 {% else %}
441 0
442 {% endif %}