class kamstrup(object): def __init__(self, serial_port = "/dev/cuaU0",): logging.info('kamstrup class started') self.comm = MBus('serial', device=serial_port) self.DATA = {} def read_data(self, ID = 254): self.comm.write_ShortFrame(CF=0x5b, AF=ID) userdata = self.comm.read() logging.info('MC302, userdata: {}'.format(userdata)) if userdata != None and len(userdata) > 12: data_header = userdata[0:12] data = userdata[12:] else: data = None return data def convert_data(self, userdata): if type(userdata) == type(None): return None n = 0 #print('DATA out: ', len(userdata)) while n < len(userdata)-2:# and n < 80: remaining = len(userdata[n:]) n_ori = n error = False while userdata[n] == 0x00: n += 1 #print(userdata[n:n+7]) _dif = userdata[n] #print('DIF: ', _dif) if _dif in DIF: #print(DIF[_dif]) pass else: #print('error: dif: ', n, _dif) logging.warn('setting error : {} becaurse DIF is not registeres : '.format(True, _dif)) error = True _vif = userdata[n+1] if _vif in VIF: #print(VIF[_vif]) pass else: logging.warn('setting error : {} becaurse VIF is not registeres : '.format(True, _vif)) #print('error: vif: ', n, _vif) error = True if error == False and remaining > 2+DIF[_dif]['length']: _values = userdata[n+2:n+2+DIF[_dif]['length']] v = DIF[_dif]['fun'](_values) * VIF[_vif]['size'] #print(v) self.DATA[_vif] = {'value': None, 'time': time.time(), 'name':VIF[_vif]['subject']} n += 2+DIF[_dif]['length'] try: self.DATA[_vif]['value'] = float(v) #print(VIF[_vif]['subject'], ' V: ', v) except: logging.warn('Cant conver to float {}'.format(v)) self.DATA[_vif]['value'] = None else: logging.warn('error already exist n: {}'.format(n)) #print(userdata[n-8:n+8]) #print('dif: ', _dif, ' vif: ', _vif) if _dif in DIF: n += 2+DIF[_dif]['length'] else: n += 6 if n_ori == n: n += 1 return self.DATA def read_water_temperature(self,ID): raw_data = self.read_data(ID=ID) try: con_data = self.convert_data(raw_data) except: logging.warn('failed to convert data from MC302') result = {'inlet': None, 'outlet': None, 'diff': None, 'flow': None} inlet = None outlet = None diff = None try: result['inlet'] = self.DATA[0x59]['value'] result['outlet'] = self.DATA[0x5d]['value'] result['diff'] = self.DATA[0x61]['value'] result['flow'] = self.DATA[0x3b]['value'] except: logging.warn('DATA is is not registered') result['inlet'] = None result['outlet'] = None result['diff'] = None result['flow'] = None return result def run(self,): pass def close(self): self.comm.close()