Skip to content

Automations

David Rapan edited this page Nov 27, 2025 · 36 revisions

Change 'entity_ids' and 'device' in following automations accordingly 😉

Time of Use

Dependency: Energy Management, Solcast PV Forecast

alias: "Inverter: Time of Use"
description: >-
  Controls all Time of Use programs at once throughout the day based on the
  current electricity price and solar forecast
triggers:
  - trigger: state
    entity_id:
      - sensor.energy_management_battery
      - binary_sensor.energy_management_battery_charge_from_grid
      - sensor.energy_management_cost_rate
    for:
      hours: 0
      minutes: 0
      seconds: 0
  - trigger: state
    entity_id:
      - binary_sensor.inverter_connection
    to: "on"
conditions:
  - condition: template
    value_template: >-
      {{ has_value('sensor.energy_management_battery') and
      has_value('binary_sensor.energy_management_battery_charge_from_grid') }}
  - condition: state
    entity_id: binary_sensor.inverter_connection
    state: "on"
actions:
  - sequence:
      - variables:
          charge_from_grid: >-
            {{ 1 if
            is_state('binary_sensor.energy_management_battery_charge_from_grid',
            'on') else 0 }}
      - action: solarman.read_holding_registers
        metadata: {}
        data:
          count: 7
          address: 166
          device: bd3eff81f9b0984e91f40426cba9c0e1
        response_variable: resp
      - if:
          - condition: template
            enabled: true
            value_template: >-
              {{ states('sensor.energy_management_battery') | float != resp[166]
              or charge_from_grid != resp[172] }}
        then:
          - action: solarman.write_multiple_registers
            metadata: {}
            data:
              device: bd3eff81f9b0984e91f40426cba9c0e1
              address: 166
              values:
                - "{{ states('sensor.energy_management_battery') }}"
                - "{{ states('sensor.energy_management_battery') }}"
                - "{{ states('sensor.energy_management_battery') }}"
                - "{{ states('sensor.energy_management_battery') }}"
                - "{{ states('sensor.energy_management_battery') }}"
                - "{{ states('sensor.energy_management_battery') }}"
                - "{{ charge_from_grid }}"
                - "{{ charge_from_grid }}"
                - "{{ charge_from_grid }}"
                - "{{ charge_from_grid }}"
                - "{{ charge_from_grid }}"
                - "{{ charge_from_grid }}"
      - if:
          - condition: numeric_state
            entity_id: sensor.energy_management_compensation_rate
            below: 0
        then:
          - if:
              - condition: state
                entity_id: switch.inverter_export_surplus
                state: "on"
            then:
              - action: switch.turn_off
                metadata: {}
                data: {}
                target:
                  entity_id: switch.inverter_export_surplus
              - action: number.set_value
                metadata: {}
                data:
                  value: "120"
                target:
                  entity_id: number.inverter_zero_export_power
        else:
          - if:
              - condition: state
                entity_id: switch.inverter_export_surplus
                state: "off"
            then:
              - action: switch.turn_on
                metadata: {}
                data: {}
                target:
                  entity_id: switch.inverter_export_surplus
              - action: number.set_value
                metadata: {}
                data:
                  value: "20"
                target:
                  entity_id: number.inverter_zero_export_power
mode: single
max_exceeded: silent

Time synchronization

alias: "Inverter: Time synchronization"
description: Set device's time to `now()`
trigger:
  - platform: time
    at: sensor.sun_next_dawn
  - event: start
    trigger: homeassistant
actions:
  - data:
      datetime: "{{ now() }}"
    target:
      entity_id: datetime.inverter_date_time
    action: datetime.set_value
mode: single

PVOutput Uploader

alias: PVOutput Uploader
description: Uploads production data to PVOutput
trigger:
  - platform: time_pattern
    minutes: /5
action:
  - service: rest_command.pvoutput_upload
    data: {}
mode: single

And configure RESTful Command in configuration.yaml:

rest_command:
  pvoutput_upload:
    url: https://pvoutput.org/service/r2/addstatus.jsp
    method: post
    content_type: "application/x-www-form-urlencoded"
    headers:
       X-Pvoutput-Apikey: KEY
       X-Pvoutput-SystemId: ID
    payload: "d={{now().strftime('%Y%m%d')}}&t={{now().strftime('%H:%M')}}&c1=1&v1={{(states('sensor.inverter_total_production'))|float*1000|round(0)}}"

Replace KEY and ID using yours. More 'bout the parameters here

Clone this wiki locally