Beispiel #1
0
 def __init__(self, serial_port = "/dev/cuaU0",):
     logging.info('kamstrup class started')
     self.comm = MBus('serial', device=serial_port)
     self.DATA = {}
Beispiel #2
0
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()