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
- Grundlagen sollte bekannt sein und für die Integration benötigst du HACS
- Integration: https://github.com/thomluther/hacs-anker-solix
- 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)
- 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)
- 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).
- 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_gesamt | Gesamtertrags-Entität am Anker Solix System |
sensor.solarbank_e1600_akkuenergie | Akkuenergie (Wh) am Anker Solix Solarbank-Gerät |
sensor.solarbank_e1600_akkuenergie_2 | Akkuenergie (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 💙
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)”
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.
Ich hab mir schon vor einiger Zeit dieses Add-on für Home Assistant gebaut, was die Entitäten für die Solarbank per MQTT-Auto-Discovery anlegt, so dass man keine YAML-Konfiguration braucht. Voraussetzung ist allerdings ein MQTT-Server: https://github.com/markusmauch/homeassistant-addons/tree/main/solix2mqtt