-
-
Notifications
You must be signed in to change notification settings - Fork 17
Template Sensors for Power and Energy
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.
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:
- 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