Skip to content

Template Sensors for Power and Energy

Andrea Arcangeli edited this page Nov 14, 2024 · 6 revisions

Background

In Solaredge systems consisting of batteries and meters, the raw values reported by these sensors does 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

Templated sensors should be entered in your configuration.yaml file, and the templates reloaded.

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:
      - name: "Power - Battery Charging"
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        state: "{{ max([float(states('sensor.solaredge_b1_dc_power'), 0), 0]) | abs() }}"
        availability: "{{ has_value('sensor.solaredge_b1_dc_power') }}"
      - name: "Power - Battery Discharging"
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        state: "{{ min([float(states('sensor.solaredge_b1_dc_power'), 0), 0]) | abs() }}"
        availability: "{{ has_value('sensor.solaredge_b1_dc_power') }}"

      - name: "Power - Grid Import"
        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 - Grid Export"
        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 - 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_b1_dc_power'), 0), 0]) }}"
        availability: "{{ has_value('sensor.solaredge_i1_dc_power') and has_value('sensor.solaredge_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_m1_ac_power'), 0), 0]) }}"
        availability: "{{ has_value('sensor.solaredge_i1_ac_power') and has_value('sensor.solaredge_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_b1_dc_power'), 0) + min([float(states('sensor.solaredge_i1_dc_power'), 0), 0]), 0]) }}"
        availability: "{{ has_value('sensor.solaredge_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_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