def main(): port='/dev/ttyUSB_bms' while True: try: bmscore.openbms(port) getdat(port) time.sleep(5) except: print('Error de conexion con el bms') exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] print(exc_type, fname, exc_tb.tb_lineno) print(sys.exc_info()) time.sleep(4)
def switchfets(port='/dev/ttyUSB0'): """ switch charge and discharge fets """ print ('(03)=Both FETs off') print ('(01)=Discharge FET on, Charge FET off') print ('(02)=Discharge FET off, Charge FET on') print ('(00)=Both FETs on') usercmd = input("Enter numeric option> ") ser = bmscore.openbms(port) command = bytes.fromhex('DD A5 03 00 FF FD 77') print ('command=',binascii.hexlify(command)) data=bmscore.getbmsdat(ser,command) print ('reply=',binascii.hexlify(data)) command = bytes.fromhex('DD A5 04 00 FF FC 77') print ('command=',binascii.hexlify(command)) data=bmscore.getbmsdat(ser,command) print ('reply=',binascii.hexlify(data)) command = bytes.fromhex('DD 5A 00 02 56 78 FF 30 77') data=bmscore.getbmsdat(ser,command) print ('reply=',binascii.hexlify(data)) usercmd=b'\xE1\x02\x00'+bytes.fromhex(usercmd) command = b'\xDD\x5A'+usercmd+bmscore.crccalc(usercmd).to_bytes(2, byteorder='big')+b'\x77' print (binascii.hexlify(command)) bmscore.getbmsdat(ser,command) command = bytes.fromhex('DD 5A 01 02 00 00 FF FD 77') bmscore.getbmsdat(ser,command)
def getdat(port='/dev/ttyUSB0'): """ Get data from BMS board""" ser = bmscore.openbms(port) command = bytes.fromhex('DD A5 03 00 FF FD 77') dat = bmscore.getbmsdat(ser, command) dat = bmscore.getbmsdat(ser, command) rawi = int.from_bytes(dat[2:4], byteorder='big', signed=True) rawv = int.from_bytes(dat[0:2], byteorder='big', signed=True) balance = bin(int.from_bytes(dat[12:14], byteorder='big', signed=True)) state = int.from_bytes(dat[16:18], byteorder='big', signed=True) fets = bin(int.from_bytes(dat[20:21], byteorder='big', signed=True)) print("V={} I={} bal={} state={} fets={}".format(rawv, rawi, balance, bin(state), fets)) errors=['Cell Overvoltage','Cell Undervoltage','Battery Overvoltage', \ 'Battery Undervoltage','Charge Overtemp','Charge Undertemp', \ 'Discharge Overtemp','Discharge Undertemp','Charge Overcurrent' \ 'Discharge Overcurrent','Short Circuit','IC Fault','Software MOS lock'] for i in range(state.bit_length()): if 2**i & state: print(errors[i]) # line1 = [ 0 for i in range(int(len(dat)))] # for i in range(0,int(len(dat))): # print (dat[i*2:i*2+2]) # print (int.from_bytes(dat[i:i+1], byteorder = 'big')) # line1[i] = int.from_bytes(dat[i:i+1], byteorder = 'big') print(binascii.hexlify(dat)) # print (line1) # voltages command = bytes.fromhex('DD A5 04 00 FF FC 77') voltages = bmscore.getbmsdat(ser, command) ser.close print(binascii.hexlify(voltages)) rawv = [0.0 for i in range(15)] for i in range(15): rawv[i] = int.from_bytes(voltages[i * 2:i * 2 + 2], byteorder='big') / 1000.00 # rawv[i] = rawv[i]+rawv[i-1] print(rawv) command = bytes.fromhex('DD A5 05 00 FF FB 77') dat = bmscore.getbmsdat(ser, command) # line1 = [ 0 for i in range(int(len(dat)))] # for i in range(0,int(len(dat))): # print (dat[i*2:i*2+2]) # print (int.from_bytes(dat[i:i+1], byteorder = 'big')) # line1[i] = int.from_bytes(dat[i:i+1], byteorder = 'big') print(binascii.hexlify(dat))
def getdat(port='/dev/ttyUSB0'): """ Get data from BMS board""" ser = bmscore.openbms(port) command = bytes.fromhex('DD A5 03 00 FF FD 77') dat = bmscore.getbmsdat(ser, command) rawi = int.from_bytes(dat[2:4], byteorder='big', signed=True) rawv = int.from_bytes(dat[0:2], byteorder='big', signed=True) balance = int.from_bytes(dat[12:14], byteorder='big', signed=True) state = int.from_bytes(dat[16:18], byteorder='big', signed=True) fets = int.from_bytes(dat[20:21], byteorder='big', signed=True) print("V={} I={} bal={} state={} fets={}".format(rawv, rawi, balance, state, fets)) # line1 = [ 0 for i in range(int(len(dat)))] # for i in range(0,int(len(dat))): # print (dat[i*2:i*2+2]) # print (int.from_bytes(dat[i:i+1], byteorder = 'big')) # line1[i] = int.from_bytes(dat[i:i+1], byteorder = 'big') print(binascii.hexlify(dat)) # print (line1) # voltages command = bytes.fromhex('DD A5 04 00 FF FC 77') voltages = bmscore.getbmsdat(ser, command) ser.close print(binascii.hexlify(voltages)) rawv = [0.0 for i in range(15)] for i in range(15): rawv[i] = int.from_bytes(voltages[i * 2:i * 2 + 2], byteorder='big') / 1000.00 rawv[i] = rawv[i] + rawv[i - 1] print(rawv) command = bytes.fromhex('DD A5 05 00 FF FB 77') dat = bmscore.getbmsdat(ser, command) # line1 = [ 0 for i in range(int(len(dat)))] # for i in range(0,int(len(dat))): # print (dat[i*2:i*2+2]) # print (int.from_bytes(dat[i:i+1], byteorder = 'big')) # line1[i] = int.from_bytes(dat[i:i+1], byteorder = 'big') print(binascii.hexlify(dat))
def getdat(port='/dev/ttyUSB0'): """ Get data from BMS board""" ser = bmscore.openbms(port) command = bytes.fromhex('DD A5 03 00 FF FD 77') dat = bmscore.getbmsdat(ser,command) rawi = int.from_bytes(dat[2:4], byteorder = 'big',signed=True) rawv = int.from_bytes(dat[0:2], byteorder = 'big',signed=True) balance = int.from_bytes(dat[12:14], byteorder = 'big',signed=True) state = int.from_bytes(dat[16:18], byteorder = 'big',signed=True) fets = int.from_bytes(dat[20:21], byteorder = 'big',signed=True) print ("V={} I={} bal={} state={} fets={}".format(rawv,rawi,balance,state,fets)) # line1 = [ 0 for i in range(int(len(dat)))] # for i in range(0,int(len(dat))): # print (dat[i*2:i*2+2]) # print (int.from_bytes(dat[i:i+1], byteorder = 'big')) # line1[i] = int.from_bytes(dat[i:i+1], byteorder = 'big') print (binascii.hexlify(dat)) # print (line1) # voltages command = bytes.fromhex('DD A5 04 00 FF FC 77') voltages = bmscore.getbmsdat(ser,command) ser.close print (binascii.hexlify(voltages)) rawv = [ 0.0 for i in range(15)] for i in range(15): rawv[i] = int.from_bytes(voltages[i*2:i*2+2], byteorder = 'big')/1000.00 rawv[i] = rawv[i]+rawv[i-1] print (rawv) command = bytes.fromhex('DD A5 05 00 FF FB 77') dat = bmscore.getbmsdat(ser,command) # line1 = [ 0 for i in range(int(len(dat)))] # for i in range(0,int(len(dat))): # print (dat[i*2:i*2+2]) # print (int.from_bytes(dat[i:i+1], byteorder = 'big')) # line1[i] = int.from_bytes(dat[i:i+1], byteorder = 'big') print (binascii.hexlify(dat))
def switchfets(port='/dev/ttyUSB0'): """ switch charge and discharge fets """ print ('(03)=Both FETs off') print ('(01)=Charge FET on, Discharge FET off') print ('(02)=Charge FET off, Discharge FET on') print ('(00)=Both FETs on') usercmd = input("Enter numeric option> ") ser = bmscore.openbms(port) command = bytes.fromhex('DD A5 03 00 FF FD 77') print ('command=',binascii.hexlify(command)) data=bmscore.getbmsdat(ser,command) print ('reply=',binascii.hexlify(data)) command = bytes.fromhex('DD A5 04 00 FF FC 77') print ('command=',binascii.hexlify(command)) data=bmscore.getbmsdat(ser,command) print ('reply=',binascii.hexlify(data)) command = bytes.fromhex('DD 5A 00 02 56 78 FF 30 77') getbmsdat(ser,command) usercmd=b'\xE1\x02\x00'+bytes.fromhex(usercmd) command = b'\xDD\x5A'+usercmd+bmscore.crccalc(usercmd).to_bytes(2, byteorder='big')+b'\x77' print (binascii.hexlify(command)) bmscore.getbmsdat(ser,command) command = bytes.fromhex('DD 5A 01 02 00 00 FF FD 77') bmscore.getbmsdat(ser,command)
def getdat(port='/dev/ttyUSB0'): """ Get data from BMS board""" ser = bmscore.openbms(port) # status command = bytes.fromhex('DD A5 03 00 FF FD 77') dat = bmscore.getbmsdat(ser,command) rawi = int.from_bytes(dat[2:4], byteorder = 'big',signed=True) rawv = int.from_bytes(dat[0:2], byteorder = 'big',signed=True) balance = bin(int.from_bytes(dat[12:14], byteorder = 'big',signed=True)) state = int.from_bytes(dat[16:18], byteorder = 'big',signed=True) fets = bin(int.from_bytes(dat[20:21], byteorder = 'big',signed=True)) print ("V={} I={} bal={} state={} fets={}".format(rawv,rawi,balance,bin(state),fets)) errors=['Cell Overvoltage','Cell Undervoltage','Battery Overvoltage', \ 'Battery Undervoltage','Charge Overtemp','Charge Undertemp', \ 'Discharge Overtemp','Discharge Undertemp','Charge Overcurrent' \ 'Discharge Overcurrent','Short Circuit','IC Fault','Software MOS lock'] for i in range(state.bit_length()): if 2**i & state: print (errors[i]) # voltages command = bytes.fromhex('DD A5 04 00 FF FC 77') voltages = bmscore.getbmsdat(ser,command) ser.close #print (binascii.hexlify(voltages)) rawv = [ 0 for i in range(19)] rawb = [ 0 for i in range(15)] rawt = {} total = 0 mini=0 maxi=0 for i in range(15): rawv[i] = int.from_bytes(voltages[i*2:i*2+2], byteorder = 'big')#/1000.00 #Suma total += rawv[i] #Serie minima if (mini==0): mini=rawv[i] else: if (rawv[i] < mini): mini=rawv[i] #Serie maxima if (rawv[i] > maxi): maxi=rawv[i] if (i == 0): rawb[i] = int.from_bytes(dat[12:14], byteorder = 'big',signed=True) & 1 else: rawb[i] = int.from_bytes(dat[12:14], byteorder = 'big',signed=True) >> i & 1 # temperaturas for i in range(int.from_bytes(dat[22:23],'big')): # read temperatures rawt['T{0:0=1}'.format(i+1)]=(int.from_bytes(dat[23+i*2:i*2+25],'big')-2731)/10 rawv[15] = total; rawv[16] = mini; rawv[17] = maxi; rawv[18] = maxi - mini; print (rawv) print (rawb) print (rawt) emoncms(rawv,rawb,rawt)
def main(): print (sys.argv) if len(sys.argv) == 2: sendcmd(sys.argv[1]) elif len(sys.argv) == 3: sendcmd(sys.argv[1],sys.argv[2]) elif len(sys.argv) == 1: print ('Enter BMS port address option [3]') print ('(1) /dev/ttyUSB0') print ('(2) /dev/ttyUSB1') print ('(3) other') port=int(getcmd()) if port==1: port='/dev/ttyUSB0' elif port == 2: port='/dev/ttyUSB1' else: port=str(input("Enter port name>")) while True: bmscore.openbms(port) print('Enter option') print('(1) Load all config data from BMS to memory') print('(2) Read all config data from disk to memory') print('(3) Write all config data from memory to BMS') print('(4) Write all config data from memory to disk') print('(5) Dump all config data in memory') print('(6) Dump raw config data in memory') print('(7) Read/Write config item in memory') print('(8) Read/Write single register in memory and on BMS PCB') print('(9) Read BMS data') print('(10) Switch charge/discharge FETs') cmd=int(getcmd()) if cmd==1: bmscore.configitems(bmscore.fullconfiglist,port) elif cmd==2: file=str(input("Enter filename>")) bmscore.configinmem=bmscore.rdjson(file) elif cmd==3: bmscore.configitems(bmscore.fullconfiglist,port,write=True) elif cmd==4: file=str(input("Enter filename>")) bmscore.wrjson(file,bmscore.configinmem) elif cmd ==5: count = 0 for i in bmscore.configinmem: print ('{}={}{}'.format(i,bmscore.configinmem[i]['value'],bmscore.configinmem[i]['units'])) count=count+1 if count%30==0: x=input("press return for next page") elif cmd==7: changereg() elif cmd==6: count=0 for i in bmscore.configinmem: print (i,bmscore.configinmem[i]) count=count+1 if count%30==0: x=input("press return for next page") elif cmd==8: reg=[] reg.append(changereg()) if reg!=[None]: bmscore.configitems(reg,port,write=True) elif cmd==9: getdat(port) elif cmd ==10: switchfets(port)
def main(): print(sys.argv) if len(sys.argv) == 2: sendcmd(sys.argv[1]) elif len(sys.argv) == 3: sendcmd(sys.argv[1], sys.argv[2]) elif len(sys.argv) == 1: print('Enter BMS port address option [3]') print('(1) /dev/ttyUSB0') print('(2) /dev/ttyUSB1') print('(3) other') port = int(getcmd()) if port == 1: port = '/dev/ttyUSB0' elif port == 2: port = '/dev/ttyUSB1' else: port = str(input("Enter port name>")) while True: bmscore.openbms(port) print('Enter option') print('(1) Load all config data from BMS to memory') print('(2) Read all config data from disk to memory') print('(3) Write all config data from memory to BMS') print('(4) Write all config data from memory to disk') print('(5) Dump all config data in memory') print('(6) Dump raw config data in memory') print('(7) Read/Write config item in memory') print('(8) Read/Write single register in memory and on BMS PCB') print('(9) Read BMS data') print('(10) Switch charge/discharge FETs') print('(11) Calibrate BMS') cmd = int(getcmd()) if cmd == 1: bmscore.configitems(bmscore.fullconfiglist, port) elif cmd == 2: file = str(input("Enter filename>")) bmscore.configinmem = bmscore.rdjson(file) elif cmd == 3: bmscore.configitems(bmscore.fullconfiglist, port, write=True) elif cmd == 4: file = str(input("Enter filename>")) bmscore.wrjson(file, bmscore.configinmem) elif cmd == 5: count = 0 for i in bmscore.configinmem: print ('{}={}{} {}'.format \ (i,bmscore.configinmem[i]['value'],bmscore.configinmem[i]['units'],bmscore.configinmem[i]['comment'])) count = count + 1 if count % 30 == 0: x = input("press return for next page") elif cmd == 7: reg = enterreg() chgreg(reg) elif cmd == 6: count = 0 for i in bmscore.configinmem: print(i, bmscore.configinmem[i]) count = count + 1 if count % 30 == 0: x = input("press return for next page") elif cmd == 8: reg = enterreg() if reg[[*reg][0]]: chgreg(reg) bmscore.configitems(reg, port, write=True) elif cmd == 9: getdat(port) elif cmd == 10: switchfets(port) elif cmd == 11: print('Enter Item to Calibrate?') print('(1) Cell Voltages') print('(2) Battery Current') item = int(getcmd()) if item == 1: item = input("Enter cell number/s e.g. '1-4,5'?> ") result = set() for part in item.split(','): x = part.split('-') result.update(range(int(x[0]), int(x[-1]) + 1)) celllist = sorted(result) cellvolts = int(input("Enter cell voltage/s in mV?> ")) reglist = {} for i in range(len(celllist)): reg = findregname( str.upper(format(celllist[i] + 0xAF, '02x'))) reglist[reg] = cellvolts chgreg(reglist) bmscore.configitems(reglist, port, write=True, calibrate=True) elif item == 2: print("Enter current type?> ") print('(1) Idle Current') print('(2) Charge Current') print('(3) Discharge Current') item = int(getcmd()) if item == 1: reg = 'CalibrateIdleA' elif item == 2: reg = 'CalibrateChgA' elif item == 3: reg = 'CalibrateDchgA' current = int(input("Enter Measured Current in A> ")) reginfo = {reg: current} chgreg(reginfo) bmscore.configitems(reginfo, port, write=True, calibrate=True)
def main(): print (sys.argv) if len(sys.argv) == 2: sendcmd(sys.argv[1]) elif len(sys.argv) == 3: sendcmd(sys.argv[1],sys.argv[2]) elif len(sys.argv) == 1: print ('Enter BMS port address option [3]') print ('(1) /dev/ttyUSB0') print ('(2) /dev/ttyUSB1') print ('(3) other') port=int(getcmd()) if port==1: port='/dev/ttyUSB0' elif port == 2: port='/dev/ttyUSB1' else: port=str(input("Enter port name>")) while True: bmscore.openbms(port) print('Enter option') print('(1) Load all config data from BMS to memory') print('(2) Read all config data from disk to memory') print('(3) Write all config data from memory to BMS') print('(4) Write all config data from memory to disk') print('(5) Dump all config data in memory') print('(6) Dump raw config data in memory') print('(7) Read/Write config item in memory') print('(8) Read/Write single register in memory and on BMS PCB') print('(9) Read BMS data') cmd=int(getcmd()) if cmd==1: bmscore.configitems(bmscore.fullconfiglist,port) elif cmd==2: file=str(input("Enter filename>")) bmscore.configinmem=bmscore.rdjson(file) elif cmd==3: bmscore.configitems(bmscore.fullconfiglist,port,write=True) elif cmd==4: file=str(input("Enter filename>")) bmscore.wrjson(file,bmscore.configinmem) elif cmd ==5: count = 0 for i in bmscore.configinmem: print ('{}={}{}'.format(i,bmscore.configinmem[i]['value'],bmscore.configinmem[i]['units'])) count=count+1 if count%30==0: x=input("press return for next page") elif cmd==7: changereg() elif cmd==6: count=0 for i in bmscore.configinmem: print (i,bmscore.configinmem[i]) count=count+1 if count%30==0: x=input("press return for next page") elif cmd==8: reg=[] reg.append(changereg()) if reg!=[None]: bmscore.configitems(reg,port,write=True) elif cmd==9: getdat(port)
# many inspiration got from here https://endless-sphere.com/forums/viewtopic.php?t=91672 # and basic communication is based on this https://github.com/simat/BatteryMonitor/wiki import bmscore from bms import Bms from Oled import Oled from Loop import Loop import sys import json import signal from twisted.python import log from twisted.internet import reactor from autobahn.twisted.websocket import WebSocketServerProtocol, WebSocketServerFactory protocol_config = bmscore.rdjson("protocolConfig.json") ser = bmscore.openbms() bms = Bms(ser, protocol_config) display = Oled(128, 64, bms) display.splash("BMS", bms.vendor) def signal_handler(signal, frame): global keep_running keep_running = False loop.exit() print("Received SIGINT - Shutting down") reactor.stop()