Ich arbeite mit Studio Code Server. Die Blueprints habe ich hier abgelegt: /blueprints/automation/anker.
Minimaleinspeisung:
blueprint:
name: "Anker E1600 Minimal-Einspeisung + Smartmeter (Shelly 3EM) mit 2 Zeitfenstern v4"
description: >
Regelung der Einspeisung mit zwei konfigurierbaren Zeitfenstern (mitternachtsicher)
<br>(Start/Ende, Zielwert, Min/Max-Leistung, einstellbare Schrittweite und Hysterese
domain: automation
input:
shelly_power_sensor:
name: Shelly Leistung (W)
selector:
entity:
filter:
domain: sensor
device_class: power
anker_number_entity:
name: Anker Einspeisevorgabe
selector:
entity:
filter:
domain: number
# Fenster 1
zielwert_input_1:
name: Zielwert Netzbezug Fenster 1
selector:
entity:
filter:
domain: input_number
min_power_input_1:
name: Minimalleistung Fenster 1
selector:
entity:
filter:
domain: input_number
max_power_input_1:
name: Maximalleistung Fenster 1
selector:
entity:
filter:
domain: input_number
start_time_input_1:
name: Startzeit Fenster 1
selector:
entity:
filter:
domain: input_datetime
end_time_input_1:
name: Endzeit Fenster 1
selector:
entity:
filter:
domain: input_datetime
# Fenster 2
zielwert_input_2:
name: Zielwert Netzbezug Fenster 2
selector:
entity:
filter:
domain: input_number
min_power_input_2:
name: Minimalleistung Fenster 2
selector:
entity:
filter:
domain: input_number
max_power_input_2:
name: Maximalleistung Fenster 2
selector:
entity:
filter:
domain: input_number
start_time_input_2:
name: Startzeit Fenster 2
selector:
entity:
filter:
domain: input_datetime
end_time_input_2:
name: Endzeit Fenster 2
selector:
entity:
filter:
domain: input_datetime
step_size:
name: Schrittweite (W)
default: 50
selector:
number:
min: 10
max: 200
step: 10
hysteresis:
name: Hysterese (W)
default: 20
selector:
number:
min: 5
max: 100
step: 5
mode: single
triggers:
- trigger: time_pattern
minutes: "/1"
action:
- variables:
shelly_entity: !input shelly_power_sensor
anker_entity: !input anker_number_entity
step: !input step_size
hysteresis: !input hysteresis
zielwert_entity_1: !input zielwert_input_1
min_power_entity_1: !input min_power_input_1
max_power_entity_1: !input max_power_input_1
start_time_entity_1: !input start_time_input_1
end_time_entity_1: !input end_time_input_1
zielwert_entity_2: !input zielwert_input_2
min_power_entity_2: !input min_power_input_2
max_power_entity_2: !input max_power_input_2
start_time_entity_2: !input start_time_input_2
end_time_entity_2: !input end_time_input_2
grid_power: "{{ states(shelly_entity) | float(0) }}"
current_set: "{{ states(anker_entity) | float(0) }}"
nowm: "{{ now().hour * 60 + now().minute }}"
target_1: "{{ states(zielwert_entity_1) | float(30) }}"
sb_min_1: "{{ states(min_power_entity_1) | float(100) }}"
sb_max_1: "{{ states(max_power_entity_1) | float(800) }}"
start_1: "{{ states(start_time_entity_1) | default('00:00') }}"
end_1: "{{ states(end_time_entity_1) | default('00:00') }}"
target_2: "{{ states(zielwert_entity_2) | float(30) }}"
sb_min_2: "{{ states(min_power_entity_2) | float(100) }}"
sb_max_2: "{{ states(max_power_entity_2) | float(800) }}"
start_2: "{{ states(start_time_entity_2) | default('00:00') }}"
end_2: "{{ states(end_time_entity_2) | default('00:00') }}"
# Funktion, um zu prüfen, ob aktueller Zeitpunkt in einem Fenster liegt
in_window_1: >
{% set s = start_1.split(':') %}
{% set e = end_1.split(':') %}
{% set start = (s[0]|int) * 60 + (s[1]|int) %}
{% set end = (e[0]|int) * 60 + (e[1]|int) %}
{% if start <= end %} {{ start <= nowm <= end }} {% else %} {{ nowm >= start or nowm <= end }} {% endif %}
in_window_2: >
{% set s = start_2.split(':') %}
{% set e = end_2.split(':') %}
{% set start = (s[0]|int) * 60 + (s[1]|int) %}
{% set end = (e[0]|int) * 60 + (e[1]|int) %}
{% if start <= end %} {{ start <= nowm <= end }} {% else %} {{ nowm >= start or nowm <= end }} {% endif %}
- choose:
# Fenster 1 aktiv
- conditions:
- condition: template
value_template: "{{ in_window_1 }}"
sequence:
- variables:
delta: "{{ (target_1 - grid_power) | round(0) }}"
- choose:
- conditions: "{{ delta < -hysteresis }}"
sequence:
- action: number.set_value
target:
entity_id: "{{ anker_entity }}"
data:
value: "{{ [sb_min_1, [sb_max_1, current_set + step] | min] | max }}"
- conditions: "{{ delta > hysteresis }}"
sequence:
- action: number.set_value
target:
entity_id: "{{ anker_entity }}"
data:
value: "{{ [sb_min_1, current_set - step] | max }}"
# Fenster 2 aktiv
- conditions:
- condition: template
value_template: "{{ in_window_2 }}"
sequence:
- variables:
delta: "{{ (target_2 - grid_power) | round(0) }}"
- choose:
- conditions: "{{ delta < -hysteresis }}"
sequence:
- action: number.set_value
target:
entity_id: "{{ anker_entity }}"
data:
value: "{{ [sb_min_2, [sb_max_2, current_set + step] | min] | max }}"
- conditions: "{{ delta > hysteresis }}"
sequence:
- action: number.set_value
target:
entity_id: "{{ anker_entity }}"
data:
value: "{{ [sb_min_2, current_set - step] | max }}"
# außerhalb aller Fenster → Minimalleistung Fenster 1
- conditions: []
sequence:
- action: number.set_value
target:
entity_id: "{{ anker_entity }}"
data:
value: "{{ sb_min_1 }}"
trace:
stored_traces: 20
Einträge für input_number habe ich aus der configuration.yaml ausgelagert in input_number.yaml
# Anker E1600 Minimaleinspeisung
# Fenster 1
zielwert_1:
name: Zielwert Netzbezug Fenster 1
min: 0
max: 800
step: 50
unit_of_measurement: W
icon: mdi:target
min_power_1:
name: Minimalleistung Fenster 1
min: 100
max: 800
step: 50
unit_of_measurement: W
icon: mdi:power-sleep
max_power_1:
name: Maximalleistung Fenster 1
min: 100
max: 800
step: 50
unit_of_measurement: W
icon: mdi:solar-power
# Fenster 2
zielwert_2:
name: Zielwert Netzbezug Fenster 2
min: 0
max: 800
step: 50
unit_of_measurement: W
icon: mdi:target
min_power_2:
name: Minimalleistung Fenster 2
min: 100
max: 800
step: 50
unit_of_measurement: W
icon: mdi:power-sleep
max_power_2:
name: Maximalleistung Fenster 2
min: 100
max: 800
step: 50
unit_of_measurement: W
icon: mdi:solar-power
input_datetime ebenfalls ausgelagert in input_datetime.yaml
# Anker E1600 Minimaleinspeisung Zeitangaben
# Fenster 1
start_time_1:
name: Startzeit Fenster 1
has_date: false
has_time: true
end_time_1:
name: Endzeit Fenster 1
has_date: false
has_time: true
# Fenster 2
start_time_2:
name: Startzeit Fenster 2
has_date: false
has_time: true
end_time_2:
name: Endzeit Fenster 2
has_date: false
has_time: true
Zum Schluss noch die Netzleistung Delta, ausgelagert in templates.yaml
- sensor:
- name: "Netzleistung Delta"
unit_of_measurement: "W"
state_class: "measurement"
state: >
{% set grid = states('sensor.shellypro3em_total_active_power') | float(0) %}
{% set target = states('input_number.netzbezug_zielwert') | float(30) %}
{{ (grid - target) | round(0) }}
Damit die ausgelagerten yaml´s von HA geladen werden, trägst du in die configuration.yaml diese Zeilen ein:
template: !include templates.yaml
input_number: !include input_number.yaml
input_datetime: !include input_datetime.yaml
Nach einem schnellen Neuladen von HA sollten die Blueprints sichtbar sein und du kannst sie einfach konfigurieren.
Fast vergessen, hier das Dashboard, aufgeteilt in Tag / Nacht, Übersicht und Verlauf 
type: vertical-stack
cards:
- type: entities
title: Minimaleinspeisung Tag
show_header_toggle: false
entities:
- entity: input_number.zielwert_1
name: Ziel-Netzbezug
- entity: input_number.min_power_1
name: Minimalleistung
- entity: input_number.max_power_1
name: Maximalleistung
- entity: input_datetime.start_time_1
name: Startzeit
- entity: input_datetime.end_time_1
name: Endzeit
state_color: false
type: vertical-stack
cards:
- type: entities
title: Minimaleinspeisung Nacht
show_header_toggle: false
entities:
- entity: input_number.zielwert_2
name: Ziel-Netzbezug
- entity: input_number.min_power_2
name: Minimalleistung
- entity: input_number.max_power_2
name: Maximalleistung
- entity: input_datetime.start_time_2
name: Startzeit
- entity: input_datetime.end_time_2
name: Endzeit
state_color: false
type: vertical-stack
cards:
- type: entities
title: Übersicht Minimal-Einspeisung
entities:
- entity: sensor.shellypro3em_total_active_power
name: Netzleistung (W)
- entity: sensor.netzleistung_delta
- entity: sensor.netzstatus_richtung
state_color: false
- type: custom:mini-graph-card
name: Verlauf Einspeisung / Netz
entities:
- entity: sensor.shellypro3em_total_active_power
name: Netzleistung
color: "#1f77b4"
- entity: number.e1600_system_einspeisevorgabe
name: E1600 Vorgabe
color: "#ff7f0e"
- entity: sensor.netzleistung_delta
color: "#2ca02c"
hours_to_show: 12
points_per_hour: 6
show:
extrema: true
labels: true
state: true