Try this.
blueprint:
name: GoodWe export-limiter naar doelwaarde met hysterese (P1 + HomeWizard)
description: >
Regelt de GoodWe exportlimiet zodat ~target W naar het net wordt teruggeleverd,
met hysterese om fladderen te voorkomen. Werkt met HomeWizard P1 (netvermogen)
en een GoodWe "number" entiteit voor exportlimiet (0–4200 W).
domain: automation
input:
p1_power_entity:
name: P1 netvermogen sensor
description: Sensor met actueel netvermogen (W). Bij P1 is export meestal negatief.
selector:
entity:
domain: sensor
goodwe_limit_entity:
name: GoodWe exportlimiet (number)
description: Number-entiteit waarmee je de exportlimiet (W) zet.
selector:
entity:
domain: number
target_export_w:
name: Doelwaarde export (W)
default: 250
selector:
number:
min: 0
max: 6000
step: 50
unit_of_measurement: W
mode: box
hysteresis_w:
name: Hysterese (±W)
description: Pas de limiet pas aan als de afwijking groter is dan deze waarde.
default: 100
selector:
number:
min: 50
max: 1000
step: 10
unit_of_measurement: W
mode: box
step_w:
name: Stapgrootte (W)
description: Grootte van elke aanpassing van de exportlimiet.
default: 100
selector:
number:
min: 20
max: 1000
step: 10
unit_of_measurement: W
mode: box
min_limit_w:
name: Minimum exportlimiet (W)
default: 0
selector:
number:
min: 0
max: 4200
step: 50
unit_of_measurement: W
mode: box
max_limit_w:
name: Maximum exportlimiet (W)
default: 4200
selector:
number:
min: 0
max: 10000
step: 50
unit_of_measurement: W
mode: box
invert_p1_sign:
name: P1-teken omkeren (export is negatief)
description: Laat aan staan wanneer je P1 export negatief is (standaard bij HomeWizard P1).
default: true
selector:
boolean: {}
sample_seconds:
name: Update-interval (seconden)
default: 5
selector:
number:
min: 5
max: 120
step: 5
unit_of_measurement: s
mode: slider
enable_helper:
name: (Optioneel) schakelaar om regeling te activeren
default:
selector:
entity:
domain: input_boolean
multiple: false
mode: single
max_exceeded: silent
variables:
p1_entity: !input p1_power_entity
limit_entity: !input goodwe_limit_entity
target_w: !input target_export_w
hyst_w: !input hysteresis_w
step_w: !input step_w
min_w: !input min_limit_w
max_w: !input max_limit_w
invert: !input invert_p1_sign
# Huidige metingen/staten
p1_raw: "{{ states(p1_entity) | float(0) }}"
# Maak export positief in W; import wordt 0
export_now: >
{% set v = (invert | iif(-1,1)) * p1_raw %}
{{ [v, 0] | max }}
limit_now: "{{ states(limit_entity) | float(0) }}"
error_w: "{{ target_w - export_now }}"
need_adjust: "{{ (error_w | abs) > hyst_w }}"
direction: "{{ 1 if error_w > 0 else -1 }}"
proposed_limit: >
{% set adjust = [step_w, (error_w | abs)] | min * direction %}
{{ (limit_now + adjust) | float }}
clamped_limit: >
{% if proposed_limit < min_w %} {{ min_w }}
{% elif proposed_limit > max_w %} {{ max_w }}
{% else %} {{ proposed_limit }}
{% endif %}
trigger:
- platform: time_pattern
seconds: "/10"
condition:
- condition: template
value_template: "{{ states(p1_entity) not in ['unknown','unavailable','none'] }}"
- condition: template
value_template: "{{ states(limit_entity) not in ['unknown','unavailable','none'] }}"
- condition: template
value_template: >
{% if not enable_helper %}
true
{% else %}
{{ is_state(enable_helper, 'on') }}
{% endif %}
action:
- choose:
- conditions:
- condition: template
value_template: "{{ need_adjust }}"
sequence:
- service: number.set_value
target:
entity_id: "{{ limit_entity }}"
data:
value: "{{ clamped_limit }}"
default: []