Template Sensors for Power and Energy - WillCodeForCats/solaredge-modbus-multi GitHub Wiki

Background

In Solaredge systems consisting of batteries and meters, the raw values reported by these sensors do not align exactly with useful metrics, such as load consumption, solar generation, etc. These must be calculated from the raw values with templated sensors, however, these sensors will be different depending on the exact system configuration. This page captures the necessary background and template sensor configurations for various configurations in order to populate a Tesla Style Power Card or the default home energy dashboard

Additional configuration should be entered in your configuration.yaml file, see here for how to edit.

Single inverter, Single Import / Export meter

The diagram shows the system components, and the sensors that we have available natively from the integration. Arrow indicates positive flow.

                          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                          โ”‚    PV     โ”‚
                          โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜
                                โ”‚
                         โ•”โ•โ•โ•โ•โ•โ•โ•งโ•โ•โ•โ•โ•โ•โ•โ•—
                         โ•‘ I1 DC Power  โ•‘ โ†“
                         โ•šโ•โ•โ•โ•โ•โ•โ•คโ•โ•โ•โ•โ•โ•โ•โ•
                                โ”‚
                          โ”Œโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”
                          โ”‚ Inverter  โ”‚
                          โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜
                                โ”‚
                         โ•”โ•โ•โ•โ•โ•โ•โ•งโ•โ•โ•โ•โ•โ•โ•โ•—
                         โ•‘ I1 AC Power  โ•‘โ†“
                         โ•šโ•โ•โ•โ•โ•โ•โ•คโ•โ•โ•โ•โ•โ•โ•โ•
                     โ†          โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—  โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Grid    โ”‚โ”€โ•‘ M1 AC Power  โ•‘โ”€โ”€โ”ดโ”€โ”€โ”€โ”‚   Load    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

image

The following template sensors determine the power flows in a style Power - <from> - <to> and sources / sinks in the style Power - <name>.

template:
  - sensor:
      - name: "Power - Solar Generation"
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        # DC power from inverter
        state: "{{ float(states('sensor.solaredge_i1_dc_power'), 0) }}"
        availability: "{{ has_value('sensor.solaredge_i1_dc_power') }}"

      - name: "Power - Consumption"
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        # The net of inverter and grid power
        state: "{{ float(states('sensor.solaredge_i1_ac_power'), 0) - float(states('sensor.solaredge_m1_ac_power'), 0) }}"
        availability: "{{ has_value('sensor.solaredge_i1_ac_power') and has_value('sensor.solaredge_m1_ac_power') }}"

      - name: "Power - Grid - Load"
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        state: "{{ min([float(states('sensor.solaredge_m1_ac_power'), 0), 0]) | abs() }}"
        availability: "{{ has_value('sensor.solaredge_m1_ac_power') }}"
      - name: "Power - PV - Grid"
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        state: "{{ max([float(states('sensor.solaredge_m1_ac_power'), 0), 0]) | abs() }}"
        availability: "{{ has_value('sensor.solaredge_m1_ac_power') }}"
      - name: "Power - PV - Load"
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        # What is being generated less what is being exported, always positive.
        state: "{{ max([float(states('sensor.power_solar_generation'), 0) - float(states('sensor.power_pv_grid'), 0), 0]) }}"
        availability: "{{ has_value('sensor.power_solar_generation') and has_value('sensor.power_pv_grid') }}"

The tesla power card can then be configured as

type: custom:tesla-style-solar-power-card
energy_flow_diagramm: 1
change_house_bubble_color_with_flow: 1
house_entity: sensor.power_consumption
grid_entity: sensor.solaredge_m1_ac_power
generation_entity: sensor.power_solar_generation
grid_to_house_entity: sensor.power_grid_load
generation_to_grid_entity: sensor.power_pv_grid
generation_to_house_entity: sensor.power_pv_load

Single Inverter, Single Battery, Single Import / Export meter

The diagram shows the system components, and the sensors that we have available natively from the integration. Arrow indicates positive flow.

              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
              โ”‚    PV     โ”‚           โ”‚ Battery 1 โ”‚
              โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜
                    โ”‚                       โ”‚
                    โ”‚                 โ•”โ•โ•โ•โ•โ•โ•งโ•โ•โ•โ•โ•โ•—
                    โ”‚                 โ•‘ B1 Power  โ•‘โ†‘
                    โ”‚                 โ•šโ•โ•โ•โ•โ•โ•คโ•โ•โ•โ•โ•โ•
                    โ”‚                       โ”‚
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                โ”‚
                         โ•”โ•โ•โ•โ•โ•โ•โ•งโ•โ•โ•โ•โ•โ•โ•โ•—
                         โ•‘ I1 DC Power  โ•‘โ†“
                         โ•šโ•โ•โ•โ•โ•โ•โ•คโ•โ•โ•โ•โ•โ•โ•โ•
                                โ”‚
                          โ”Œโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”
                          โ”‚ Inverter  โ”‚
                          โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜
                                โ”‚
                         โ•”โ•โ•โ•โ•โ•โ•โ•งโ•โ•โ•โ•โ•โ•โ•โ•—
                         โ•‘ I1 AC Power  โ•‘โ†“
                         โ•šโ•โ•โ•โ•โ•โ•โ•คโ•โ•โ•โ•โ•โ•โ•โ•
                     โ†          โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—  โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Grid    โ”‚โ”€โ•‘ M1 AC Power  โ•‘โ”€โ”€โ”ดโ”€โ”€โ”€โ”‚   Load    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

image

The following template sensors determine the power flows in a style Power - <from> - <to> and sources / sinks in the style Power - <name>.

template:
  - sensor:
  #PV Templates Sensor
    - name: "Power - Battery Charging"
      unit_of_measurement: "W"
      device_class: "power"
      state_class: "measurement"
      state: "{{ max([float(states('sensor.solaredge_i1_b1_dc_power'), 0), 0]) | abs() }}"
      availability: "{{ has_value('sensor.solaredge_i1_dc_power') }}"
    - name: "Power - Battery Discharging"
      unit_of_measurement: "W"
      device_class: "power"
      state_class: "measurement"
      state: "{{ min([float(states('sensor.solaredge_i1_b1_dc_power'), 0), 0]) | abs() }}"
      availability: "{{ has_value('sensor.solaredge_i1_b1_dc_power') }}"
    - name: "Power - Grid Import"
      unit_of_measurement: "W"
      device_class: "power"
      state_class: "measurement"
      state: "{{ min([float(states('sensor.solaredge_i1_m1_ac_power'), 0), 0]) | abs() }}"
      availability: "{{ has_value('sensor.solaredge_i1_m1_ac_power') }}"
    - name: "Power - Grid Export"
      unit_of_measurement: "W"
      device_class: "power"
      state_class: "measurement"
      state: "{{ max([float(states('sensor.solaredge_i1_m1_ac_power'), 0), 0]) | abs() }}"
      availability: "{{ has_value('sensor.solaredge_i1_m1_ac_power') }}"
    - name: "Power - Solar Generation"
      unit_of_measurement: "W"
      device_class: "power"
      state_class: "measurement"
      # The net of DC power from inverter and battery, only if this is positive
      state: "{{ max([float(states('sensor.solaredge_i1_dc_power'), 0) + float(states('sensor.solaredge_i1_b1_dc_power'), 0), 0]) }}"
      availability: "{{ has_value('sensor.solaredge_i1_dc_power') and has_value('sensor.solaredge_i1_b1_dc_power') }}"
    - name: "Power - Consumption"
      unit_of_measurement: "W"
      device_class: "power"
      state_class: "measurement"
      # The net of inverter and grid power
      state: "{{ max([float(states('sensor.solaredge_i1_ac_power'), 0) - float(states('sensor.solaredge_i1_m1_ac_power'), 0), 0]) }}"
      availability: "{{ has_value('sensor.solaredge_i1_ac_power') and has_value('sensor.solaredge_i1_m1_ac_power') }}"
    - name: "Power - PV - Battery"
      unit_of_measurement: "W"
      device_class: "power"
      state_class: "measurement"
      # Battery power less anything coming from the grid, always positive
      state: "{{ max([float(states('sensor.solaredge_i1_b1_dc_power'), 0) + min([float(states('sensor.solaredge_i1_dc_power'), 0), 0]), 0]) }}"
      availability: "{{ has_value('sensor.solaredge_i1_b1_dc_power') and has_value('sensor.solaredge_i1_dc_power') }}"
    - name: "Power - PV - Load"
      unit_of_measurement: "W"
      device_class: "power"
      state_class: "measurement"
      # What is being generated less what is going to the battery and what is being exported, always positive.
      state: "{{ max([float(states('sensor.power_solar_generation'), 0) - float(states('sensor.power_pv_battery'), 0) - float(states('sensor.power_grid_export'), 0), 0]) }}"
      availability: "{{ has_value('sensor.power_solar_generation') and has_value('sensor.power_pv_battery') }}"
    - name: "Power - PV - Grid"
      unit_of_measurement: "W"
      device_class: "power"
      state_class: "measurement"
      # What is being generated less what is going to the battery and what is being consumed, always positive
      state: "{{ max([float(states('sensor.power_solar_generation'), 0) - float(states('sensor.power_pv_battery'), 0) - float(states('sensor.power_consumption'), 0), 0]) }}"
      availability: "{{ has_value('sensor.power_solar_generation') and has_value('sensor.power_pv_battery') and has_value('sensor.power_consumption') }}"
    - name: "Power - Grid - Load"
      unit_of_measurement: "W"
      device_class: "power"
      state_class: "measurement"
      # What is being imported less anything going to the battery, always positive
      state: "{{ max([float(states('sensor.power_grid_import'), 0) + min([float(states('sensor.solaredge_i1_ac_power'), 0), 0]), 0]) }}"
      availability: "{{ has_value('sensor.power_grid_import') and has_value('sensor.solaredge_i1_ac_power') }}"
    - name: "Power - Grid - Battery"
      unit_of_measurement: "W"
      device_class: "power"
      state_class: "measurement"
      # Grid -> Battery is I1 AC power, when negative
      # Battery -> Grid is what is being exported, if the battery is discharging
      state: "{{ max([-float(states('sensor.solaredge_i1_ac_power'), 0), 0]) - (float(states('sensor.power_grid_export'), 0) if float(states('sensor.solaredge_i1_b1_dc_power'), 0) < 0 else 0) }}"
      availability: "{{ has_value('sensor.solaredge_i1_ac_power') and has_value('sensor.power_grid_export') }}"
    - name: "Power - Battery - Load"
      unit_of_measurement: "W"
      device_class: "power"
      state_class: "measurement"
      # What is being discharged minus what is being exported, if positive
      state: "{{ max([float(states('sensor.power_battery_discharging'), 0) - float(states('sensor.power_grid_export'), 0), 0]) }}"
      availability: "{{ has_value('sensor.power_battery_discharging') and has_value('sensor.power_grid_export') }}"

The tesla power card can then be configured as

type: custom:tesla-style-solar-power-card
name: Power Flow
energy_flow_diagramm: 1
change_house_bubble_color_with_flow: 1
house_entity: sensor.power_consumption
grid_entity: sensor.solaredge_m1_ac_power
generation_entity: sensor.power_solar_generation
battery_entity: sensor.solaredge_b1_dc_power
battery_extra_entity: sensor.solaredge_b1_state_of_energy
grid_to_house_entity: sensor.power_grid_load
grid_to_battery_entity: sensor.power_grid_battery
generation_to_grid_entity: sensor.power_pv_grid
generation_to_house_entity: sensor.power_pv_load
generation_to_battery_entity: sensor.power_pv_battery
battery_to_house_entity: sensor.power_battery_load

Configure home energy dashboard

home assistant energy dashboard

In addition to the power sensors defined above (measured in Watts), the energy dashboard also needs measures for accumulated energy (measured in kWh). Home assistant computes these using the built-in Riemann sum integral integration. Add the following to your configuration.yaml:

sensor:
  # PV Energy Sensors
  - platform: integration
    source: sensor.power_battery_charging
    name: "Energy - Battery Charging"
    unit_prefix: k
    round: 2
    method: left

  - platform: integration
    source: sensor.power_battery_discharging
    name: "Energy - Battery Discharging"
    unit_prefix: k
    round: 2
    method: left

  - platform: integration
    source: sensor.power_grid_import
    name: "Energy - Grid Import"
    unit_prefix: k
    round: 2
    method: left

  - platform: integration
    source: sensor.power_grid_export
    name: "Energy - Grid Export"
    unit_prefix: k
    round: 2
    method: left

  - platform: integration
    source: sensor.power_solar_generation
    name: "Energy - Solar Generation"
    unit_prefix: k
    round: 2
    method: left

  - platform: integration
    source: sensor.power_consumption
    name: "Energy - Consumption"
    unit_prefix: k
    round: 2
    method: left

  - platform: integration
    source: sensor.power_pv_load
    name: "Energy - PV - Load"
    unit_prefix: k
    round: 2
    method: left

  - platform: integration
    source: sensor.power_pv_grid
    name: "Energy - PV - Grid"
    unit_prefix: k
    round: 2
    method: left

  - platform: integration
    source: sensor.power_grid_load
    name: "Energy - Grid - Load"
    unit_prefix: k
    round: 2
    method: left
  
# Skip the battery measures if no battery is installed.

  - platform: integration
    source: sensor.power_pv_battery
    name: "Energy - PV - Battery"
    unit_prefix: k
    round: 2
    method: left

  - platform: integration
    source: sensor.power_grid_battery
    name: "Energy - Grid - Battery"
    unit_prefix: k
    round: 2
    method: left

  - platform: integration
    source: sensor.power_battery_load
    name: "Energy - Battery - Load"
    unit_prefix: k
    round: 2
    method: left
โš ๏ธ **GitHub.com Fallback** โš ๏ธ