175 lines
6.6 KiB
YAML
175 lines
6.6 KiB
YAML
|
|
# 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.
|