Batterie ent / lade zeit RCT

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:
Lädt - SOC 29.1% - 2h00min bis 100% - 12:14 Uhr - 2.49 kW

  • Entlädt:
Entlädt - SOC 85.2% - 3h15min bis 7% - 18:45 Uhr - 2.49 kW

  • Batterie fast leer:
SOC 7% - Batterie fast leer

  • Keine Leistung:
Keine Lade-/Entladeleistung

:memo: 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.


:rocket: Funktionen im Überblick

:electric_plug: 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.

:hourglass_not_done: 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.

:three_o_clock: ETA – Uhrzeit der Fertigstellung

Zusätzlich wird die Uhrzeit berechnet, zu der die Batterie – abhängig von Leistung und SoC – ihr Ziel erreicht.

:artist_palette: Dynamische Icons

Icons passen sich automatisch an Ladezustand und Lade-/Entlademodus an (inkl. Charging-Icons).

:bar_chart: Attribute für Automationen

Alle wichtigen Werte werden als Attribute gespeichert:

  • status

  • soc

  • restzeit

  • eta

  • leistung


:package: 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 %}