denbeire schreef op dinsdag 14 oktober 2025 @ 14:55:
[How-to] Marstek V3 thuisbatterij in Home Assistant via USR-EW11A (RS485→TCP)
Na wat puzzelen heb ik mijn Marstek V3 batterij netjes zichtbaar in Home Assistant via een USR-EW11A (RS485→TCP). Hieronder mijn werkende setup, registers, YAML en valkuilen—hopelijk heeft iemand er wat aan. 🙂
Hardware & uitgangspunt
BMS: Marstek V3
Adapter: USR-EW11A (RS485 → TCP)
Home Assistant: Core + YAML “Packages”
Geen ESPHome in dit traject (alleen Modbus)
EW11A instellingen
Mode: TCP Server
Port: 502
Serial: 9600 8N1 (past bij mijn BMS; zet hier wat je BMS verwacht)
Eén client tegelijk! Sluit Modbus Poll en de EW11 webpagina tijdens gebruik door HA, anders wordt de poort geblokkeerd.
Home Assistant: Packages activeren
In configuration.yaml:
homeassistant:
packages: !include_dir_named Packages
Plaats je package-bestand in ./Packages/marstek_venus_battery_control.yaml.
Werkende registers (Marstek V3)
SOC → holding 37005 (uint16, 0–100 %)
Spanning → holding 37006 (uint16, scale 0.1 V) → 208 ⇒ 20,8 V
Stroom → holding 37007 (int16, scale 0.01 A) → 3207 ⇒ 32,07 A
Vermogen: bij mij geen bruikbare 32-bit waarde gevonden in 37001..37004, dus berekend als V × A (werkt prima voor dashboard/Energy).
Volledige, minimale package (YAML)
# /homeassistant/Packages/marstek_venus_battery_control.yaml
# Marstek V3 via USR-EW11A (RS485→TCP) – basis sensoren + Energy integratie
modbus:
- name: Marstek
type: tcp
host: 192.168.0.149 # IP van de EW11A
port: 502
delay: 1
timeout: 5
sensors:
# SOC (0–100 %)
- name: "MSK Battery SOC"
address: 37005
slave: 1
input_type: holding
data_type: uint16
unit_of_measurement: "%"
device_class: battery
state_class: measurement
# Spanning (V) – r37006 ×0.1
- name: "MSK Battery Voltage"
address: 37006
slave: 1
input_type: holding
data_type: uint16
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
scale: 0.1
precision: 1
# Stroom (A) – r37007 ×0.01 (signed)
- name: "MSK Battery Current"
address: 37007
slave: 1
input_type: holding
data_type: int16
unit_of_measurement: "A"
device_class: current
state_class: measurement
scale: 0.01
precision: 2
# Om polariteit om te draaien (laden/ontladen): scale: -0.01
# Templates: berekend vermogen + splitsing laden/ontladen
template:
- sensor:
- name: "MSK Battery Power"
unique_id: msk_battery_power_calc
unit_of_measurement: "W"
device_class: power
state_class: measurement
state: >
{% set v = states('sensor.msk_battery_voltage')|float(0) %}
{% set a = states('sensor.msk_battery_current')|float(0) %}
{{ (v * a) | round(0) }}
availability: "{{ has_value('sensor.msk_battery_voltage') and has_value('sensor.msk_battery_current') }}"
- name: "MSK Battery Charging Power" # W, >=0
unique_id: msk_batt_charging_power
unit_of_measurement: "W"
device_class: power
state_class: measurement
state: >
{% set p = states('sensor.msk_battery_power')|float(0) %}
{{ max(p, 0) }}
- name: "MSK Battery Discharging Power" # W, >=0
unique_id: msk_batt_discharging_power
unit_of_measurement: "W"
device_class: power
state_class: measurement
state: >
{% set p = states('sensor.msk_battery_power')|float(0) %}
{{ max(-p, 0) }}
# Integratie naar kWh voor Energy-dashboard
sensor:
- platform: integration
source: sensor.msk_battery_charging_power
name: My Battery Charging in KWh
unique_id: my_battery_charging_in_kwh
unit_prefix: k
round: 3
method: trapezoidal
- platform: integration
source: sensor.msk_battery_discharging_power
name: My Battery Discharging in KWh
unique_id: my_battery_discharging_in_kwh
unit_prefix: k
round: 3
method: trapezoidal
Let op: afhankelijk van je HA-versie gebruik je slave: (zoals hier) i.p.v. unit:. Bij mij was slave: 1 vereist.
Energy-pagina (Battery)
In Instellingen → Energy → Batterijsystemen:
Charging energy → sensor.my_battery_charging_in_kwh
Discharging energy → sensor.my_battery_discharging_in_kwh
NB: “Statistics not defined” verdwijnt zodra de sensoren een paar minuten echte data hebben (laden/ontladen).
Dashboard-kaart (optioneel)
- type: vertical-stack
cards:
- type: heading
heading: Marstek (accu)
- type: gauge
name: Batterij SOC
entity: sensor.msk_battery_soc
min: 0
max: 100
severity: {green: 50, yellow: 30, red: 15}
- type: entities
title: Marstek (Modbus)
entities:
- entity: sensor.msk_battery_soc
name: SOC
- entity: sensor.msk_battery_voltage
name: Spanning
- entity: sensor.msk_battery_current
name: Stroom
- entity: sensor.msk_battery_power
name: Vermogen (berekend)
Troubleshooting (mijn valkuilen)
Unavailables? Check of Packages wel is geactiveerd en dat je maar één modbus: hub voor de EW11A hebt.
Poort bezet: Sluit Modbus Poll en de EW11 web UI; EW11 laat doorgaans maar één TCP-client toe.
Template errors: Gebruik één template: blok; meerdere blokken mag, maar let op indenting.
HomeKit 150-device limit: filter Modbus weg:
homekit:
- filter:
exclude_entity_globs:
- sensor.msk_*
Power teken: wil je laden + en ontladen −? Zet bij “Current” scale: -0.01.
Energy toont nog niets: er moet daadwerkelijk geladen/ontladen zijn sinds de sensoren bestaan; anders blijft het 0.
Dat was ’m. Met deze setup heb ik SOC, spanning, stroom, (berekend) vermogen en nette kWh-tellers op de Energy-pagina. Succes!