#!/usr/bin/python #victron BMV712 import signal, sys, time, socket, datetime, subprocess, math, serial, re # Control-C signal handler to suppress exceptions if user presses Control C # This is totally optional. def signal_handler(sig, frame): print('You pressed Ctrl+C!!!!') sys.exit(0) # init signal.signal(signal.SIGINT, signal_handler) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ser = serial.Serial('/dev/ttyOP_VEDirect', 19200, timeout=2) ser.flush() ValueH1 = 0 ValueH2 = 0 ValueH3 = 0 ValueH4 = 0 ValueH5 = 0 ValueH6 = 0 ValueH7 = 0 ValueH8 = 0 ValueH9 = 0 ValueH10 = 0 ValueH11 = 0 ValueH12 = 0 ValueH15 = 0 ValueH16 = 0 ValueH17 = 0 ValueH18 = 0 ValueV = 0 ValueVS = 0 ValueI = 0 ValueCE = 0 ValueSOC = 0 ValueTTG = 0 ValuePID = 0 ValueALARM = 0 ValueRELAY = 0 ValueAR = 0 error = False i = 0 def safefloat(value,line): if re.match('^-?[0-9]+$', line): value = float(line) return value # forever loop until user presses Control-C while 1: i += 1 serLine = ser.readline().split() #print serLine,len(serLine) if len(serLine) == 2: if 'H1' == serLine[0]: ValueH1 = safefloat(ValueH1,serLine[1])/1000 elif 'H2' == serLine[0]: ValueH2 = safefloat(ValueH2,serLine[1])/1000 elif 'H3' == serLine[0]: ValueH3 = safefloat(ValueH3,serLine[1])/1000 elif 'H4' == serLine[0]: ValueH4 = safefloat(ValueH4,serLine[1]) elif 'H5' == serLine[0]: ValueH5 = safefloat(ValueH5,serLine[1]) elif 'H6' == serLine[0]: ValueH6 = safefloat(ValueH6,serLine[1])/1000 elif 'H7' == serLine[0]: ValueH7 = safefloat(ValueH7,serLine[1])/1000 elif 'H8' == serLine[0]: ValueH8 = safefloat(ValueH8,serLine[1])/1000 elif 'H9' == serLine[0]: ValueH9 = safefloat(ValueH9,serLine[1]) elif 'H10' == serLine[0]: ValueH10 = safefloat(ValueH10,serLine[1]) elif 'H11' == serLine[0]: ValueH11 = safefloat(ValueH11,serLine[1]) elif 'H12' == serLine[0]: ValueH12 = safefloat(ValueH12,serLine[1]) elif 'H15' == serLine[0]: ValueH15 = safefloat(ValueH15,serLine[1])/1000 elif 'H16' == serLine[0]: ValueH16 = safefloat(ValueH16,serLine[1])/1000 elif 'H17' == serLine[0]: ValueH17 = safefloat(ValueH17,serLine[1])/100 elif 'H18' == serLine[0]: ValueH18 = safefloat(ValueH18,serLine[1])/100 elif 'V' == serLine[0]: ValueV = safefloat(ValueV,serLine[1])/1000 elif 'VS' == serLine[0]: ValueVS = safefloat(ValueVS,serLine[1])/1000 elif 'PID' == serLine[0]: ValuePID = serLine[1] elif 'I' == serLine[0]: ValueI = safefloat(ValueI,serLine[1])/1000 elif 'I' == serLine[0]: if ('---' in serLine) == False: ValueCE = safefloat(ValueCE,serLine[1])/1000 elif 'SOC' == serLine[0]: if ('---' in serLine) == False: ValueSOC = safefloat(ValueSOC,serLine[1])/1000 elif 'TTG' == serLine[0]: if ('---' in serLine) == False: ValueTTG = safefloat(ValueTTG,serLine[1]) elif 'ALARM' == serLine[0]: if 'OFF' in serLine: ValueALARM = '0' else: ValueALARM = '1' if sys.stdin.isatty(): print '=============================================' print 'Depth of the deepest discharge :',ValueH1 print 'Depth of the last discharge :',ValueH2 print 'Depth of the average discharge :',ValueH3 print 'Number of charge cycles :',ValueH4 print 'Number of full discharges :',ValueH5 print 'Cumulative Amp Hours drawn :',ValueH6 print 'Minimum main (battery) voltage :',ValueH7 print 'Maximum main (battery) voltage :',ValueH8 print 'Seconds since last full charge :',ValueH9 print 'Number of automatic synchronizations:',ValueH10 print 'Number of low main voltage alarms :',ValueH11 print 'Number of high main voltage alarms :',ValueH12 print 'Minimum auxiliary (battery) voltage :',ValueH15 print 'Maximum auxiliary (battery) voltage :',ValueH16 print 'Amount of discharged energy :',ValueH17 print 'Amount of charged energy :',ValueH18 print 'Main (battery) voltage :',ValueV print 'Auxiliary (starter) voltage :',ValueVS print 'Product ID :',ValuePID print 'Battery current :',ValueI print 'Consumed Amp Hours :',ValueCE print 'State-of-charge :',ValueSOC print 'Time-to-go :',ValueTTG if i >= 24: #print 'SignalK sent...' SignalK = '{"updates": [{"source": {"type": "BAT","src" : "BMV712"},"values":[' SignalK += '{"path": "electrical.batteries.main.voltage","value":'+str(round(ValueV, 2))+'}' SignalK += ',{"path": "electrical.batteries.aux.voltage","value":'+str(round(ValueVS, 2))+'}' SignalK += ',{"path": "electrical.batteries.main.current","value":'+str(round(ValueI, 2))+'}' SignalK += ',{"path": "electrical.batteries.main.capacity.stateOfCharge","value":'+str(ValueSOC)+'}' SignalK += ',{"path": "electrical.batteries.main.capacity.timeRemaining","value":'+str(round(ValueTTG, 1))+'}' SignalK += ']}]}\n' sock.sendto(SignalK, ('localhost', 55559)) i = 0 time.sleep(1.0)