From 8cf5a44a32eeb679c7a8b24a484036d5fd844ad1 Mon Sep 17 00:00:00 2001 From: Alexandre JARDON <28548335+webalexeu@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:34:39 +0200 Subject: [PATCH] Marstek: add discharge and optimise batterymode (#32571) --- .../definition/meter/marstek-batterymode.tpl | 188 ++++++++++++++++++ .../definition/meter/marstek-venus-a.yaml | 154 +------------- .../definition/meter/marstek-venus-e.yaml | 154 +------------- 3 files changed, 194 insertions(+), 302 deletions(-) create mode 100644 templates/definition/meter/marstek-batterymode.tpl diff --git a/templates/definition/meter/marstek-batterymode.tpl b/templates/definition/meter/marstek-batterymode.tpl new file mode 100644 index 000000000..02ef38a45 --- /dev/null +++ b/templates/definition/meter/marstek-batterymode.tpl @@ -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 }} diff --git a/templates/definition/meter/marstek-venus-a.yaml b/templates/definition/meter/marstek-venus-a.yaml index 9096a5a0d..6041c4dd8 100644 --- a/templates/definition/meter/marstek-venus-a.yaml +++ b/templates/definition/meter/marstek-venus-a.yaml @@ -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 }} diff --git a/templates/definition/meter/marstek-venus-e.yaml b/templates/definition/meter/marstek-venus-e.yaml index 9aeed1b99..7b8ea432b 100644 --- a/templates/definition/meter/marstek-venus-e.yaml +++ b/templates/definition/meter/marstek-venus-e.yaml @@ -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" . }}