Anker Solix 2 Pro, Dynamische umschaltung der Solareinspeisung

Hallo zusammen,
ich wollte mal kurz meine Automatisierung vorstellen, die ich für Home Assistant erstellt habe.
Seit Mitte März benutze ich die Anker Solix 2 Pro mit einem Erweiterungsakku und Smart Meter.
Was mich bisher am Smart Meter gestört hat, ist die Tatsache, dass, solange Leistung gebraucht wird, die vollen 800 Watt eingespeist werden.
Wenn jedoch ein schlechter Tag ist und keine 800 Watt Solarleistung erbracht werden, wird der Akku erst geladen und dann wieder entladen.
Da man ja die bekannte Verlustleistung beim Laden und Entladen hat, kommt folgende Automation ins Spiel:
Der Modus steht auf manuell. Alle 5 Minuten wird die Gesamtsolarleistung abgefragt und dementsprechend die Ausgabeleistung angepasst.
Diese Regelung gilt von 10 Watt bis 800 Watt.
Natürlich wird dies erst ausgeführt, wenn die Akkuleistung 12 % beträgt.
Zusätzlich ist hinterlegt, dass bei über 800 Watt Leistung der Modus von manuell auf Smart Meter gewechselt wird und das gleiche wieder zurückgeschaltet wird, wenn die Solarleistung auf 700 Watt fällt.
Soweit, so gut! Was haltet ihr von der Idee und der Umsetzung? Habt ihr eventuell Verbesserungsvorschläge?

Hier die yaml fals jemand interesse hat.

alias: Dynamische Umschaltung des Benutzermodus basierend auf Solarleistung
description: ""
triggers:
  - entity_id: sensor.solarbank_2_e1600_pro_solarleistung
    trigger: state
conditions:
  - condition: numeric_state
    entity_id: sensor.solarbank_2_e1600_pro_ladestand
    above: 12
actions:
  - choose:
      - conditions:
          - condition: numeric_state
            entity_id: sensor.solarbank_2_e1600_pro_solarleistung
            above: 800
        sequence:
          - target:
              entity_id: select.solarbank_2_e1600_pro_benutzermodus
            data:
              option: smartmeter
            action: select.select_option
      - conditions:
          - condition: numeric_state
            entity_id: sensor.solarbank_2_e1600_pro_solarleistung
            below: 700
        sequence:
          - target:
              entity_id: select.solarbank_2_e1600_pro_benutzermodus
            data:
              option: manual
            action: select.select_option
  - target:
      entity_id: number.solarbank_2_e1600_pro_system_einspeisevorgabe
    data:
      value: >
        {% set solarleistung =
        states('sensor.solarbank_2_e1600_pro_solarleistung') | float %} {% if
        solarleistung < 10 %}
          0.0
        {% else %}
          {{ ([((solarleistung / 10) | round(0)) * 10, 800] | min) | float }}
        {% endif %}
    action: number.set_value
  - delay: "00:05:00"
  - condition: template
    value_template: >
      {% set solarleistung =
      states('sensor.solarbank_2_e1600_pro_solarleistung') | float %} {% set
      vorgabe = states('number.solarbank_2_e1600_pro_system_einspeisevorgabe') |
      float %} {{ vorgabe == [((solarleistung / 10) | round(0)) * 10, 800] | min
      }}
  - choose:
      - conditions:
          - condition: template
            value_template: >
              {% set vorgabe =
              states('number.solarbank_2_e1600_pro_system_einspeisevorgabe') |
              float %} {% set solarleistung =
              states('sensor.solarbank_2_e1600_pro_solarleistung') | float %} {{
              vorgabe != [((solarleistung / 10) | round(0)) * 10, 800] | min }}
        sequence:
          - target:
              entity_id: number.solarbank_2_e1600_pro_system_einspeisevorgabe
            data:
              value: >
                {% set solarleistung =
                states('sensor.solarbank_2_e1600_pro_solarleistung') | float %}
                {% if solarleistung < 10 %}
                  0
                {% elif solarleistung >= 10 %}
                  {{ [((solarleistung / 10) | round(0)) * 10, 800] | min }}
                {% endif %}
            action: number.set_value

3 „Gefällt mir“

Leider bin ich zu müde, aber eigentlich adressierst Du einen wichtigen Punkt, hätte ich (selbes Setting wie Du) gesagt. Funzt es denn? Wat sacht die Praxis?

Hallo Schnipsi,
das Script funktioniert meiner meinung nach ausgezeichnet.
Habe hier und da noch ein wenig optimiert und bin im großen und ganzen ganz zufrieden.
Aktuell wird 50 Watt weniger eingespeist als Solarerzeugung vorhanden ist, ausser es sind volle 800 Watt Solarleistung vorhanden.
Legende:
Grün=Solarleistung
Gelb=Einspeiseleistung

Hallo Icebreaker01,

wo genau hast du deinen Code eingefügt? In die configuration.yaml ?

edit: hab es selber “gefunden” einfach neue Automation anlegen und den Code von Icebreaker per Yaml einfügen …ich teste..

Super Sache und habe nur meine Entities angepasst, aber ich habe hier die Fehlermeldung:

< In ‘template’ condition: ValueError: Template error: float got invalid input ‘unknown’ when rendering template ‘{% set solarleistung = states(‘sensor.solarbank_3_e2700_pro_solarleistung’) | float %} {% set vorgabe = states(‘number.solarbank_3_e2700_pro_system_einspeisevorgabe’) | float %} {{ vorgabe == \[((solarleistung / 10) | round(0)) \* 10, 800\] | min }}’ but no default was specified./>

Vielleicht hat jemand eine Idee und kann mir hier den fehlenden default Wert dieser Automation ergänzen?? Ich bin einfach zu bl…d… Danke und freue mich über jede konstruktive Rückmeldung. BG Leeze

:crayon:by HarryP: Code-/Logzeilen formatiert (bitte immer in </> einbinden)
s.a.: ( Neues Update & Features - Hier in der Community 🫶 )

@icebreaker01 was hat du denn genau angepasst? Vielleicht hilft mir das und anderen auch und die Automation funktioniert noch besser… Danke und Grüße Leute

Hi Leuts. Ich wolte das Thema Solix und Automation nochmal aufgreifen.Mein Zähler dreht noch Rückwärts, also nicht wundern, dass ich gar nicht mit dem Modus Eigenverbrauch arbeite. Vielleicht hat ja jemand Anmerkungen oder Vorschläge zu meiner Automation. Auch Kritik ist gern gesehen, wenn sie konstruktiv ist.

alias: Solar Automation
description: >
  Automatische Entladung ab 15:00 Uhr mit Zielzeit 23:00. Mit Wintermodus
  Restspeicher über Helfer. Wenn SoC > Reserve + 15 %, immer 800W.
triggers:
  - trigger: state
    entity_id:
      - sensor.solarbank_2_e1600_pro_solarleistung
      - sensor.solarbank_2_e1600_pro_ladestand
      - sensor.system_solar_sb_datenzeit
conditions:
  - condition: state
    entity_id: select.solarbank_2_e1600_pro_benutzermodus
    state: manual
  - condition: state
    entity_id: input_boolean.laderegelung
    state: "on"
actions:
  - variables:
      soc: "{{ states('sensor.solarbank_2_e1600_pro_ladestand') | float(0) }}"
      pv_power: "{{ states('sensor.solarbank_2_e1600_pro_solarleistung') | float(0) }}"
      battery_capacity_wh: 3200
      minutes_left: "{{ ((today_at('23:30') - now()).total_seconds() / 60) | float(0) }}"
      winter_mode: "{{ is_state('input_boolean.wintermodus','on') }}"
      slider_soc_min: "{{ states('input_number.solar_soc_min') | float(0) }}"
      device_soc_reserve: >-
        {{ states('select.solarbank_2_e1600_pro_ladestandreserve') |
        replace('%','') | float(0) }}
      soc_reserve: |
        {% if winter_mode %}
          {{ slider_soc_min }}
        {% else %}
          {{ device_soc_reserve }}
        {% endif %}
      energy_available_wh: >-
        {{ ((soc - soc_reserve) * battery_capacity_wh / 100) if ((soc -
        soc_reserve) * battery_capacity_wh / 100) > 0 else 0 }}
  - choose:
      - conditions:
          - condition: state
            entity_id: input_boolean.solar_speicher_100_force
            state: "on"
        sequence:
          - action: number.set_value
            target:
              entity_id: number.solarbank_2_e1600_pro_system_einspeisevorgabe
            data:
              value: 0
          - condition: template
            value_template: "{{ soc >= 100 }}"
          - action: input_boolean.turn_off
            target:
              entity_id: input_boolean.solar_speicher_100_force
      - conditions:
          - condition: template
            value_template: "{{ soc > (soc_reserve + 15) }}"
        sequence:
          - action: number.set_value
            target:
              entity_id: number.solarbank_2_e1600_pro_system_einspeisevorgabe
            data:
              value: 800
      - conditions:
          - condition: template
            value_template: "{{ now().hour >= 15 }}"
        sequence:
          - variables:
              target_power: |
                {% if soc <= soc_reserve %}
                  0
                {% elif minutes_left <= 0 %}
                  0
                {% elif minutes_left > 90 %}
                  {{ (energy_available_wh / minutes_left) * 60 }}
                {% else %}
                  100
                {% endif %}
              pre: >
                {% set tp = target_power | float | round(0) %} {% set pv =
                pv_power | float %} {{ [ [tp, pv] | max, 800 ] | min }}
              target_output: "{{ 0 if (pre | float) < 50 else (pre | float) }}"
          - action: number.set_value
            target:
              entity_id: number.solarbank_2_e1600_pro_system_einspeisevorgabe
            data:
              value: "{{ target_output }}"
      - conditions: []
        sequence:
          - variables:
              max_output: |
                {% if soc > (soc_reserve + 6) %}
                  800
                {% elif soc > (soc_reserve + 4) %}
                  600
                {% elif soc > (soc_reserve + 2) %}
                  400
                {% else %}
                  200
                {% endif %}
              pv_based_output: |
                {% if soc < (soc_reserve + 5) %}
                  {{ pv_power * 0.5 }}
                {% else %}
                  {{ pv_power }}
                {% endif %}
              pre: >
                {% set pvb = pv_based_output | float %} {% set mo  = max_output
                | float %} {{ [pvb, mo] | min }}
              target_output: "{{ 0 if (pre | float) < 50 else (pre | float | round(0)) }}"
          - action: number.set_value
            target:
              entity_id: number.solarbank_2_e1600_pro_system_einspeisevorgabe
            data:
              value: "{{ target_output }}"
mode: restart