Template Sensors for Power and Energy - WillCodeForCats/solaredge-modbus-multi GitHub Wiki
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.
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 โ
โโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโ

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
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 โ
โโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโ

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
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