Marstek: add discharge and optimise batterymode (#32571)

This commit is contained in:
Alexandre JARDON 2026-08-18 10:34:39 +02:00 • committed by GitHub
parent 35ed5e5b91
commit 8cf5a44a32
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 194 additions and 302 deletions

View file

@ -0,0 +1,188 @@
{{- define "marstek-batterymode" }}
batterymode:
source: switch
switch:
- case: 1 # normal
set:
source: sequence
set:
# Restore Max Charge Power
- source: const
value: {{ .maxchargepower }}
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 44002 # Max Charge Power
type: writesingle
decode: uint16
# Enable RS485 Control Mode
- source: const
value: 21930
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Enabled
type: writesingle
decode: uint16
# Set User Work Mode
- source: const
value: {{ .work_mode_normal }}
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 43000 # User Work Mode
type: writesingle
decode: uint16
# Disable RS485 Control Mode
- source: const
value: 21947
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Disabled
type: writesingle
decode: uint16
- case: 2 # hold
set:
source: sequence
set:
# Enable RS485 Control Mode
- source: const
value: 21930
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Enabled
type: writesingle
decode: uint16
# Set Force Charge/Discharge to Stop
- source: const
value: 0
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42010 # Force Charge/Discharge = Stop
type: writesingle
decode: uint16
# Do not disable RS485 Control Mode because it will reset the device and let it charge/discharge again
- case: 3 # charge
set:
source: sequence
set:
# Enable RS485 Control Mode
- source: const
value: 21930
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Enabled
type: writesingle
decode: uint16
# Set Force Charge/Discharge to Charge
- source: const
value: 1
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42010 # Force Charge/Discharge = Charge
type: writesingle
decode: uint16
# Set Forcible Charge Power
- source: const
value: {{ .maxchargepower }}
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42020 # Forcible Charge Power
type: writesingle
decode: uint16
# Do not disable RS485 Control Mode because it will reset the device and let it charge/discharge again
- case: 4 # holdcharge -> no charging, discharging allowed
set:
source: sequence
set:
# Set Max Charge Power to 0 to prevent charging
- source: const
value: 0
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 44002 # Max Charge Power
type: writesingle
decode: uint16
# Enable RS485 Control Mode
- source: const
value: 21930
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Enabled
type: writesingle
decode: uint16
# Set User Work Mode
- source: const
value: {{ .work_mode_normal }}
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 43000 # User Work Mode
type: writesingle
decode: uint16
# Disable RS485 Control Mode
- source: const
value: 21947
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Disabled
type: writesingle
decode: uint16
# Do not disable RS485 Control Mode because it will reset the device and let it charge/discharge again
- case: 5 # discharge -> forced discharge to grid (feed-in arbitrage)
set:
source: sequence
set:
# Enable RS485 Control Mode
- source: const
value: 21930
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Enabled
type: writesingle
decode: uint16
# Set Force Charge/Discharge to Discharge
- source: const
value: 2
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42010 # Force Charge/Discharge = Discharge
type: writesingle
decode: uint16
# Set Forcible Discharge Power
- source: const
value: {{ .maxdischargepower }}
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42021 # Forcible Discharge Power
type: writesingle
decode: uint16
{{- end }}

View file

@ -30,6 +30,8 @@ params:
help:
de: Für erzwungenes Laden des Speichers. Venus A 1200 W, Venus D 2200 W
en: For forced charging of the battery. Venus A 1200 W, Venus D 2200 W
- name: maxdischargepower
required: true
- name: work_mode_normal
default: 1
advanced: true
@ -98,156 +100,6 @@ render: |
address: 32104 # Battery SOC (%)
type: holding
decode: uint16
batterymode:
source: switch
switch:
- case: 1 # normal
set:
source: sequence
set:
# Restore Max Charge Power
- source: const
value: {{ .maxchargepower }}
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 44002 # Max Charge Power
type: writesingle
decode: uint16
# Enable RS485 Control Mode
- source: const
value: 21930
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Enabled
type: writesingle
decode: uint16
# Set User Work Mode
- source: const
value: {{ .work_mode_normal }}
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 43000 # User Work Mode
type: writesingle
decode: uint16
# Disable RS485 Control Mode
- source: const
value: 21947
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Disabled
type: writesingle
decode: uint16
- case: 2 # hold
set:
source: sequence
set:
# Enable RS485 Control Mode
- source: const
value: 21930
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Enabled
type: writesingle
decode: uint16
# Set Force Charge/Discharge to Stop
- source: const
value: 0
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42010 # Force Charge/Discharge = Stop
type: writesingle
decode: uint16
# Do not disable RS485 Control Mode because it will reset the device and let it charge/discharge again
- case: 3 # charge
set:
source: sequence
set:
# Enable RS485 Control Mode
- source: const
value: 21930
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Enabled
type: writesingle
decode: uint16
# Set Force Charge/Discharge to Charge
- source: const
value: 1
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42010 # Force Charge/Discharge = Charge
type: writesingle
decode: uint16
# Set Forcible Charge Power
- source: const
value: {{ .maxchargepower }}
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42020 # Forcible Charge Power
type: writesingle
decode: uint16
# Do not disable RS485 Control Mode because it will reset the device and let it charge/discharge again
- case: 4 # holdcharge -> no charging, discharging allowed
set:
source: sequence
set:
# Set Max Charge Power to 0 to prevent charging
- source: const
value: 0
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 44002 # Max Charge Power
type: writesingle
decode: uint16
# Enable RS485 Control Mode
- source: const
value: 21930
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Enabled
type: writesingle
decode: uint16
# Set User Work Mode
- source: const
value: {{ .work_mode_normal }}
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 43000 # User Work Mode
type: writesingle
decode: uint16
# Disable RS485 Control Mode
- source: const
value: 21947
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Disabled
type: writesingle
decode: uint16
{{- include "marstek-batterymode" . }}
{{- include "battery-params" . }}
{{- end }}

View file

@ -40,6 +40,8 @@ params:
default: 100
- name: maxchargepower
default: 2500
- name: maxdischargepower
default: 800
- name: work_mode_normal
default: 1
advanced: true
@ -90,155 +92,5 @@ render: |
decode: uint16
scale: 1
{{- end }}
batterymode:
source: switch
switch:
- case: 1 # normal
set:
source: sequence
set:
# Restore Max Charge Power
- source: const
value: {{ .maxchargepower }}
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 44002 # Max Charge Power
type: writesingle
decode: uint16
# Enable RS485 Control Mode
- source: const
value: 21930
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Enabled
type: writesingle
decode: uint16
# Set User Work Mode
- source: const
value: {{ .work_mode_normal }}
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 43000 # User Work Mode
type: writesingle
decode: uint16
# Disable RS485 Control Mode
- source: const
value: 21947
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Disabled
type: writesingle
decode: uint16
- case: 2 # hold
set:
source: sequence
set:
# Enable RS485 Control Mode
- source: const
value: 21930
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Enabled
type: writesingle
decode: uint16
# Set Force Charge/Discharge to Stop
- source: const
value: 0
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42010 # Force Charge/Discharge = Stop
type: writesingle
decode: uint16
# Do not disable RS485 Control Mode because it will reset the device and let it charge/discharge again
- case: 3 # charge
set:
source: sequence
set:
# Enable RS485 Control Mode
- source: const
value: 21930
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Enabled
type: writesingle
decode: uint16
# Set Force Charge/Discharge to Charge
- source: const
value: 1
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42010 # Force Charge/Discharge = Charge
type: writesingle
decode: uint16
# Set Forcible Charge Power
- source: const
value: {{ .maxchargepower }}
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42020 # Forcible Charge Power
type: writesingle
decode: uint16
# Do not disable RS485 Control Mode because it will reset the device and let it charge/discharge again
- case: 4 # holdcharge -> no charging, discharging allowed
set:
source: sequence
set:
# Set Max Charge Power to 0 to prevent charging
- source: const
value: 0
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 44002 # Max Charge Power
type: writesingle
decode: uint16
# Enable RS485 Control Mode
- source: const
value: 21930
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Enabled
type: writesingle
decode: uint16
# Set User Work Mode
- source: const
value: {{ .work_mode_normal }}
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 43000 # User Work Mode
type: writesingle
decode: uint16
# Disable RS485 Control Mode
- source: const
value: 21947
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 42000 # RS485 Control Mode = Disabled
type: writesingle
decode: uint16
{{- include "marstek-batterymode" . }}
{{- include "battery-params" . }}