Praxisnahe Tutorials, auf die du zählen kannst.
Einsteiger Guide für Home Assistant

Anker Solix – Home Assistant Energiedashboard & Steuerung

In diesem Video erkläre ich dir die Steuerung des Anker Solix Systems über Home Assistant und die Einrichtung im Energiedashboard.

Es hat zwar ewig gedauert und es wird leider relativ komplex, aber ich hoffe im Video kommt es verständlich rüber und auch du kannst deine Anker-Geräte in Home Assistant einrichten 🎉

Inhaltsverzeichnis

Voraussetzungen

  1. Grundlagen sollte bekannt sein und für die Integration benötigst du HACS
  2. Integration: https://github.com/thomluther/hacs-anker-solix
  3. Und natürlich brauchst du eine Anker Solix*, die neueren Pro-Varianten* werden (noch) nicht unterstützt. Schau hier gerne auf der GitHub-Seite nach Updates, falls ich nicht dazu komme, diesen Beitrag zu aktualisieren 😉

Energiedashboard (Voraussetzungen)

  1. Außerdem muss bekannt sein, wie viele Kilowattstunden du zurück ins Netz lieferst. Dies geht entweder über einen 2-Richtungszähler und die Anbindung über einen SML-Lesekopf, oder ein Template wie ich es in meinem Balkonsolar-Video erklärt habe und ist für die anzeige korrekter Werte im Energiedashboard erforderlich

Automation (Voraussetzungen)

  1. Für die Automation zur “Nulleinspeisung” musst du ebenfalls deinen Zähler auslesen oder einen Shelly 3 EM nutzen, um eine Entität zu haben, wie viel Watt du aus dem Stromnetz beziehst (100 Watt) oder einspeist (-100 Watt).
  2. Außerdem sollte hierfür eine Mess-Steckdose an der Anker Solix angeschlossen sein, damit du in Echtzeit weißt, was die Anlage einspeißt (Diese Echtzeit-Werte passen dann auch zum Stromzähler, die API ist dafür zu langsam)

Code

Energiedashboard

Codes für Templates und Helfer

Aufgrund der einfacheren Kopierbarkeit habe ich mich entschieden, dir hier alle Helfer, Templates usw. wo immer möglich als Code-Snippets zur Verfügung zu stellen.

Tipp zum übernehmen: Füge den Code erstmal in einen Texteditor ein und ersetze dann über die Funktion “Suchen & Ersetzen” in deinem Programm meine durch deine Entitäten und entferne ggf. den jeweiligen Code zur 2ten Solarbank, solltest du nur eine besitzen.

Dieser Code gehört natürlich in deine configuration.yaml & solltest du bereits einen der Abschnitte haben, wie z.B. template:, musst du dort den Code ergänzen und nicht template: doppelt einfügen!

utility_meter:
  solarbank_e1600_1_battery_energy:
    name: "Solarbank E1600 1 - Battery Energy"
    source: sensor.solarbank_e1600_akkuenergie
    net_consumption : true
    tariffs:
      - "charge"
      - "discharge"
  solarbank_e1600_2_battery_energy:
    name: "Solarbank E1600 2 - Battery Energy"
    source: sensor.solarbank_e1600_akkuenergie_2
    net_consumption : true
    tariffs:
      - "charge"
      - "discharge"

template:
  - sensor:
    # ------- ANKER Solix -------
    # Summiert die Entladewerte der Verbrauchszähler und kann direkt im Energiedashbaord verwendet werden (wir sparen uns einen Helfer aus dem Video)
      - name: "Solarbank E1600 1 & 2 - Battery Energy charge total (Energiedashboard)"
        unique_id: "SolarbankE160012BatteryEnergychargetotal"
        icon: mdi:transmission-tower
        unit_of_measurement: Wh
        device_class: energy
        state_class: total_increasing
        state: "{{ ( float(states('sensor.solarbank_e1600_1_battery_energy_charge')) + float(states('sensor.solarbank_e1600_2_battery_energy_charge')) ) | float }}"
    # Summiert die Ladewerte der Verbrauchszähler und kann direkt im Energiedashbaord verwendet werden (wir sparen uns einen Helfer aus dem Video)
      - name: "Solarbank E1600 1 & 2 - Battery Energy discharge total (Energiedashboard - positive Werte)"
        unique_id: "SolarbankE160012BatteryEnergydischargetotal"
        icon: mdi:transmission-tower
        unit_of_measurement: Wh
        device_class: energy
        state_class: total_increasing
        state: "{{ ( float(states('sensor.solarbank_e1600_1_battery_energy_discharge')) + float(states('sensor.solarbank_e1600_2_battery_energy_discharge')) ) * -1 | float }}"
    # Zieht von der erzeugten Energie der Solarbank die energie, die in die Akkus fließt ab erstellzeitpunkt ab. Insofern enthält das Delta ab Erstellzeitpunkt die Solar-Produktion der Anlage (welche auch eingespeist wird)
      - name: "Anker Dual E1600 System - Solarertrag Energiedashboard seit 14.07.2024"
        unique_id: "ankerduale1600systemsolarertragenergiedashboard"
        icon: mdi:transmission-tower
        unit_of_measurement: kWh
        device_class: energy
        state_class: total_increasing
        state: "{{ ( states('sensor.system_anker_dual_e1600_ertrag_gesamt') | float(0) - (states('sensor.solarbank_e1600_1_2_battery_energy_charge_total_energiedashboard') | float(0) / 1000 ) ) }}"

Ggf. Auszutauschende Entitäts-IDs:

sensor.system_anker_dual_e1600_ertrag_gesamtGesamtertrags-Entität am Anker Solix System
sensor.solarbank_e1600_akkuenergieAkkuenergie (Wh) am Anker Solix Solarbank-Gerät
sensor.solarbank_e1600_akkuenergie_2Akkuenergie (Wh) am 2ten Anker Solix Solarbank-Gerät

Automation zum umschalten der Verbrauchzähler

Wenn du eine neue Automation erstellst und diese oben rechts auf den 3 Punkten -> als YAML anzeigen lässt, kannst du hier den Code einfach einfügen:

alias: Anker - Verbrauchszähler umstellen
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.solarbank_e1600_akkuleistung
    below: 0
    id: Sol 1 Unter 0
  - platform: numeric_state
    entity_id:
      - sensor.solarbank_e1600_akkuleistung
    above: 0
    id: Sol 1 Über 0
  - platform: numeric_state
    entity_id:
      - sensor.solarbank_e1600_akkuleistung_2
    below: 0
    id: Sol 2 Unter 0
  - platform: numeric_state
    entity_id:
      - sensor.solarbank_e1600_akkuleistung_2
    above: 0
    id: Sol 2 Über 0
condition: []
action:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - Sol 1 Unter 0
        sequence:
          - service: select.select_option
            target:
              entity_id: select.solarbank_e1600_1_battery_energy
            data:
              option: discharge
      - conditions:
          - condition: trigger
            id:
              - Sol 1 Über 0
        sequence:
          - service: select.select_option
            target:
              entity_id: select.solarbank_e1600_1_battery_energy
            data:
              option: charge
      - conditions:
          - condition: trigger
            id:
              - Sol 2 Unter 0
        sequence:
          - service: select.select_option
            data:
              option: discharge
            target:
              entity_id: select.solarbank_e1600_2_battery_energy
      - conditions:
          - condition: trigger
            id:
              - Sol 2 Über 0
        sequence:
          - service: select.select_option
            target:
              entity_id:
                - select.solarbank_e1600_2_battery_energy
            data:
              option: charge
mode: parallel
max: 10

Steuerung – Automation für “Null”-Einspeisung

Templates

template:
  - sensor:
      - name: "Wohnung Leistungsbedarf gesamt (Watt)"
        unique_id: "WohnungLeistungsbedarfgesamtWatt"
        unit_of_measurement: W
        device_class: energy
        state_class: measurement
        state: "{{ (states('sensor.hichiirwifi_sgm_c4_4a920l_energy_power') + states('sensor.balkonsolar_power')) | float }}"
sensor:
  - platform: statistics
    name: "Wohnung Leistungsbedarf gesamt Mittelwert 5Min (Watt)"
    entity_id: sensor.wohnung_leistungsbedarf_gesamt_watt
    state_characteristic: mean
    max_age:
      minutes: 5
    sampling_size: 1200
    percentile: 90
  - platform: statistics
    name: "Wohnung Leistungsbedarf gesamt Min 5Min (Watt)"
    entity_id: sensor.wohnung_leistungsbedarf_gesamt_watt
    state_characteristic: value_min
    max_age:
      minutes: 5
    sampling_size: 1200
    percentile: 90

Automation

alias: Anker Nulleinspeisung V2 (also so halbwegs)
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt
condition:
  - alias: Betriebszustandsprüfung
    condition: and
    conditions:
      - condition: state
        entity_id: switch.system_anker_dual_e1600_api_nutzung
        state: "on"
        alias: API Nutzung aktiv
      - condition: state
        entity_id: binary_sensor.system_anker_dual_e1600_systemadministration
        state: "on"
        alias: Systemadmin?
      - alias: Nicht in Ladepriorität (Verschwendet sonst nur API-Anfragen)
        condition: and
        conditions:
          - alias: Bank 1
            condition: not
            conditions:
              - condition: state
                entity_id: sensor.solarbank_e1600_betriebszustand
                state: charge_priority
          - alias: Bank 2
            condition: not
            conditions:
              - condition: state
                entity_id: sensor.solarbank_e1600_betriebszustand_2
                state: charge_priority
  - alias: >-
      Nur, wenn nicht innerhalb der letzten 3 Minuten getriggert wurde (hierfür
      muss der Aktionsblock erreicht worden sein)
    condition: template
    value_template: >-
      {{ state_attr("automation.anker_nulleinspeisung_v2_also_so_halbwegs",
      "last_triggered") == None or ( as_timestamp(now()) -
      as_timestamp(state_attr("automation.anker_nulleinspeisung_v2_also_so_halbwegs",
      "last_triggered")) |int(0) ) > 180 }}
  - alias: Anker & Bedarfs-Werte vergleichen (oder)
    condition: or
    conditions:
      - condition: template
        value_template: >-
          {{(float(states('number.solarbank_e1600_system_einspeisevorgabe')) *
          1.25 ) <=
          states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt') |
          float}}
        alias: Min-Wert ist um mind. 25% größer als Solarbank
      - condition: template
        value_template: >-
          {{ float(states('number.solarbank_e1600_system_einspeisevorgabe')) >=
          (states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt') | float
          * 1.24 )}}
        alias: Min-Wert ist um mind. 25% kleiner als Solarbank
      - alias: Max ist gesetzt und es würde mehr benötigt werden
        condition: not
        conditions:
          - condition: numeric_state
            entity_id: sensor.system_anker_dual_e1600_system_einspeisevorgabe
            above: 799
            below: 801
            alias: 800W gesetzt
          - condition: template
            value_template: >-
              {{(float(states('number.solarbank_e1600_system_einspeisevorgabe'))
              * 1.25 ) <=
              states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt') |
              float}}
            alias: Min-Wert ist um mind. 25% größer als Solarbank
      - alias: Min ist gesetzt und es würde weniger benötigt werden
        condition: not
        conditions:
          - alias: 100W gesetzt
            condition: numeric_state
            entity_id: sensor.system_anker_dual_e1600_system_einspeisevorgabe
            above: 99
            below: 101
          - condition: template
            value_template: >-
              {{ float(states('number.solarbank_e1600_system_einspeisevorgabe'))
              >= (states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt')
              | float * 1.24 )}}
            alias: Min-Wert ist um mind. 25% kleiner als Solarbank
action:
  - choose:
      - conditions:
          - condition: numeric_state
            entity_id: sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt
            above: 99
            value_template: "    {{( (float(states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt')) * 2) + float(states('sensor.wohnung_leistungsbedarf_gesamt_mittelwert_5min_watt'))) / 3}}"
          - condition: numeric_state
            entity_id: sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt
            value_template: "    {{( (float(states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt')) * 2) + float(states('sensor.wohnung_leistungsbedarf_gesamt_mittelwert_5min_watt'))) / 3}}"
            below: 801
        sequence:
          - service: number.set_value
            metadata: {}
            data:
              value: >-
                {{(
                (float(states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt'))
                * 2) +
                float(states('sensor.wohnung_leistungsbedarf_gesamt_mittelwert_5min_watt'))
                ) / 3}}
            target:
              entity_id: number.solarbank_e1600_system_einspeisevorgabe
            alias: >-
              Vermittelten Wert aus Min (doppelt gewichtet) & Durchschnitt
              einstellen
      - conditions:
          - condition: numeric_state
            entity_id: sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt
            value_template: "    {{( (float(states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt')) * 2) + float(states('sensor.wohnung_leistungsbedarf_gesamt_mittelwert_5min_watt'))) / 3}}"
            above: 800
          - condition: not
            conditions:
              - condition: numeric_state
                entity_id: sensor.system_anker_dual_e1600_system_einspeisevorgabe
                above: 799
                below: 801
        sequence:
          - service: number.set_value
            metadata: {}
            data:
              value: "800"
            target:
              entity_id: number.solarbank_e1600_system_einspeisevorgabe
        alias: Set Max 800W if not Set
      - conditions:
          - condition: numeric_state
            entity_id: sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt
            value_template: "    {{( (float(states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt')) * 2) + float(states('sensor.wohnung_leistungsbedarf_gesamt_mittelwert_5min_watt'))) / 3}}"
            below: 100
          - condition: not
            conditions:
              - condition: numeric_state
                entity_id: sensor.system_anker_dual_e1600_system_einspeisevorgabe
                above: 99
                below: 101
        sequence:
          - service: number.set_value
            metadata: {}
            data:
              value: "100"
            target:
              entity_id: number.solarbank_e1600_system_einspeisevorgabe
        alias: Set Min 100W if not Set
mode: single

Anker Solarbank Pro 2

Als Kommentar auf mein neustes Video hat ein aufmerksamer Zuschauer einen teil seines Codes für die Solarbank Pro 2 Entitäten zur verfügung gestellt:

# Akkuenergie Energiedashboard 
      - name: "Akkuenergie Energiedashboard"
        unique_id: "AkkuenergieEnergiedashboard"
        unit_of_measurement: Wh
        device_class: energy_storage
        state: >-
          {% if not is_state('sensor.solarbank_2_e1600_pro_betriebszustand', 'standby') %}
            {{ states('sensor.solarbank_2_e1600_pro_akkuenergie') }}
          {% endif %}

Hinweis zu Fehlern im Energiedashboard

Manchmal kommt es scheinbar leider vor, dass die API sich entscheidet einfach mal einen Wert zu korrigieren, was teilweise die “total-increasing” Entitäten durcheinanderbringt und zu sowas im Energiedashboard führen kann:

Das kann man entweder durch noch komplexere Templates verhindern, oder bei bedarf korrigieren: Statistiken in Home Assistant korrigieren (Energie Dashboard)

Bitte um Support

Dieses Tutorial ist vom Umfang her völlig eskaliert, mittlerweile stecken hier mehrere Wochen Arbeit drinnen. Auch wenn ich die Anlage leider noch nicht bei mir am Netz habe, denke ich doch, es ist ein guter Startpunkt für einige 🙌

Andere Kanäle verlangen inzwischen, dass man für Automationen bezahlt… Diesen Weg möchte ich bewusst nicht gehen, da ich ein großer Verfechter von freien Informationen bin und mein Kanal ohne dich nicht so groß wäre 🙏

Wenn du es dir aber leisten kannst, unterstütze mich gerne mit einer kleinen Spende, da ich das hier alles in meiner Freizeit mache. Entweder in Form einer kleinen PayPal-Spende, auf BuyMeCoffee oder natürlich auch in Form einer Kanalmitgliedschaft, wenn du es dir leisten kannst / möchtest.

Vielen Dank im Voraus 💙

Verpasse keine Tipps!

Ich senden keinen Spam! Erfahre mehr in der Datenschutzerklärung.

Transparenz: In diesem Artikel sind Partnerlinks enthalten. Durch einen Klick darauf ge­lan­gt ihr direkt zum Anbieter. Solltet ihr euch dort für einen Kauf entscheiden, erhalte ich ei­ne kleine Provision. Für euch ändert sich am Preis nichts & Partnerlinks haben keinerlei Einfluss auf meine Berichterstattung. Vielen Dank für deine Unterstützung!

Gründer von simon42. Schreibt hier ehrlich und leidenschaftlich über Smart Home und Technik Themen, denn das Zuhause wurde bereits von Sprachassistenten übernommen und die Kontrolle abgegeben 😁

Beginnen die Diskussion unter community.simon42.com

5 Gedanken zu „Anker Solix – Home Assistant Energiedashboard & Steuerung“

  1. Moin,

    ich bin wahrscheinlich zu blond um mein Problem selbst zu lösen.
    Wo kommt dieser Sensor her?
    Zeile 43: (states(‘sensor.solarbank_e1600_1_2_battery_energy_charge_total_energiedashboard’)

    oder soll das dieser sein Zeile 31:
    unique_id: “SolarbankE160012BatteryEnergychargetotal”

    • Genau 😉

      Dass kommt daher, dass die Entitäts-ID tatsächlich aus dem Namen heraus generiert wird, also draus: – name: “Solarbank E1600 1 & 2 – Battery Energy charge total (Energiedashboard)”

  2. Hi Simon, ich habe die Darstellung im Energiedashboard ganz ähnlich gelöst wie du und kann keinen Frust nur allzu gut nachvollziehen.

    Die nahezu “Null”-Einspeisung hätte ich gerne von die übernommen, aber mein binary_sensor.system_solix_systemadministration = off sagt mir ich bin kein Admin. Muss ich hier irgend etwas in der Anker App einstellen – diese sagt nämlich dass der Account Eigentümer ist.

    • Wenn du zwei Accounts hast, ist es wichtig, dass du den Administrations-Account (Also den, mit welchem du die Einspeisung auch festlegen kannst) im HomeAssistant angemeldet hast, und den Zweitaccount (der Gast) in der Anker-App am Smartphone.

Kommentare sind geschlossen.