Dashboard: Restladezeit Hausbatterie

Hallo in die Runde
Eigentlich wollte ich das als Frage stellen, aber im Verlauf des Schreibens bin ich selbst drauf gekommen. Vielleicht ist es auch für andere hilfreich. Daher teile ich es einfach mal. Evtl. gibt es ja auch einen eleganteren Weg oder Verbesserungsvorschläge.

Worum geht es?
Ich habe in meinem Dashboard Werte für den Ladestand meiner Hausbatterie und für den Ladestrom. Dazu hätte ich gerne eine Ansage, wie die voraussichtliche Restladezeit ist.

Das sieht jetzt so aus:
image

Die Batterie hat 13kW. Also sind 1% = 130W
Der Ladestrom ist zwischen 0 und 4.500W.
Wenn die Batterie entlädt, ist der Ladestrom minus.
Hier wüsste ich natürlich auch gerne, wie lange die Batterie beim gegenwärtigen Verbrauch noch halten würde.

In YAML:

{% if float(states('sensor.e3dc_battery_power')) <= 0 %}
  {{ (((float(states('sensor.e3dc_battery_state_of_charge')) ) * 130) / (float(states('sensor.e3dc_battery_power')))) | round(0) }} h
{% elif float(states('sensor.e3dc_battery_state_of_charge')) <= 70 %}
{{ (((100 - (float(states('sensor.e3dc_battery_state_of_charge'))) ) * 130) / (float(states('sensor.e3dc_battery_power'))))   | round(0) }} h
  {% else %}
{{ ((((100 - (float(states('sensor.e3dc_battery_state_of_charge'))) ) * 130) / (float(states('sensor.e3dc_battery_power')))) * 60)   | round(0) }} min
{% endif %}

Übersetzt:
Wenn die Batterieleistung weniger als 0 ist (also entlädt), dann nehme den aktuellen Prozentstand * 130W und teile es durch die Entladeleistung.
Ansonsten (wenn sie lädt): Nehme die fehlenden Prozent (100 - aktueller Stand) * 130W und teile das durch die aktuelle Ladeleistung.
Hier noch eine Unterscheidung: Bei weniger als 70% Ladung reicht mir die Angabe in Stunden, danach in Minuten.

Die Icon-Farbe ist rot oder grün, je nach Zustand (laden/entladen):

{{ (states("sensor.e3dc_battery_power") | float(0) < 0) | iif("red", "green") }}

Und als Zusatzinfo habe ich noch den Ladestand in kW (statt in Prozent).

{{ (float(states('sensor.e3dc_battery_state_of_charge')) * 0.130) | round(1) }} kW

Sicher gibt es da noch Potenzial. Die Restzeit schwankt natürlich, da immer gerade der aktuelle Ladestand abgefragt wird. Genauer wäre es z.B. wenn man einen 2- oder 5-Minuten Durchschnitt nähme (über einen Helfer)? Aber das übersteigt dann meine Fähigkeiten.

Beste Grüße,
clfberlin

1 „Gefällt mir“

Um mir selbst zu antworten:
Mit einem Helfer > Statistics > Median geht es dann doch sehr einfach.
Ich habe den Durchschnitt der letzten 20 Wertänderungen bzw. max 4 Minuten eingestellt.
Mit dem Sensor, den der Helfer erzeugt, habe ich dann im obigen YAML alle ‘sensor.e3dc_battery_power’ ersetzt. Den ersten ‘sensor.e3dc_battery_power’ wollte ich ursprünglich beibehalten, damit ich in der Ansicht sofort einen Wechsel von Laden/Entladen sehe. Aber das würde neue Baustellen eröffnen. Dann lieber etwas träger, dafür verlässlicher.

Bitte nicht immer kW und kWh durcheinander bringen :see_no_evil:

Hast du so einen konstanten Verbrauch das der Wert der Restladezeit überhaupt aussagekräftig ist?

Die Leistung nimmt natürlich mal zu und mal ab. Aber als Tendenz passt es. Ich habe zwei Situationen, in denen das für mich relevant ist:

  • Wenn die Batterie geladen hat, habe ich meist noch ausreichend Saft, um den Wagen zu laden. So sehe ich, wann der Wagen dran ist.
  • Wenn die PV nicht mehr produziert, sehe ich schon, ob wir mit der Batterie gut über die Nacht kommen (und vielleicht auch noch eine Wäscheladung drin ist).
    Ich habe beides sonst immer schnell im Kopf überschlagen. So ist das eine simple Hilfe.

Wird die letzte Probe des Mediansensors aufbewahrt?

Hab eine Code gebaut der mir die Uhrzeit anzeigt wenn die Batterie eine Füllstand von 3% erreichen wird. Für die Ent-/Beladung hab ich seperate Sensoren:

- platform: template
    sensors:
      battery_remaining_time:
        friendly_name: "Batterie Restlaufzeit"
        
        value_template: >-
          {% set battery_level = states('sensor.median_varta') | float %}
          {% set max_capacity = 18 %}
          {% set charge_power = states('sensor.varta_input_power') | float %}
          {% set discharge_power = states('sensor.varta_output_power') | float %}
          
          {% if discharge_power > 0 and battery_level > 3 %}
            {% set current_capacity = (battery_level / 100) * max_capacity %}
            {% set capacity_to_3_percent = current_capacity - (0.03 * max_capacity) %}
            {% set time_to_3_percent = (capacity_to_3_percent / (discharge_power / 1000)) %}
            {% set end_time = (now() + timedelta(hours=time_to_3_percent)).strftime('%H:%M') %}
            {{ end_time }}
          {% elif battery_level <= 3 %}
            Bereits unter 3%
          {% else %}
            Keine Entladung
          {% endif %}
1 „Gefällt mir“

Ok, bei mir habe ich keine gesonderten Entitäten für Laden und Entladen. ‘e3dc_battery_power’ ist entweder + (Laden) oder - (Entladen). Daher steht im Skript als erste Frage: Wenn kleiner/gleich Null, dann mach dies - und ansonsten mach jenes.
Du hast als erstes nicht die Frage gestellt, ob geladen oder entladen wird, sondern ob der Batteriestand <= 0 ist.

Probier mal bitte

{% if float(states('sensor.varta_output_power')) > 0 %}
  {{ (((float(states('sensor.mb_varta_soc')) ) * 180) / (float(states('sensor.varta_output_power')))) | round(0) }} h
{% elif float(states('sensor.mb_varta_soc')) <= 70 %}
{{ (((100 - (float(states('mb_varta_soc'))) ) * 180) / (float(states('sensor.varta_input_power'))))   | round(0) }} h
  {% else %}
{{ ((((100 - (float(states('sensor.mb_varta_soc'))) ) * 180) / (float(states('sensor.varta_input_power')))) * 60)   | round(0) }} min
{% endif %}

In Worten: Wenn Deine Batterie entlädt (Output Power > 0), dann nimm den derzeitigen Stand (soc) mal 180 (Watt) und teile das durch den Ladewert.
Beispiel: Batteriestand ist 40% * 180 ist 7.200. Also Dein derzeitiger Ladestand. Du verbrauchst gerade 500W. 7.200/500=14,4.Du hättest bei diesem Verbrauch (gerundet) noch etwa 14h Strom.

Nächster Abschnitt: Wenn die Batterie nicht entlädt (und demnach nichts macht oder auflädt). Dann interessiert das Skript, wann die Batterie in etwa voll sein wird. Und zwar in Stunden, wenn der Ladestand noch unter 70% ist, aber in Minuten, wenn der volle Ladestand abbsehbar ist. Demnach schauen wir hier auf den Input-Sensor und rechnen wie oben.

Ich habe tatsächlich nachträglich einen Mittelwert-Helfer eingesetzt, damit er bei schwankender Ladeleistung (oder Entladeleistung) nicht großartig rumspringt. Aber probier am besten erstmal die Funktion, bevor die Feinarbeit kommt.

Ah, jetzt hattest Du den anderen Beitrag gelöscht, auf den ich mich eigentlich beziehe. Den neuen Code kann ich mir leider erst morgen anschauen… ^^

Und wie verhält er sich in der Praxis? Passt?
Frage: Warum nutzt Du für den Ladestand einen Mittelwert? Der ist doch recht stabil. Ich nutze den Mittelwert für die aktuelle Lade-/Entlade-Leistung, weil die stärker schwankt.

:crayon:by HarryP: Zusammenführung Mehrfachposting

Stimmt, Mittelwert für die Lade-/Entladeleistung ist natürlich besser.

Die Zeit springt aber trotzdem noch sehr…vorallem jetzt in der früh wenn
a) bei Dunkelheit der Hausverbrauch gegenüber der Nacht ansteigt
b) Wenn die PV Produktion anspringt und trotzdem noch Entladung aus der Batterie erfolgt

Wie könnte man diesen Verlauf der erwarteten Restlauf-Uhrzeit in Form einer Kurve darstellen?
grafik

Ihr solltet auch immer noch den Eigenverbrauch der Anlage mit ca. 140W beachten. Da kommt oft auch schnell noch was zusammen

1 „Gefällt mir“

wie kommt man auf den Eigenverbrauch?

Indem du mal den Prozentsatz vom SOC anschaust und was an Entladeleistung fließt. Am besten in der Nacht mal zwischen 0 Uhr und morgens 6 Uhr schauen. Über die Entladeleistung ein Riemansches Summenintegral machen, damit man die Entladeenergie hat. Wenn dann bei einer z.B. 10kWh Batterie der SOC von 80% auf 40% abgenommen hat, man aber an Entladeenergie nur 3kWh in der Zeit hatte, sind 1kWh wohl irgendwo im System stecken geblieben → 1kWh/6h = 167W