예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
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))
예제 #4
0
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))
예제 #5
0
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))
예제 #6
0
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)
예제 #7
0
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)
예제 #8
0
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)
예제 #9
0
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)
예제 #10
0
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)
예제 #11
0
# 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()