Files
shaggy-solar/eg4battery/homeassistant/template_sensors.yaml

175 lines
6.6 KiB
YAML
Raw Normal View History

2026-04-24 16:34:10 -04:00
# Derived template sensors for the eg4-battery daemon's 3-pack stack.
# Include into configuration.yaml as:
# template: !include eg4_battery/template_sensors.yaml
#
# Per-pack entities created:
# sensor.lifepower4_N_pack_power W (V × I, signed; + = charging)
# sensor.lifepower4_N_temperature_max °C (max of 5 temp sensors)
# sensor.lifepower4_N_cell_imbalance_pct % (delta / min_cell) × 100
#
# Stack-wide rollups:
# sensor.lifepower4_stack_pack_power_total W (sum of all 3 pack_powers)
# sensor.lifepower4_stack_soc_avg % (average SoC across packs)
# sensor.lifepower4_stack_temperature_max °C (hottest point anywhere)
- sensor:
# ---- pack 1 ----
- name: "lifepower4_1 pack_power"
unique_id: lifepower4_1_pack_power
unit_of_measurement: "W"
device_class: power
state_class: measurement
state: >
{% set v = states('sensor.lifepower4_1_pack_voltage') | float(0) %}
{% set i = states('sensor.lifepower4_1_pack_current') | float(0) %}
{{ (v * i) | round(1) }}
- name: "lifepower4_1 temperature_max"
unique_id: lifepower4_1_temperature_max
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
state: >
{% set t = [
states('sensor.lifepower4_1_temperature_01') | int(0),
states('sensor.lifepower4_1_temperature_02') | int(0),
states('sensor.lifepower4_1_temperature_03') | int(0),
states('sensor.lifepower4_1_temperature_04') | int(0),
states('sensor.lifepower4_1_temperature_pcb') | int(0),
] %}
{{ t | max }}
- name: "lifepower4_1 cell_imbalance_pct"
unique_id: lifepower4_1_cell_imbalance_pct
unit_of_measurement: "%"
state_class: measurement
state: >
{% set d = states('sensor.lifepower4_1_cell_voltage_delta_mv') | float(0) %}
{% set mn = states('sensor.lifepower4_1_cell_voltage_min') | float(0) %}
{{ (d / (mn * 1000) * 100) | round(3) if mn > 0 else 0 }}
# ---- pack 2 ----
- name: "lifepower4_2 pack_power"
unique_id: lifepower4_2_pack_power
unit_of_measurement: "W"
device_class: power
state_class: measurement
state: >
{% set v = states('sensor.lifepower4_2_pack_voltage') | float(0) %}
{% set i = states('sensor.lifepower4_2_pack_current') | float(0) %}
{{ (v * i) | round(1) }}
- name: "lifepower4_2 temperature_max"
unique_id: lifepower4_2_temperature_max
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
state: >
{% set t = [
states('sensor.lifepower4_2_temperature_01') | int(0),
states('sensor.lifepower4_2_temperature_02') | int(0),
states('sensor.lifepower4_2_temperature_03') | int(0),
states('sensor.lifepower4_2_temperature_04') | int(0),
states('sensor.lifepower4_2_temperature_pcb') | int(0),
] %}
{{ t | max }}
- name: "lifepower4_2 cell_imbalance_pct"
unique_id: lifepower4_2_cell_imbalance_pct
unit_of_measurement: "%"
state_class: measurement
state: >
{% set d = states('sensor.lifepower4_2_cell_voltage_delta_mv') | float(0) %}
{% set mn = states('sensor.lifepower4_2_cell_voltage_min') | float(0) %}
{{ (d / (mn * 1000) * 100) | round(3) if mn > 0 else 0 }}
# ---- pack 3 ----
- name: "lifepower4_3 pack_power"
unique_id: lifepower4_3_pack_power
unit_of_measurement: "W"
device_class: power
state_class: measurement
state: >
{% set v = states('sensor.lifepower4_3_pack_voltage') | float(0) %}
{% set i = states('sensor.lifepower4_3_pack_current') | float(0) %}
{{ (v * i) | round(1) }}
- name: "lifepower4_3 temperature_max"
unique_id: lifepower4_3_temperature_max
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
state: >
{% set t = [
states('sensor.lifepower4_3_temperature_01') | int(0),
states('sensor.lifepower4_3_temperature_02') | int(0),
states('sensor.lifepower4_3_temperature_03') | int(0),
states('sensor.lifepower4_3_temperature_04') | int(0),
states('sensor.lifepower4_3_temperature_pcb') | int(0),
] %}
{{ t | max }}
- name: "lifepower4_3 cell_imbalance_pct"
unique_id: lifepower4_3_cell_imbalance_pct
unit_of_measurement: "%"
state_class: measurement
state: >
{% set d = states('sensor.lifepower4_3_cell_voltage_delta_mv') | float(0) %}
{% set mn = states('sensor.lifepower4_3_cell_voltage_min') | float(0) %}
{{ (d / (mn * 1000) * 100) | round(3) if mn > 0 else 0 }}
# ---- stack-wide rollups ----
- name: "lifepower4_stack pack_power_total"
unique_id: lifepower4_stack_pack_power_total
unit_of_measurement: "W"
device_class: power
state_class: measurement
state: >
{% set p = [
states('sensor.lifepower4_1_pack_power') | float(0),
states('sensor.lifepower4_2_pack_power') | float(0),
states('sensor.lifepower4_3_pack_power') | float(0),
] %}
{{ p | sum | round(1) }}
- name: "lifepower4_stack soc_avg"
unique_id: lifepower4_stack_soc_avg
unit_of_measurement: "%"
device_class: battery
state_class: measurement
state: >
{% set s = [
states('sensor.lifepower4_1_soc') | float(0),
states('sensor.lifepower4_2_soc') | float(0),
states('sensor.lifepower4_3_soc') | float(0),
] %}
{{ (s | sum / s | length) | round(1) }}
- name: "lifepower4_stack temperature_max"
unique_id: lifepower4_stack_temperature_max
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
state: >
{% set t = [
states('sensor.lifepower4_1_temperature_max') | int(0),
states('sensor.lifepower4_2_temperature_max') | int(0),
states('sensor.lifepower4_3_temperature_max') | int(0),
] %}
{{ t | max }}
# --- integration → energy (pack_power integrated to Wh) ---
# Paste this at the top level of configuration.yaml, NOT inside `template:`:
#
# sensor:
# - platform: integration
# source: sensor.lifepower4_1_pack_power
# name: lifepower4_1_pack_energy
# unit_prefix: k
# round: 3
# method: left
# # ... repeat for pack 2 and 3 ...
#
# Then wire the resulting sensor.lifepower4_N_pack_energy into the HA
# Energy dashboard → Home battery storage → one entry per pack.