Dynamische Restlaufzeit-Berechnung Akku Anker Solix

Moin Gemeinde

jedes mobile Device zeigt dem User die verbleibende Akku-Laufzeit an, das wollte ich auch haben für den Anker Solix Akku.
Das Netz bietet ja so einiges. Na ja, ein echter Programmierer bin ich nicht, daher orientierte ich mich an diesem Beispiel, aber irgendwie fand ich das Ergebnis sub-optimal und etwas zu komliziert.
Im Endeffekt habe ich es für die Anker Solix Batterien nicht nur umgeschrieben, (denn ich habe teils immer negative Laufzeiten der restlichen Akku-Laufzeit erhalten, teils Tage in die Vergangenheit), sondern auch so modifiziert, das hoffentlich jemand auch damit etwas anfangen kann.

Benötigt werden:

  • Anker Solix Integration
  • die darin enthaltenen Sensoren Akku Leistung, Akku Energie und Ladestand sowie
  • drei neu anzulegende Template-Sensoren als Helfer

Grundlegend kann man sagen, das ich der folgende Formel folge:

Ladestand / 10 * Akku Energie durch Ausgangsleistung

Sensor 1: (Dieser macht die eigentliche Berechnung)
Name: Verbleibende Laufzeit Batterie raw
Masseinheit: h (Stunden)
Geräteklasse: Dauer
Yaml Code:

{% set ladestand = (float(states('sensor.solarbank_2_e1600_pro_ladestand'))) %}
  {% set akku_energie = (float(states('sensor.solarbank_2_e1600_pro_akkuenergie'))) %}
  {% set ausgangsleistung  = (float(states('sensor.solarbank_2_e1600_pro_dc_ausgangsleistung'))) %}
      {% if ladestand == 0 %}
      {% set runtime = 0 %}
      {% else %}
      {% set runtime = ladestand/10 * akku_energie / ausgangsleistung %}
      {% endif %}
      {{ runtime }}

Sensor 2:
Name: Verbleibende Laufzeit Batterie (Ausgabe in hh:mm)
Masseinheit: nichts angeben
Geräteklasse: nichts angeben
Yaml Code:

{% set runtime = states('sensor.anker_solix_verbleibende_laufzeit_batterie_raw') %}
      {% set hours = runtime | float %}
      {% set minutes = ((hours % 1) * 60) | int %}
      {% set hours = (hours - (hours % 1)) | int %}
      {{'%02i Std. : %02i Min.'%(hours, minutes) }}

Sensor 3:
Name: Anker Solix Batterie leer um (Ausgabe als Tag und Uhrzeit)
Masseinheit: nichts angeben
Geräteklasse: nichts angeben
Yaml Code:

{% set runtime = states('sensor.anker_solix_verbleibende_laufzeit_batterie_raw') %}
      {% set hours = runtime | float %}
      {% set minutes = ((hours % 1) * 60) | int %}
      {% set hours = (hours - (hours % 1)) | int %}
      {% set empty_at = now() + timedelta(hours = hours, minutes = minutes) %}
      {{ empty_at.strftime('%A %d %B %H:%M') }}

Ergebnis ist das so was in der Art:

Funktioniert ganz gut, ich habe aber keine Lösung für die englischen Angaben in Tagen, evtl. könnte mir da jemand einen Tipp geben, aus “Sunday” “Sonntag” und aus “May” “Mai” zu machen. Muss ich echt alle Tage und alle Monate “replacen” gegen deutsche Worte?

Gruß
Marcus

1 „Gefällt mir“

Kannst dir mal die Integration’Easy Time’ aus dem HACS Store angucken.
Damit könnte es gehen ohne alle zu replacen müsstes aber die templates dann anpassen.

Und ansonsten ja, muss man die wohl alle replacen. Wird langsam Zeit das es native in HA übersetzt. :slight_smile:

Da ich das für mein Dashboard schon in einer Konstelation habe, musst du nur an deinen Code anpassen:

{% set date = now().strftime('%A der %d. %B %Y') | replace("Monday",
"Montag") 
  | replace("Tuesday", "Dienstag") 
  | replace("Wednesday", "Mittwoch") 
  | replace("Thursday", "Donnerstag") 
  | replace("Friday", "Freitag") 
  | replace("Saturday", "Samstag") 
  | replace("Sunday", "Sonntag") 
  | replace("January", "Januar") 
  | replace("February", "Februar") 
  | replace("March", "März") 
  | replace("April", "April") 
  | replace("May", "Mai") 
  | replace("June", "Juni") 
  | replace("July", "Juli") 
  | replace("August", "August") 
  | replace("September", "September") 
  | replace("October", "Oktober") 
  | replace("November", "November") 
  | replace("December", "Dezember") %}

Eine kürzere Variante wäre


{% set weekdays = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'] %}
{% set months = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'] %}
{{ weekdays[empty_at.weekday()] ~ ' ' + empty_at.day ~ ' ' ~ months[empty_at.month -1] ~ ' ' ~ empty_at.strftime('%H:%M') }}

Auch nicht gerade hübsch, aber immerhin

Dieser Code geht auch :slight_smile:

Hab das auch mal ausprobiert und glaub ich hab das jetzt direkt durch gespielt. :sweat_smile:

Habe deine Formel mal etwas umgebaut, da die bei mir nicht plausible Werte zurückgegeben hatte. Ich beziehe jetzt auch die Kapazitäts-Entität und auch die Reserve-Prozent mit ein in die Berechnung, sodass es nicht nötig ist den Helfer anzupassen, sollte man die Reserve ändern oder die Akkupower erweitern.

Dazu das alles so zusammen gepackt, dass alles in einem Helfer erledigt wird.

Und als das dann lief, wollte ich noch die Information haben, wann der Akku voll geladen ist. Das ist dann auch mit eingegangen inkl. dem Fall, wenn die Powerbank weder Be- noch Entladen wird.

{% set akku_energie = (float(states('sensor.solarbank_3_e2700_pro_akkuenergie'))) %}
{% set akku_kapazitaet = (float(states('number.solarbank_3_e2700_pro_akku_kapazitat'))) %}
{% set akku_reserve = (float(states('select.solarbank_3_e2700_pro_ladestandreserve'))) %}
{% set ausgangsleistung  = (float(states('sensor.bkw_akku_ausgang'))) %} {# Batterieausgang Leistung in Watt / positiver Wert #}
{% set eingangsleistung  = (float(states('sensor.bkw_akku_eingang'))) %} {# Batterieeingang Leistung in Watt / positiver Wert #}
  {% if ausgangsleistung == 0 %}
  {% set runtime = 0 %}
  {% else %}
    {% set runtime = (akku_energie - (akku_kapazitaet * akku_reserve / 100)) / ausgangsleistung %}
      {% set hours = runtime | float %}
      {% set minutes = ((hours % 1) * 60) | int %}
      {% set hours = (hours - (hours % 1)) | int %}
      {% set empty_at = now() + timedelta(hours = hours, minutes = minutes) %}
      {% set weekdays = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'] %}
      {% set months = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'] %}
        Ist Entladen am {{  weekdays[empty_at.weekday()] ~ ' ' + empty_at.day ~ ' ' ~ months[empty_at.month -1] ~ ' ' ~ empty_at.strftime('%H:%M') }}
  {% endif %}
  {% if eingangsleistung == 0 %}
    {% set runtime = 0 %}
  {% else %}
    {% set runtime = (akku_kapazitaet - akku_energie) / eingangsleistung %}
    {% set hours = runtime | float %}
    {% set minutes = ((hours % 1) * 60) | int %}
    {% set hours = (hours - (hours % 1)) | int %}
    {% set full_at = now() + timedelta(hours = hours, minutes = minutes) %}
    {% set weekdays = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'] %}
    {% set months = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'] %}
      Ist Geladen am {{ weekdays[full_at.weekday()] ~ ' ' + full_at.day ~ ' ' ~ months[full_at.month -1] ~ ' ' ~ full_at.strftime('%H:%M') }}
  {% endif %}
  {% if eingangsleistung == 0 and ausgangsleistung == 0 %}
    {% set runtime = 'Wird nicht geladen oder entladen' %}
      {{ runtime }}
    {% endif %}

Somit hast du alle relevanten Informationen zu der Lade/Entladezeit in einem Helfer vereint.