Advertisement
rhessellund

Inverter Automation Script

Jun 12th, 2025 (edited)
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
YAML 10.86 KB | None | 0 0
  1. alias: Batteri - Automatisk batteristyring
  2. description: >
  3.  Justerer batterioutput automatisk hver minut baseret på tid, SOC, pris og
  4.   forecast
  5. triggers:
  6.   - minutes: /1
  7.     trigger: time_pattern
  8. conditions:
  9.   - condition: template
  10.     value_template: |
  11.      {{ not (
  12.         [
  13.           states('sensor.solcast_pv_forecast_forecast_remaining_today'),
  14.           states('sensor.solcast_pv_forecast_forecast_tomorrow'),
  15.           states('sensor.energi_data_service_salg'),
  16.           states('sensor.esphome_web_b2bf74_sun12k_battery_capacity'),
  17.           states('input_number.sell_soc_stop_' ~ current_interval),
  18.           states('input_number.sell_price_above_' ~ current_interval),
  19.           states('input_number.sell_forecast_above_' ~ current_interval),
  20.           states('input_number.sell_watt_' ~ current_interval),
  21.           states('input_number.charge_soc_below_' ~ current_interval),
  22.           states('input_number.charge_price_limit_' ~ current_interval),
  23.           states('input_number.charge_forecast_below_' ~ current_interval),
  24.           states('input_number.charge_watt_' ~ current_interval)
  25.         ] | select('in', ['unavailable', 'unknown', 'none']) | list | count
  26.       ) > 0 == false }}
  27. actions:
  28.   - choose:
  29.       - conditions:
  30.           - condition: template
  31.             value_template: |
  32.              {{
  33.                 sell and
  34.                 (soc > states('input_number.sell_soc_stop_' ~ current_interval) | float(0)) and
  35.                 (price > states('input_number.sell_price_above_' ~ current_interval) | float(0)) and
  36.                 (expected_production > states('input_number.sell_forecast_above_' ~ current_interval) | float(0))
  37.               }}
  38.         sequence:
  39.           - target:
  40.               entity_id: input_text.output_limit_control_mode
  41.             data:
  42.               value: Selling first
  43.             action: input_text.set_value
  44.           - target:
  45.               entity_id: input_number.output_max_solar_sell_power
  46.             data:
  47.               value: >-
  48.                 {{ states('input_number.sell_watt_' ~ current_interval) |
  49.                float(0) }}
  50.             action: input_number.set_value
  51.           - target:
  52.               entity_id: input_boolean.output_grid_charge
  53.             action: input_boolean.turn_off
  54.             data: {}
  55.       - conditions:
  56.           - condition: template
  57.             value_template: |
  58.              {{
  59.                 charge and
  60.                 (soc < states('input_number.charge_soc_below_' ~ current_interval) | float(0)) and
  61.                 (price < states('input_number.charge_price_limit_' ~ current_interval) | float(0)) and
  62.                 (expected_production < states('input_number.charge_forecast_below_' ~ current_interval) | float(0))
  63.               }}
  64.         sequence:
  65.           - target:
  66.               entity_id: input_boolean.output_grid_charge
  67.             action: input_boolean.turn_on
  68.             data: {}
  69.           - target:
  70.               entity_id: input_text.output_limit_control_mode
  71.             data:
  72.               value: Zero export to CT
  73.             action: input_text.set_value
  74.           - target:
  75.               entity_id: input_number.output_max_solar_sell_power
  76.             data:
  77.               value: 12000
  78.             action: input_number.set_value
  79.           - target:
  80.               entity_id: input_number.output_maximum_battery_grid_charge_current
  81.             data:
  82.               value: |
  83.                {{
  84.                   (states('input_number.charge_watt_' ~ current_interval) | float(0) / 48)
  85.                   | round(0, 'floor')
  86.                 }}
  87.             action: input_number.set_value
  88.     default:
  89.       - target:
  90.           entity_id: input_text.output_limit_control_mode
  91.         data:
  92.           value: Zero export to CT
  93.         action: input_text.set_value
  94.       - target:
  95.           entity_id: input_boolean.output_grid_charge
  96.         action: input_boolean.turn_off
  97.         data: {}
  98.       - target:
  99.           entity_id: input_number.output_max_solar_sell_power
  100.         data:
  101.           value: 12000
  102.         action: input_number.set_value
  103.       - target:
  104.           entity_id: input_number.output_maximum_battery_grid_charge_current
  105.         data:
  106.           value: 150
  107.         action: input_number.set_value
  108.   - data:
  109.       name: 🔋 Batteristyring
  110.       message: >
  111.         ▶️ Inputværdier: Interval: {{ current_interval }} SOC: {{ soc }} % Pris:
  112.         {{ price }} DKK/kWh Produktion: {{ expected_production }} kWh
  113.  
  114.         Sælg aktiv: {{ sell }} SOC stop (sell): {{
  115.         states('input_number.sell_soc_stop_' ~ current_interval) }} Prisgrænse
  116.         (sell): {{ states('input_number.sell_price_above_' ~ current_interval)
  117.         }} Forecastgrænse (sell): {{ states('input_number.sell_forecast_above_'
  118.         ~ current_interval) }} Watt (sell): {{ states('input_number.sell_watt_'
  119.         ~ current_interval) }}
  120.  
  121.         Oplad aktiv: {{ charge }} SOC lav (charge): {{
  122.         states('input_number.charge_soc_below_' ~ current_interval) }}
  123.         Prisgrænse (charge): {{ states('input_number.charge_price_limit_' ~
  124.         current_interval) }} Forecastgrænse (charge): {{
  125.         states('input_number.charge_forecast_below_' ~ current_interval) }} Watt
  126.         (charge): {{ states('input_number.charge_watt_' ~ current_interval) }}
  127.  
  128.         ✅ Outputbeslutning: output_limit_control_mode: {{
  129.         states('input_text.output_limit_control_mode') }} output_grid_charge: {{
  130.         is_state('input_boolean.output_grid_charge', 'on') }}
  131.         output_max_solar_sell_power: {{
  132.         states('input_number.output_max_solar_sell_power') }}
  133.         output_maximum_battery_grid_charge_current: {{
  134.         states('input_number.output_maximum_battery_grid_charge_current') }}
  135.     action: logbook.log
  136.   - if:
  137.       - condition: template
  138.         value_template: >-
  139.           {{ states('input_text.output_limit_control_mode') !=
  140.           old_limit_control_mode }}
  141.     then:
  142.       - data:
  143.           option: "{{ states('input_text.output_limit_control_mode') }}"
  144.         target:
  145.           entity_id: select.esphome_web_b2bf74_sun12k_limit_control_mode
  146.         action: select.select_option
  147.       - data:
  148.           name: 🔄 Inverter opdatering
  149.           message: >
  150.            output_limit_control_mode ændret til "{{
  151.             states('input_text.output_limit_control_mode') }}"
  152.         action: logbook.log
  153.   - if:
  154.       - condition: template
  155.         value_template: >-
  156.           {{ is_state('input_boolean.output_grid_charge', 'on') !=
  157.           old_grid_charge }}
  158.     then:
  159.       - target:
  160.           entity_id:
  161.            - switch.esphome_web_b2bf74_sun12k_time_point_1_charge_enable
  162.             - switch.esphome_web_b2bf74_sun12k_time_point_2_charge_enable
  163.             - switch.esphome_web_b2bf74_sun12k_time_point_3_charge_enable
  164.             - switch.esphome_web_b2bf74_sun12k_time_point_4_charge_enable
  165.             - switch.esphome_web_b2bf74_sun12k_time_point_5_charge_enable
  166.             - switch.esphome_web_b2bf74_sun12k_time_point_6_charge_enable
  167.         action: >-
  168.           switch.turn_{{ 'on' if is_state('input_boolean.output_grid_charge',
  169.           'on') else 'off' }}
  170.       - target:
  171.           entity_id:
  172.            - number.esphome_web_b2bf74_sun12k_time_point_1_capacity
  173.             - number.esphome_web_b2bf74_sun12k_time_point_2_capacity
  174.             - number.esphome_web_b2bf74_sun12k_time_point_3_capacity
  175.             - number.esphome_web_b2bf74_sun12k_time_point_4_capacity
  176.             - number.esphome_web_b2bf74_sun12k_time_point_5_capacity
  177.             - number.esphome_web_b2bf74_sun12k_time_point_6_capacity
  178.         data:
  179.           value: |-
  180.             {{
  181.               states('input_number.charge_soc_below_' ~ current_interval) | float(0)
  182.               if is_state('input_boolean.output_grid_charge', 'on')
  183.               else 20
  184.             }}
  185.         action: number.set_value
  186.       - data:
  187.           name: 🔄 Inverter opdatering
  188.           message: >
  189.            output_grid_charge ændret til "{{ 'on' if
  190.             is_state('input_boolean.output_grid_charge', 'on') else 'off' }}"
  191.  
  192.             ➕ Time point capacities sat til {{
  193.               states('input_number.charge_soc_below_' ~ current_interval) | float(0)
  194.               if is_state('input_boolean.output_grid_charge', 'on')
  195.               else 20
  196.             }} %
  197.         action: logbook.log
  198.   - if:
  199.       - condition: template
  200.         value_template: >-
  201.           {{ (states('input_number.output_max_solar_sell_power') | float(0)) !=
  202.           old_max_solar_sell_power }}
  203.     then:
  204.       - data:
  205.           value: "{{ states('input_number.output_max_solar_sell_power') | float(0) }}"
  206.         target:
  207.           entity_id: number.esphome_web_b2bf74_sun12k_max_solar_sell_power
  208.         action: number.set_value
  209.       - data:
  210.           name: 🔄 Inverter opdatering
  211.           message: >
  212.            output_max_solar_sell_power ændret til {{
  213.             states('input_number.output_max_solar_sell_power') | float(0) }} W
  214.         action: logbook.log
  215.   - if:
  216.       - condition: template
  217.         value_template: >-
  218.           {{ (states('input_number.output_maximum_battery_grid_charge_current')
  219.           | float(0)) != old_grid_charge_current }}
  220.     then:
  221.       - data:
  222.           value: >-
  223.             {{ states('input_number.output_maximum_battery_grid_charge_current')
  224.             | float(0) }}
  225.         target:
  226.           entity_id: number.esphome_web_b2bf74_sun12k_maximum_battery_grid_charge_current
  227.         action: number.set_value
  228.       - data:
  229.           name: 🔄 Inverter opdatering
  230.           message: >
  231.            output_maximum_battery_grid_charge_current ændret til {{
  232.             states('input_number.output_maximum_battery_grid_charge_current') |
  233.             float(0) }} A
  234.         action: logbook.log
  235. variables:
  236.   current_interval: "{{ '%02d00_%02d00' | format(now().hour, (now().hour + 1) % 24) }}"
  237.   expected_production: |
  238.    {% if now().hour <= 10 %}
  239.       {{ states('sensor.solcast_pv_forecast_forecast_remaining_today') | float(0) }}
  240.     {% else %}
  241.       {{ states('sensor.solcast_pv_forecast_forecast_remaining_today') | float(0)
  242.        + states('sensor.solcast_pv_forecast_forecast_tomorrow') | float(0) }}
  243.     {% endif %}
  244.   price: "{{ states('sensor.energi_data_service_salg') | float(0) }}"
  245.   soc: "{{ states('sensor.esphome_web_b2bf74_sun12k_battery_capacity') | float(0) }}"
  246.   sell: "{{ is_state('input_boolean.sell_' ~ current_interval, 'on') }}"
  247.   charge: "{{ is_state('input_boolean.charge_' ~ current_interval, 'on') }}"
  248.   old_limit_control_mode: "{{ states('input_text.output_limit_control_mode') }}"
  249.   old_grid_charge: "{{ is_state('input_boolean.output_grid_charge', 'on') }}"
  250.   old_max_solar_sell_power: "{{ states('input_number.output_max_solar_sell_power') | float(0) }}"
  251.   old_grid_charge_current: >-
  252.     {{ states('input_number.output_maximum_battery_grid_charge_current') |
  253.    float(0) }}
  254. mode: single
  255.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement