Hallo zusammen, ich stehe total auf den schlauch. Ich möchte gerne berechnen wie lange meine batterie dauert auf target SOC oder auf 7% entladen zu werden.
wie kann ich das machen
Target SOC - sensor.rct_power_storage_battery_state_of_charge_target
Min SOC - 7%
SOC - sensor.rct_power_storage_battery_state_of_charge
Akku entladen / laden - sensor.rct_power_storage_battery_power (-laden / +entladen)
Battery size - 7,5 kWh
Wie klann ich mit diesen informationen einen sensor bauen.
Danke für die Hilfe.
(wird noch ein weiterer sensor benötigt?)
update:
Entlädt - SOC 85.2% - 3h15min bis 7% - 18:45 Uhr - 2.49 kW
Lädt - SOC 29.1% - 2h00min bis 100% - 12:14 Uhr - 2.49 kW
template:
- sensor:
- name: "Batterie Restzeit"
unique_id: batterie_restzeit
state: >
{% set size = 7.5 %}
{% set soc = states('sensor.rct_power_storage_battery_state_of_charge') | float %}
{% set target = states('sensor.rct_power_storage_battery_state_of_charge_target') | float %}
{% set power = states('sensor.rct_power_storage_battery_power') | float %}
{% set e_now = size * soc / 100 %}
{% set e_target = size * target / 100 %}
{% set e_min = size * 0.07 %}
{% if power == 0 %}
Keine Lade-/Entladeleistung
{% else %}
{% if power | abs >= 1000 %}
{% set p_text = ((power | abs) / 1000) | round(2) ~ " kW" %}
{% set p_kw = (power | abs) / 1000 %}
{% else %}
{% set p_text = (power | abs) | round(0) ~ " W" %}
{% set p_kw = (power | abs) / 1000 %}
{% endif %}
{% if power < 0 %}
{# Laden #}
{% if soc >= target %}
Ziel SOC ({{ target | round(0) }}%) bereits erreicht.
{% else %}
{% set hours = (e_target - e_now) / p_kw %}
{% set total_minutes = (hours * 60) | round(0) %}
{% set h = (total_minutes // 60) | int %}
{% set m = (total_minutes % 60) | int %}
{% set finish = (now() + timedelta(hours=hours)) %}
Lädt - SOC {{ soc | round(1) }}% - {{ h }}h{{ '%02d'|format(m) }}min bis {{ target|round(0) }}% - {{ finish.strftime('%H:%M') }} Uhr - {{ p_text }}
{% endif %}
{% else %}
{# Entladen #}
{% if soc <= 7 %}
SOC {{ soc | round(1) }}% - Batterie fast leer
{% else %}
{% set hours = (e_now - e_min) / p_kw %}
{% set total_minutes = (hours * 60) | round(0) %}
{% set h = (total_minutes // 60) | int %}
{% set m = (total_minutes % 60) | int %}
{% set finish = (now() + timedelta(hours=hours)) %}
Entlädt - SOC {{ soc | round(1) }}% - {{ h }}h{{ '%02d'|format(m) }}min bis 7% - {{ finish.strftime('%H:%M') }} Uhr - {{ p_text }}
{% endif %}
{% endif %}
{% endif %}
icon: mdi:battery
unit_of_measurement: ""
Beispielausgaben
Lädt - SOC 29.1% - 2h00min bis 100% - 12:14 Uhr - 2.49 kW
Entlädt - SOC 85.2% - 3h15min bis 7% - 18:45 Uhr - 2.49 kW
SOC 7% - Batterie fast leer
Keine Lade-/Entladeleistung
Intelligenter Batterie-Sensor für Home Assistant
Ein erweiterter Template-Sensor mit Restlaufzeit, ETA & smarter Statuslogik
Viele Batteriespeicher liefern zwar Basisinformationen wie Ladezustand und Leistung, doch wirklich komfortables Monitoring fehlt oft. Genau dafür wurde dieser erweiterte Home-Assistant-Template-Sensor entwickelt.
Er analysiert das Verhalten des Speichers dynamisch, berechnet Lade- und Entladezeiten und filtert störende Kleinstleistungen unterhalb von ±5 Watt automatisch heraus.
Damit eignet sich der Sensor ideal für Automationen, PV-Dashboards und das smarte Energiemanagement im eigenen Zuhause.
Funktionen im Überblick
Präzise Erkennung von Batterie-Status
Minimale Leistungsfluktuationen werden ignoriert. Erst ab ±5 Watt gilt die Batterie als aktiv:
| Leistung |
Bedeutung |
| < –5 W |
Laden |
| > +5 W |
Entladen |
| –5 bis +5 W |
Standby |
Damit werden falsche Statuswechsel zuverlässig verhindert.
Berechnung der Restzeit
Der Sensor errechnet:
-
wie lange es dauert, bis die Batterie voll geladen ist
-
wie lange es dauert, bis sie auf die Entladegrenze fällt
Im Standby bleiben Restzeit und ETA nun bewusst leer, um eine bessere Übersicht zu gewährleisten.
ETA – Uhrzeit der Fertigstellung
Zusätzlich wird die Uhrzeit berechnet, zu der die Batterie – abhängig von Leistung und SoC – ihr Ziel erreicht.
Dynamische Icons
Icons passen sich automatisch an Ladezustand und Lade-/Entlademodus an (inkl. Charging-Icons).
Attribute für Automationen
Alle wichtigen Werte werden als Attribute gespeichert:
-
status
-
soc
-
restzeit
-
eta
-
leistung
Template-Sensor Code
template:
- sensor:
- name: "Batterie-restzeit"
unique_id: batterie-restzeit
state: >
{% set power = states('sensor.rct_power_storage_battery_power') | float(0) %}
{% if power | abs <= 5 %}Standby
{% elif power < -5 %}Lädt
{% else %}Entlädt
{% endif %}
icon: >
{% set soc = states('sensor.rct_power_storage_battery_state_of_charge') | float(0) %}
{% set power = states('sensor.rct_power_storage_battery_power') | float(0) %}
{% if power < -5 %}
{% if soc >= 95 %}mdi:battery-charging-100
{% elif soc >= 85 %}mdi:battery-charging-90
{% elif soc >= 65 %}mdi:battery-charging-70
{% elif soc >= 45 %}mdi:battery-charging-50
{% elif soc >= 25 %}mdi:battery-charging-30
{% elif soc >= 10 %}mdi:battery-charging-20
{% else %}mdi:battery-charging-outline
{% endif %}
{% elif power > 5 %}
{% if soc >= 95 %}mdi:battery
{% elif soc >= 85 %}mdi:battery-90
{% elif soc >= 65 %}mdi:battery-70
{% elif soc >= 45 %}mdi:battery-50
{% elif soc >= 25 %}mdi:battery-30
{% elif soc >= 10 %}mdi:battery-20
{% else %}mdi:battery-alert
{% endif %}
{% else %}
{% if soc >= 85 %}mdi:battery
{% elif soc >= 65 %}mdi:battery-70
{% elif soc >= 45 %}mdi:battery-50
{% elif soc >= 25 %}mdi:battery-30
{% elif soc >= 10 %}mdi:battery-20
{% else %}mdi:battery-outline
{% endif %}
{% endif %}
attributes:
status: >
{% set p = states('sensor.rct_power_storage_battery_power') | float(0) %}
{% if p | abs <= 5 %}Standby
{% elif p < -5 %}Lädt
{% else %}Entlädt
{% endif %}
soc: >
{{ states('sensor.rct_power_storage_battery_state_of_charge') | float(0) | round(1) }} %
restzeit: >
{% set p = states('sensor.rct_power_storage_battery_power') | float(0) %}
{% if p | abs <= 5 %}
{{ "" }}
{% else %}
{% set size = 7.5 %}
{% set soc = states('sensor.rct_power_storage_battery_state_of_charge') | float(0) %}
{% set target = states('sensor.rct_power_storage_battery_state_of_charge_target') | float(100) %}
{% if p < 0 %}
{% set e_diff = (target - soc) / 100 * size %}
{% else %}
{% set e_diff = (soc - 7) / 100 * size %}
{% endif %}
{% set hours = e_diff / (p | abs / 1000) %}
{% if hours > 0 %}
{% set mins = (hours * 60) | round(0) %}
{% set h = mins // 60 %}
{% set m = mins % 60 %}
{% if h > 0 %}{{ h }}h {{ "%02d"|format(m) }}min{% else %}{{ m }}min{% endif %}
{% else %}
Unbekannt
{% endif %}
{% endif %}
eta: >
{% set p = states('sensor.rct_power_storage_battery_power') | float(0) %}
{% if p | abs <= 5 %}
{{ "" }}
{% else %}
{% set size = 7.5 %}
{% set soc = states('sensor.rct_power_storage_battery_state_of_charge') | float(0) %}
{% set target = states('sensor.rct_power_storage_battery_state_of_charge_target') | float(100) %}
{% if p < 0 %}
{% set e_diff = (target - soc) / 100 * size %}
{% else %}
{% set e_diff = (soc - 7) / 100 * size %}
{% endif %}
{% set hours = e_diff / (p | abs / 1000) %}
{% if hours > 0 %}
{{ (now() + timedelta(hours=hours)).strftime("%H:%M") }} Uhr
{% else %}
Unbekannt
{% endif %}
{% endif %}
leistung: >
{% set p = states('sensor.rct_power_storage_battery_power') | float(0) %}
{% if p | abs >= 1000 %}
{{ (p | abs / 1000) | round(2) }} kW
{% else %}
{{ p | abs | round(0) }} W
{% endif %}