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-Nummer | Wert | Beschreibung |
---|---|---|---|
StorCTLMod | 40348 | 0: keine Begrenzung 1: Laden begrenzen 2: Entladen begrenzen 3: Beides begrenzen | |
MinRsvPct | 40350 | 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 | |
OutWRte | 40355 | 0-10000 | Entladeleistung in % 10000 = 100,00% |
InWRte | 40356 | 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:
Name | Zustand |
---|---|
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 Name | Funktion |
---|---|
Reset charging | Setzt alle (4) Parameter via Modbus wieder zurück auf im Script definierte Werte |
Force charging | Lä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 chargepower | Hierbei wird die Ladeleistung geregelt. Hierzu wird der o.g. Input Helper genutzt. |
set dischargepower | Hier 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