Henielma wrote: Sunday 28 September 2025 16:11
...
Using the DR134 to send Modbus registers to the Marstek seems not possible.
....
It is definitely possible to control the Marstek Venus (at least v1 and V2, I have a V1) using the DR134.
I am running two Python3 scripts (so not using MQTTMapper):
One that runs every 5 seconds to update domoticz sensors based on modbus registers (ie. the equivalent of the MQTTMapper solution)
One that is triggered by Domoticz switches/selectors to control the Marstek via modbus.
This is my " set_marstek" script. You just have to modify the IP of your DR134 in the code an provide the correct parameters and it should work.
No warranty and use at your own risk!!!
Code: Select all
#!python3
# set-marstek
progname='set_marstek.py'
version = "v0.1"
from pyModbusTCP.client import ModbusClient
from pyModbusTCP import utils
import argparse
import sys
def set_mode(mode):
if mode == 'manual':
result = marstek.write_single_register(43000, 0) #0-manual/1-anti injection/2-trade
elif mode == 'self':
result = marstek.write_single_register(43000, 1) #0-manual/1-anti injection/2-trade
elif mode == 'self_trade':
result = marstek.write_single_register(43000, 2) #0-manual/1-anti injection/2-trade
elif mode == 'charge':
result = marstek.write_single_register(42010, 1) #0-stop/1-charge/2-discharge
elif mode == 'discharge':
result = marstek.write_single_register(42010, 2) #0-stop/1-charge/2-discharge
elif mode == 'stop':
result = marstek.write_single_register(42010, 0) #0-stop/1-charge/2-discharge
else:
result = False
return result
def set_discharge_power(watts):
result = marstek.write_single_register(42021, watts) # 0-2500W
return result
def set_charge_power(watts):
result = marstek.write_single_register(42020, watts) # 0-2500W
return result
def set_soc_target(percentage):
result = marstek.write_single_register(42011, percentage) # 10-100%
return result
################################################################
#Initialize
################################################################
#Commandline arguments parsing
################################################################
parser = argparse.ArgumentParser(prog=progname, description='Set Marstek')
parser.add_argument("-m", "--mode", type=str, choices=['manual', 'self', 'self_trade', 'soc', 'discharge', 'charge', 'stop', 'reset'], required=True)
parser.add_argument("-v", "--value", type=int )
parser.add_argument("-u", "--unit", type=int, required=False, default=1)
args = parser.parse_args()
print(progname)
print('Connect to:' )
print('IP/port : ' + '192.168.0.15' + '-' + ' 502' ) #<= Adapt to IP & port of the DR134
print('Modbus unit: ' + str(args.unit))
#setup connection & enable control mode
try:
marstek = ModbusClient(host='192.168.0.15', port=502, unit_id=args.unit, auto_open=False, auto_close=False) #<= Adapt to IP & port of the DR134
except ValueError:
sys.exit("Failed to establish connection (host or port params)")
if not marstek.open(): #open socket
sys.exit("Failed to open connectione")
# command_on: 21930 # 0x55AA in decimal
# command_off: 21947 # 0x55BB in decimal
if not marstek.write_single_register(42000, 21930): #control mode enable
sys.exit("Failed to enable control mode")
if args.mode == 'reset': #<= Does not seem to work :-(
if not marstek.write_single_register(41000, 21930): # 21930 is 0x55AA in decimal
print("Failed to reset")
else:
print("Reset succesful")
if args.mode in {'manual', 'self' , 'self_trade'}:
if not set_mode(args.mode):
print("Failed to set manual/self/self_trade mode")
if args.mode == 'soc':
if not set_soc_target(args.value):
print("Failed to set soc target")
if args.mode in { 'charge', 'discharge', 'stop'}:
if args.mode == 'stop':
if set_mode('stop'):
print("Stop mode set")
else: print("Failed to set stop mode")
elif args.mode == 'charge':
print("Try setting charge mode")
if args.value:
print("value found")
if set_charge_power(args.value):
print("Charge power set")
if set_mode('charge'):
print("Charge mode set")
else: print("Failed to set charge mode")
else: print("Failed to set charge value")
elif set_mode('charge'):
print("Charge mode set")
else:
print("Failed to set charge mode")
elif args.mode == 'discharge':
print("Try setting discharge")
if args.value:
print("value found")
if set_discharge_power(args.value):
print("Discharge power set")
if set_mode('discharge'):
print("Discharge mode set")
else: print("Failed to set discharge mode")
else: print("Failed to set discharge value")
elif set_mode('discharge'):
print("Discharge mode set")
else:
print("Failed to set discharge mode")
marstek.close()