|
alias: "solar_power_feed_zero_export" |
|
triggers: |
|
# Trigger when power consumption changes |
|
- trigger: "state" |
|
entity_id: "sensor.energy_power_current" |
|
# set `to` to `null`, otherwise the automation will trigger |
|
# for both `from` and `to` states, as well as attribute changes |
|
to: null |
|
# Trigger every 9 seconds |
|
# - trigger: "time_pattern" |
|
# seconds: "/9" |
|
variables: |
|
# Battery |
|
battery_level_entity_id: "sensor.home_solar_system_average_battery_level" |
|
battery_level_min_entity_id: "input_number.solar_battery_level_min" |
|
# Current grid power (positive = importing, negative = exporting) |
|
grid_current_power: > |
|
{{ states("sensor.energy_power_current") | int(0) }} |
|
# Inverter number entity controlling output power |
|
inverter_control_entity_id: "number.solar_max_output" |
|
# Inverter max rated output power |
|
inverter_rated_power: > |
|
{{ states("input_number.solar_inverter_rated_power") }} |
|
# Inverter min output power setting |
|
inverter_min_power_entity_id: input_number.solar_inverter_output_min |
|
inverter_min_power: > |
|
{{ states(inverter_min_power_entity_id) }} |
|
# Step size for power calculations |
|
step: 10 |
|
|
|
conditions: |
|
# Don't run if grid consumption/production is within acceptable parameters |
|
- condition: "template" |
|
value_template: > |
|
{{ not (-(step) < grid_current_power < step) }} |
|
# Don't run if strategy isn't active |
|
- condition: "state" |
|
entity_id: "input_select.solar_power_feed_strategy" |
|
state: "zero grid export" |
|
# Don't run if the grid connection is interrupted |
|
- condition: "state" |
|
entity_id: "switch.0xa4c13833f21e39cf" |
|
state: "on" |
|
actions: |
|
- variables: |
|
# Minimum battery level |
|
battery_level_min: > |
|
{{ states(battery_level_min_entity_id) | int(0) }} |
|
battery_level_current: > |
|
{{ (states(battery_level_entity_id) | int(0)) }} |
|
# Current output power set on the inverter |
|
inverter_current_power: > |
|
{{ states(inverter_control_entity_id) | round(0) }} |
|
# Normalize to steps |
|
inverter_current_power_stepped: > |
|
{{ (inverter_current_power // step) * step }} |
|
# Calculated target power setting (in steps of `step`) |
|
grid_current_power_stepped: > |
|
{{ ((grid_current_power // step) + 1) * step }} |
|
# New target output power value for inverter |
|
target_power: > |
|
{{ (inverter_current_power_stepped + grid_current_power_stepped) }} |
|
# New Target output power, clamped for min and max values |
|
target_power_clamped: > |
|
{{ [([target_power, inverter_rated_power] | min), inverter_min_power] | max }} |
|
# Debug logging message |
|
log_message: > |
|
{{ |
|
"Grid:" ~ grid_current_power ~ "W | " ~ |
|
"Grid (stepped):" ~ grid_current_power_stepped ~ "W | " ~ |
|
"Inverter current:" ~ inverter_current_power ~ "W | " ~ |
|
"Inverter current (stepped):" ~ inverter_current_power_stepped ~ "W | " ~ |
|
"Inverter rated:" ~ inverter_rated_power ~ "W | " ~ |
|
"Target:" ~ target_power ~ "W | " ~ |
|
"Target (clamped):" ~ target_power_clamped ~ "W" |
|
}} |
|
# Switch action based on inverter_controller_entity type |
|
inverter_control_number_set_value_action: > |
|
{% if inverter_control_entity_id.startswith("input_number.") %} |
|
input_number.set_value |
|
{% else %} |
|
number.set_value |
|
{% endif %} |
|
|
|
- action: "system_log.write" |
|
data: |
|
level: "info" |
|
message: "Zero Power Feed: {{ now().strftime('%H:%M:%S') }} | {{ log_message }}" |
|
|
|
- if: |
|
# Don't set calculated target power when battery is low |
|
- condition: "template" |
|
value_template: > |
|
{{ battery_level_current >= battery_level_min }} |
|
then: |
|
- action: "{{ inverter_control_number_set_value_action }}" |
|
target: |
|
entity_id: "{{ inverter_control_entity_id }}" |
|
data: |
|
value: "{{ target_power_clamped }}" |
|
else: |
|
# Instead, set inverter min power when battery is low |
|
- action: "{{ inverter_control_number_set_value_action }}" |
|
|
|
target: |
|
entity_id: "{{ inverter_control_entity_id }}" |
|
data: |
|
value: "{{ inverter_min_power }}" |