VE.Direct Hex Python Command Line Tool

Command line Python script to GET/SET VE.Direct Hex Protocol for Victron devices.

VE.Direct Hex Protocol MPPT
VE.Direct Hex Protocol BMV
VE.Direct Hex Protocol Phoenix Inverter

##################################
# Created on Mar 13, 2022
# @author: lsimmons
##################################
import sys, getopt, serial

ver = "v1.2 03/24/2022"

####################################
#                                  #
####################################
def main ( argv ):
    port = ''
    cmd  = ""

    try:
        opts, args = getopt.getopt ( argv,"hp:c:", ["port=","cmd="] )
    except getopt.GetoptError:
        print ( "vedirecthex.py -p <port> -c <cmd>" )
        sys.exit(2)

    for opt, arg in opts:
        if opt == '-h':
            print ( 'vedirecthex.py -p <port> -c <cmd>' )
            sys.exit()
        elif opt in ("-p", "--port"):
            port = arg
        elif opt in ("-c", "--cmd"):
            cmd = arg

    print ( "===========")
    print ( "vedirecthex")
    print ( ver )
    print ( "port: " + port )
    ser = serial.Serial ( port, 19200, timeout=10 )
    ser.close()

    ser.open()
    ser.write ( str.encode ( ":451\n" ))        # get product ID
    read_val = ser.read ( size = 16 )
    print ( "prod: " +bytes.decode ( read_val ))
    ser.close()
    
    ser.open()
    print ( " cmd: " + cmd )
    ser.write ( str.encode ( cmd + "\n" ))
    read_val = ser.read ( size = 256 )
    print ( " res: " + bytes.decode ( read_val ))
    ser.close()

###################################
#
###################################
if __name__ == '__main__':
    pass
    main ( sys.argv[1:] )

#
Use examples:

python3 /opt/vedirect/vedirecthex.py -p /dev/ttyUSB1 -c :7A8ED00B9            # GET Example
python3 /opt/vedirect/vedirecthex.py -p /dev/ttyUSB1 -c :89DED00F609C4        # SET Example

Command examples:

################################
#  Load Control
################################
:7A8ED00B9		# get load output state
:7ABED00B6		# get load ctrl state
:8ABED0000B5		# set load ctrl state off
:8ABED0004B1		# set load ctrl state on
:8ABED0005B0		# set load ctrl state user1

:79CED00C5		# get switch low level
:79DED00C4		# get switch high level

:89CED002E098D		# set switch low level  to 23.50 volts
:89CED00FC08C0		# set switch low level  to 23.00 volts
:89CED00CA08F2		# set switch low level  to 22.50 volts
:89CED00980824		# set switch low level  to 22.00 volts

:89DED00280A91		# set switch high level  to 26.00 volts
:89DED00F609C4		# set switch high level  to 25.50 volts
:89DED00C409F6		# set switch high level  to 25.00 volts

:89CED00B2040E		# set switch low level  to 12.02 volts
:89DED001605A8		# set switch high level to 13.02 volts

################################
#  Street Light Function
################################
:7EDCC0095		# get streetlight function

################################
#  Miscellaneous
################################
:352			# application version
:451			# product ID
:64F			# restart
:7F0ED0071		# get battery max current
:8F0ED0064000C		# set battery max current to 10.0A


Calculating the checksum for commands:
################################
Message example from MPPT documentation
Set battery maximum current
set to 10.0A = 0x0064

:	start
8	set command	
F0	register (EDF0)
ED
00	flags
64	data (0064)
00
0C	checksum

0x55-0x08-0xF0-0xED-0x00-0x64-0x00 = 0x0C
################################