BYD Akku mit Home Assistant steuern

Ladeleistung, Entladeleistung, Notstromreserve setzen UND aus dem Netz den Akku laden? Das kann man alles auch vom Home Assistant aus steuern. Wie, zeige ich im Video (und natürlich hier).

Die Skripte und Infos sind von bzw. basieren auf dem Artikel von Bernhard: https://www.libe.net/byd-modbus

Vorab einmal mein aktuelles Setup

Voraussetzungen

Ihr benötigt:

  • Home Assistant
  • Fronius Wechselrichter mit BYD Batterie und Modbus
  • ModBus Integration
  • Input Helper
  • 4 Template Sensoren
  • Scripte und Automationen

Modbus mit Fronius Wechselrichter

Zunächst muss man sich im Fronius GEN24 Wechselrichter einloggen (Technikerzugang!), dann links auf Kommunikation und auf Modbus. Dann bitte einmal Konfigurieren wie im Screenshot (nur der Teil Modbus Server):

Modbus Register (die interessanten)

Uns interessieren praktisch nur 4 Register, diese sind:

Fronius Doku:Register-NummerWertBeschreibung
StorCTLMod403480: keine Begrenzung
1: Laden begrenzen
2: Entladen begrenzen
3: Beides begrenzen
MinRsvPct40350 Das ist der %-Wert, welchen die Batterie immer (außer bei Notstrom) hält.
Setztz man ihn hoch, lädt die Batterie, setzt man ihn runter, kann man die Batterie bis zu diesem Wert entladen
OutWRte40355 0-10000Entladeleistung in %
10000 = 100,00%
InWRte40356 
 0-10000
Ladeleistung in %
10000 = 100,00%

Modbus Integration


Um die Modbus Integration zu konfigurieren, einmal die configuration.yaml öffnen (z.B. mit dem FileEditor). Dort wird dann folgender Config-Block eingefügt (wobei man natürlich die IP des Fronius Wechselrichters anpassen muss!)

modbus:
  - type: tcp
# Hier dann die IP ändern
    host: 10.8.0.11
    port: 502
    name: gen24
    sensors:
      - name: reading_battery_settings
        slave: 1
        count: 24
        address: 40345
        scan_interval: 5
        data_type: custom
        structure: ">10H2h4H8h"    

Helper und Sensoren

Als nächstes müssen wir in Home Assistant unter „Einstellungen“ / „Geräte und Dienste“ / „Helfer“ folgenden Input Helper erstellen: Hierbei den Maximalwert auf die maximale Lade-/Entladeleistung in eurem System stellen (bei mir: 10kW Wechselrichter und 10,24kWh Akku sind das 10000W – demnach stelle ich auf „10000“)

Template Sensoren

Nun müssen wir noch 4 Template Sensoren erstellen – die „filtern“ nun die jeweils relevanten Daten aus dem Array raus, welches wir mit der Modbus Integration zusammen zur Abfrage eingerichtet haben.

Bernhard hat hierzu die Template-Zustände definiert:

NameZustand
StorCTLMod{% set storCTL_mod= states('sensor.reading_battery_settings').split(',')[3] | int%} {{ "in" if storCTL_mod == 1 else "out" if storCTL_mod == 2 else "in and out" if storCTL_mod == 3 else "auto" }}
MinRsvPct{{ states('sensor.reading_battery_settings').split(',')[5]|int / 100 }}
OutWRte {{ states('sensor.reading_battery_settings').split(',')[10]|int / 100 }}
InWRte{{ states('sensor.reading_battery_settings').split(',')[11]|int / 100 }}

Scripte und Automation

Ich gehe hier in dem Beitrag auf folgende Scripte/Automationen ein:

Script NameFunktion
Reset chargingSetzt alle (4) Parameter via Modbus wieder zurück auf im Script definierte Werte
Force chargingLädt den Akku bis zu einem definierten Prozentsatz (MinRsvPct) mit der definierten Leistung. In meinem Fall bis 99% mit maximaler Leistung.
Wer hier mit Variablen arbeiten möchte schaut nochmal auf Bernhards Beitrag (Link ganz oben).
set chargepowerHierbei wird die Ladeleistung geregelt. Hierzu wird der o.g. Input Helper genutzt.
set dischargepowerHier wird die Entladeleistung geregelt. Gut, wenn man bei Wallboxnutzung das Auto NICHT aus dem Hausakku laden möchte.

Werte schreiben

Achtung: bei den Scripten wird NICHT in die Sensoren geschrieben, die wir oben angelegt haben, sondern natürlich direkt via Modbus auf die genannten Register. Sensoren kann man nur lesen, nicht beschreiben.

Reset charging

Dieses Script habe ich 1zu1 von Bernhard übernommen:

alias: Reset charging
sequence:
  - service: modbus.write_register
    data:
      slave: 1
      address: 40348
      value: 0
      hub: gen24
  - service: modbus.write_register
    data:
      address: 40355
      slave: 1
      value: 10000
      hub: gen24
  - service: modbus.write_register
    data:
      slave: 1
      address: 40350
      value: 500
      hub: gen24
  - service: modbus.write_register
    data:
      address: 40356
      slave: 1
      value: 10000
      hub: gen24
mode: single
icon: mdi:home-battery

Force charging

alias: Force charging
sequence:
  - data:
      slave: 1
      address: 40348
      value: 2
      hub: gen24
    action: modbus.write_register
  - data:
      address: 40355
      slave: 1
      hub: gen24
      value: "{{ 65536 - (10000|int(0)) | int }}"
    action: modbus.write_register
  - data:
      address: 40356
      slave: 1
      hub: gen24
      value: "{{ (10000) | int }}"
    action: modbus.write_register
  - data:
      slave: 1
      address: 40350
      value: 9900
      hub: gen24
    action: modbus.write_register
mode: single
icon: mdi:battery-charging
description: ""

set chargepower

In dieser Automation wird immer, wenn sich der Input-Helper ändert (input_number.charging_power), der Wert dessen als maximale Ladeleistung gesetzt. Dazu wird natürlich auch der entsprechende StoreControlMode-Wert gesetzt.

alias: set chargepower
description: ""
triggers:
  - trigger: state
    entity_id:
      - input_number.charging_power
conditions: []
actions:
  - alias: Charge-limit
    sequence:
      - data:
          address: 40356
          slave: 1
          hub: gen24
          value: "  {{ (states('input_number.charging_power')|int(0) / states('sensor.reading_battery_settings').split(',')[0]|int(1) * 10000) | int }}"
        action: modbus.write_register
      - data:
          slave: 1
          address: 40348
          value: 1
          hub: gen24
        action: modbus.write_register
mode: single

set dischargepower

In dieser Automation wird immer, wenn sich der Input-Helper ändert (input_number.discharging_power – Achtung den Helper natürlich vorher noch erstellen!), der Wert dessen als maximale Entladeleistung gesetzt. Dazu wird natürlich auch der entsprechende StoreControlMode-Wert gesetzt. Ideal für das Szenario, in dem man nachts das E-Auto mit 11kW lädt, aber dabei den Hausakku nicht mit eben diesen 11kW (oder was er eben max. kann) belastet, sondern nur mit dem hier gesetzten Wert.

alias: set dischargepower
description: ""
triggers:
  - trigger: state
    entity_id:
      - input_number.discharging_power
conditions: []
actions:
  - alias: Charge-limit
    sequence:
      - data:
          address: 40355
          slave: 1
          hub: gen24
          value: "  {{ (states('input_number.discharging_power')|int(0) / states('sensor.reading_battery_settings').split(',')[0]|int(1) * 10000) | int }}"
        action: modbus.write_register
      - data:
          slave: 1
          address: 40348
          value: 2
          hub: gen24
        action: modbus.write_register
mode: single

Video

Anbei noch das Video, welches die Einrichtung nochmal genau zeigt.

Link zum Video: https://youtu.be/Zcg0njF0QfQ

https://youtu.be/Zcg0njF0QfQ

Ähnliche Beiträge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert