Automation Wallbox Lade-Ende berechnen?

Ich bräuchte mal Hilfe, bzw. einen Ansatz wie ich folgende Automation erstelle.

Was ist der Zweck?
Sobald die Wallbox anfängt das E-Auto zu laden, soll überwacht werden bis der Akku zu 80% geladen ist und soll dann eine Meldung ausgeben.

Problem:
Leider kann ich den Ladestand aus der Wallbox oder Auto nicht abfragen, sondern muss errechnet werden.
Hierzu hab ich bereits Inputhelfer erstellt:

Kann man im Homeassistant das Ladezeit-Ende berechnen und wie wäre das möglich?

Hier ein Excel Beispiel:

2025-01-06 18_28_31-Twingo Ladezeit.xlsx - Excel

Trigger: Wallbox Status: lädt
Ab dann müsste die Uhrzeit Lade-Ende berechnet werden
Sobald Uhrzeit erreicht ist, Meldung ausgeben

Welche Berechnung hast Du in Excel für 70,8 hinterlegt?

Prozent nötig: Laden bis - Ladestand
KW nötig: Akku /100 * Prozent nötig
Zeit - Minuten: 60 / Ladeleistung * KW nötig
Zeit - Stunden: Zeit-Minuten / 24 / 60
Ende Laden: Start Zeit + Zeit-Stunden

Hier kommt schon einmal eine Markdown-Karte, die die entsprechenden Berechnungen enthält.

Screenshot 2025-01-06 211115

Hier der Code, der auch schon 80 % für die Umsetzung genommen werden kann.

Zusammenfassung
{# Hier sind Variablen mit den Werten aus der Tabelle gefüllt. Die berechnung erfolgt dynamisch.#}
{% set AkkusLeistung_kwh = 22 | float() %}
{% set Ladestand_pct = 21 | float() %}
{% set Ladeleistung_kw = 11 | float() %}
{% set Ladesgrenze_pct = 80 | int %}
{% set startzeit_uhr = now().strftime("%H:%M") %}
{% set ProzentNoetig_pct = Ladesgrenze_pct - Ladestand_pct %}
{% set KWNoetig_kw = (AkkusLeistung_kwh / 100 * ProzentNoetig_pct) | round(2) %}
{% set Zeit_Minuten_min = 60 / Ladeleistung_kw * KWNoetig_kw %}
{% set Zeit_Stunden_h = (Zeit_Minuten_min / 60) | round(2)  %}
{# Zerlege die Startzeit (aus now()) in Stunden und Minuten #}
{% set startzeit_stunden = now().hour %}
{% set startzeit_minuten = now().minute %}
{# Berechnung der gesamten Zeit in Minuten (Startzeit + Ladezeit) #}
{% set gesamt_minuten = startzeit_stunden * 60 + startzeit_minuten + Zeit_Minuten_min %}
{% set EndeLaden_stunden = (gesamt_minuten // 60) | int %}
{% set EndeLaden_minuten = (gesamt_minuten % 60) | int %}
{# Formatierung der Ende-Ladezeit in hh:mm Uhr #}
{% set EndeLaden_uhr = "%02d:%02d" | format(EndeLaden_stunden, EndeLaden_minuten) %}
{# Ausgabe der Ergebnisse #}
<table border=3>
<tr>
  <td colspan=2 width=200><b>Daten</b></td>
  <td colspan=2 width=200><b>Berechnung</b></td>
</tr>
<tr>
  <td>Akku</td>
  <td>{{AkkusLeistung_kwh}} kWh</td>
  <td>Prozent nötig</td>
  <td>{{ProzentNoetig_pct}} %</td>
</tr>
  <td>Ladestand</td>
  <td>{{Ladestand_pct}} %</td>
  <td>KW nötig</td>
  <td>{{KWNoetig_kw}} KW</td>
</tr>
</tr>
  <td>Ladeleistung</td>
  <td>{{Ladeleistung_kw}} KW</td>
  <td>Zeit-Minuten</td>
  <td>{{Zeit_Minuten_min}} Minuten</td>
</tr>
</tr>
  <td>Laden bis</td>
  <td>{{Ladesgrenze_pct}} %</td>
  <td>Zeit-Stunden</td>
  <td>{{Zeit_Stunden_h}} Stunden</td>
</tr>
</tr>
  <td>Startzeit</td>
  <td>{{startzeit_uhr}} Uhr</td>
  <td>Ende Laden</td>
  <td><font size=4 color=red><b>{{EndeLaden_uhr}} Uhr<b></font></td>
</tr>
</table>```

Was ich jetzt machen würde…

  • Über das UI einen Template Sensor anlegen
  • Anstelle mancher Variablen nimmst Du nicht die festen Werte sondern fragst den Status Deines Sensors ab, z.B. state('sensor.ladestand') | float(0)
  • Enhalten tut der Template Code einen IF Akku lädt = true THEN mache obige Berechnung und gebe als Result die Variable EndeLaden_uhr als Date-Objekt aus ELSE “Nicht verbunden”.
  • In der Automatisation nimmst Du das Dateobjekt und läßt Dich mit einem Timedelta von xxx Minuten zu now() vorher eine Message schicken.

Ich weiß, der letzte Teil ist nur abstrakt beschrieben, aber ich habe heute keine Lust mehr :wink:

Super - vielen, vielen Dank!

Ich versuche das jetzt nachzuvollziehen / zu verstehen.
(Da kommen bestimmt noch ein paar Fragen dazu :wink:)

Im ersten Schritt versuche ich erstmal die variablen Werte aus den Inputhelfer
in die Markdownkarte zu übernehmen.

Ich habe noch einmal darüber nachgedacht, was Du eigentlich willst und auch meinen gestrigen Ansatz zusammengestampft. Für eine Markdown Karte ist er gut aber für das eigentliche Ziel reicht eine solche Automatisation.

Funktionsweise:

  • Ein Sensor sagt, wann der Ladevorgang beginnt (Trigger1)
  • Daraufhin wird die benötigte Zeit in Sekunden berechnet und ein Timer mit dieser Dauer gestartet
  • Wenn der Timer ausläuft (Trigger 2), dann wird eine Benachrichtigung verschickt.
  • Den Timer kann man auf dem Dashboard auch schön visualisieren.

Hier der Code:

Zusammenfassung
alias: 1 test forum wallbox
description: ""
triggers:
  - trigger: state
    entity_id:
      - sensor.ladevorgang
    from: "off"
    to: "on"
    id: WallboxStartetLadevorgang
  - trigger: state
    entity_id:
      - timer.1_forum_wallbox
    from: active
    to: idle
    id: WallboxTimeLaeuftAus
conditions: []
actions:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - WallboxStartetLadevorgang
        sequence:
          - action: timer.start
            metadata: {}
            data:
              duration: >-
                {# Variablen / Sensoren #}
                {% set AkkusLeistung_kwh = 22 | float() %}
                {% set Ladestand_pct = 31 | float() %}
                {% set Ladeleistung_kw = 11 | float() %}
                {% set Ladesgrenze_pct = 80 | int %}
                
                {# Berechnung #}
                {% set ProzentNoetig_pct = Ladesgrenze_pct - Ladestand_pct %}
                {% set KWNoetig_kw = (AkkusLeistung_kwh / 100 * ProzentNoetig_pct) | round(2) %}
                {% set GeschaetzeLadezeit_sec = (60 / Ladeleistung_kw * KWNoetig_kw * 60) | round(0) %}
                
                {# Ausgabe in Sekunden #}
                {{GeschaetzeLadezeit_sec}}
              entity_id: timer.1_forum_wallbox
      - conditions:
          - condition: trigger
            id:
              - WallboxTimeLaeuftAus
        sequence:
          - action: notify.gmx
            metadata: {}
            data:
              title: 80 % der Auto Batterie ist geladen
              message: 80 % der Auto Batterie ist geladen
mode: single

Deine Sensoren mußt Du aber noch im Code übertragen sowohl als Trigger als auch im Templatecode. Und Du mußt einen entsprechenden Timer anlegen.

Gutes Gelingen!

Nochmal vielen Dank für deine Mühe!

Mir ist das mit dem Timer nicht so ganz klar. Die Zeit wird durch Code errechnet und dann gesetzt?

Ich habe lediglich den Timer wie folgt angelegt:

Hier nur der angepasste Code:

Zusammenfassung
alias: Wallbox Laden
description: ""
triggers:
  - trigger: state
    entity_id:
      - sensor.ehqak794_status
    to: charging
    id: WallboxStartetLadevorgang
    from: ready_to_charge
  - trigger: state
    entity_id:
      - timer.wallbox_timer
    from: active
    to: idle
    id: WallboxTimeLaeuftAus
conditions: []
actions:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - WallboxStartetLadevorgang
        sequence:
          - action: timer.start
            metadata: {}
            data:
              duration: >-
                {# Variablen / Sensoren #} {% set AkkusLeistung_kwh = 22 |
                float() %} {% set Ladestand_pct = 31 | float() %} {% set
                Ladeleistung_kw = 11 | float() %} {% set Ladesgrenze_pct = 80 |
                int %}

                {# Berechnung #} {% set ProzentNoetig_pct = Ladesgrenze_pct -
                Ladestand_pct %} {% set KWNoetig_kw = (AkkusLeistung_kwh / 100 *
                ProzentNoetig_pct) | round(2) %} {% set GeschaetzeLadezeit_sec =
                (60 / Ladeleistung_kw * KWNoetig_kw * 60) | round(0) %}

                {# Ausgabe in Sekunden #} {{GeschaetzeLadezeit_sec}}
              entity_id: timer.wallbox_timer
      - conditions:
          - condition: trigger
            id:
              - WallboxTimeLaeuftAus
        sequence:
          - action: notify.beko_gmail_com
            metadata: {}
            data:
              message: Wallbox - Laden fertig
mode: single

Wenn das grundsätzlich funktioniert, müssten dann nur die Werte aus den
Input Helfern übernommen werden.

Ja, das passiert unter

            data:
              duration: >-

Screenshot 2025-01-07 171343

Dies solltest Du aktivieren, damit der Timer erhalten bleibt, wenn HA neu gestartet wird.

Teste es doch einfach.

  1. Stecker rein → Trigger sollte losgehen
  2. Timer muß laufen (Entwicklerwerkzeuge)
  3. Beende den Timer manuell → Email sollte verschickt werden

Ja,

                {# Variablen / Sensoren #}
                {% set AkkusLeistung_kwh = 22 | float %}
                {% set Ladestand_pct = 31 | float %}
                {% set Ladeleistung_kw = 11 | float %}
                {% set Ladesgrenze_pct = 80 | int %}

Vergiß nicht das | float hinter dem Sensor.

Ich bin gespannt.

Ich bin begeistert - Hat alles geklappt!

  • Werte aus den Inputhelfern werden übernommen
  • Timer wurde mit dem korrekten Wert gestartet
  • Nach Ablauf des Timers wurde die E-Mail versandt

1000 Dank an @Bacardi

1 „Gefällt mir“

Ich bräuchte nochmal Hilfe.
Ich würde gerne mir zusätzlich über die Markdown Karte die tatsächliche Startzeit aus der Automation und die Uhrzeit für das Lade Ende anzeigen lassen.

Die Startzeit kommt über einen Zeitpunkt Eingabe Helfer, nur mit der Uhrzeit
Lade Ende habe ich Schwierigkeiten. Viel probiert, aber nichts funktioniert.

Wie ist der Syntax für Start Uhrzeit + Dauer in Minuten = Uhrzeit Lade Ende?

Aktueller Code:

Zusammenfassung
{% set AkkusLeistung_kwh = states('input_number.akku_gesamt_kw') | float() %}
{% set Ladestand_pct = states('input_number.akku_ladestand_von') | float() %}
{% set Ladeleistung_kw = states('input_number.akku_ladeleistung') | float() %}
{% set Ladesgrenze_pct = states('input_number.akku_ladestand_bis') | int %}
{% set startzeit_uhr = states('input_datetime.akku_laden_start_uhrzeit') %}
{% set ProzentNoetig_pct = Ladesgrenze_pct - Ladestand_pct %}
{% set KWNoetig_kw = (AkkusLeistung_kwh / 100 * ProzentNoetig_pct) | round(2) %}
{% set Zeit_Minuten_min = 60 / Ladeleistung_kw * KWNoetig_kw %}
{% set Zeit_Stunden_h = (Zeit_Minuten_min / 60) | round(2)  %}
{# Zerlege die Startzeit (aus now()) in Stunden und Minuten #}
{% set startzeit_stunden = now().hour %}
{% set startzeit_minuten = now().minute %}
{# Berechnung der gesamten Zeit in Minuten (Startzeit + Ladezeit) #}
{% set gesamt_minuten = startzeit_stunden * 60 + startzeit_minuten + Zeit_Minuten_min %}
{% set EndeLaden_stunden = (gesamt_minuten // 60) | int %}
{% set EndeLaden_minuten = (gesamt_minuten % 60) | int %}
{# Formatierung der Ende-Ladezeit in hh:mm Uhr #}
{% set EndeLaden_uhr = "%02d:%02d" | format(EndeLaden_stunden, EndeLaden_minuten) %}
{# Ausgabe der Ergebnisse #}
<table border=3>
<tr>
  <td colspan=2 width=200><b>Daten</b></td>
  <td colspan=2 width=200><b>Berechnung</b></td>
</tr>
<tr>
  <td>Akku</td>
  <td>{{AkkusLeistung_kwh}} kWh</td>
  <td>Prozent nötig</td>
  <td>{{ProzentNoetig_pct}} %</td>
</tr>
  <td>Ladestand</td>
  <td>{{Ladestand_pct}} %</td>
  <td>KW nötig</td>
  <td>{{KWNoetig_kw}} KW</td>
</tr>
</tr>
  <td>Ladeleistung</td>
  <td>{{Ladeleistung_kw}} KW</td>
  <td>Zeit-Minuten</td>
  <td>{{Zeit_Minuten_min}} Minuten</td>
</tr>
</tr>
  <td>Laden bis</td>
  <td>{{Ladesgrenze_pct}} %</td>
  <td>Zeit-Stunden</td>
  <td>{{Zeit_Stunden_h}} Stunden</td>
</tr>
</tr>
  <td>Startzeit</td>
  <td>{{startzeit_uhr}} Uhr</td>
  <td><font color=red><b>Ende Laden</td>
  <td><font color=red><b>{{EndeLaden_uhr}} Uhr<b></font></td>
</tr>
</table>

Test-Dashboard:

Ersetze im Code diese Zeilen

{# Zerlege die Startzeit (aus now()) in Stunden und Minuten #}
{% set startzeit_stunden = now().hour %}
{% set startzeit_minuten = now().minute %}

Durch

{# Zerlege meinen Input_datetime Helfer in Stunden und Minuten #}
{% set startzeit = states('input_datetime.test') %}
{% set startzeit_obj = strptime(startzeit, '%Y-%m-%d %H:%M:%S') %}
{% set startzeit_stunden = startzeit_obj.hour %}
{% set startzeit_minuten = startzeit_obj.minute %}

Und input_datetime.test mußt Du durch input_datetime.mein_name ersetzen.

Die Berechnung der Endzeit bezieht dann nicht mehr auf now() = jetzt sondern ab dem Startdatum in Deinem input_datetime Helfer.

EDIT
Ein Schönheitsfehler bei der Anzeige der Minuten sehe ich gerade. Wozu Kommawerte?

Ersetze

{% set Zeit_Minuten_min = 60 / Ladeleistung_kw * KWNoetig_kw %}

durch

{% set Zeit_Minuten_min = (60 / Ladeleistung_kw * KWNoetig_kw) | round(0) %}
1 „Gefällt mir“

Ich habe eine Verständnisfrage: Wenn Du nicht weißt, wie der Ladestand ist, also auch nicht beim Start des Ladevorgangs, wie willst Du denn dann die Ladezeit berechnen?

LG Pit

Hallo Pit,

den Ladestand vor dem Laden muss ich natürlich im Auto nachsehen und über den Input Helfer eingeben.

Hintergrund des Ganzen ist, dass beim e-Twingo es keine Option gibt, das Laden bei einem bestimmten Ladestand zu beenden.

Dann kommt noch dazu, das die Renault App selten funktioniert, um zumindest den Ladestand live verfolgen zu können.

Bei dieser Automation muss eigentlich nur der Akkustand vor dem Laden
erfasst werden, wenn der Ziel-Ladestand immer z.B. bei 80% bleibt.

image

Vielen Dank für die Rückmeldung!

Das funktioniert leider nicht. Liegt das vielleicht am Format vom Helfer?

In meinem Testhelfer hatte ich Datum und Uhrzeit.
Bleibst Du bei nur Uhrzeit? Dann passe ich nochmal an.

EDIT
Das wäre dann die neue Zeile

{% set startzeit_obj = strptime(startzeit, '%H:%M:%S') %}

Hallo beko,

achso, so ein ähnliches Problem habe ich auch. Im Auto kann man nur den minimalen Soc einstellen, bis zu dem geladen wird (50%), aber keine Obergrenze.

Ich muß immer schätzen, wieviel noch bis 80 oder 90 % fehlt, die Anzahl der kWh kann ich dann in der Wallbox als Ladeziel eingeben.

LG Pit

Top - funktioniert - vielen Dank!

Habe dadurch wieder viel gelernt.
Ich muss mich aber in YAML noch viel weiter einarbeiten…

Gruß
beko

Ich auch :slight_smile: