Example #1
0
class TestoDevice(object):
    ##################################################################################################################
    # variables
    ##################################################################################################################
    name = None
    address = None
    adapter = None
    device = None
    
    ##################################################################################################################
    # FUNCTIONS DEFINITION
    ##################################################################################################################
    # constructor        
    def __init__(self, name, address, adapter):
        self.name = name
        self.address = address
        self.adapter = adapter
        self.battery = 0.0
        self.temperature = 0.0
        self.velocity = 0.0
        self.data_to_log = bytearray()
        self.dataFileTemperature = DataFile(self.name, 'Temperature')
        self.dataFileVelocity = DataFile(self.name, 'Velocity')
        self.dataFileBatteryLevel = DataFile(self.name, 'BatteryLevel')
        
        print "Create testo device with name: ", self.name, " address: ", self.address
        self.connect()
        
    def connect(self):
        print "Trying to connect with: ", self.name
#        self.adapter.start()
        self.device = self.adapter.connect(self.address, 10.0)
        
        if self.device._connected:
            print "Connected with: ", self.name
            aa = self.device.discover_characteristics()
            print "Characteristic from with: ", self.name
            for bb in aa:
                #print aa[bb].uuid, aa[bb].handle, aa[bb].descriptors,
                try:
                    if aa[bb].handle == 3 or aa[bb].handle ==24:
                        value = self.device.char_read(bb, 1)
                        print "Characterostic handle:\t", aa[bb].handle, "value\t", value
                    #value2 = self.device.char_read_handle(aa[bb].handle, 1)
                    #print aa[bb].handle, 'value2:\t ", "%02X'% value2

                    #for ch in value:
                    #    print ch, '\t', chr(ch),         
                    if aa[bb].handle == 40:
                        print "Subscrobe to handle: ", aa[bb].handle
                        self.device.subscribe(bb, callback=self.callback_fun)
                        time.sleep(1)                       
                except pygatt.exceptions.NotificationTimeout:
                    print "TIMEOUT"                    
                except:
                    print "Error:", sys.exc_info()
            
            self.device.char_write_handle(37, self.convert_str_bytearray('5600030000000c69023e81'), True, 5)
            self.device.char_write_handle(37, self.convert_str_bytearray('200000000000077b'), True, 5)
            self.device.char_write_handle(37, self.convert_str_bytearray('04001500000005930f0000004669726d77617265'), True, 5)
            self.device.char_write_handle(37, self.convert_str_bytearray('56657273696f6e304f'), True, 5)
            self.device.char_write_handle(37, self.convert_str_bytearray('04001500000005930f0000004669726d77617265'), True, 5)
            self.device.char_write_handle(37, self.convert_str_bytearray('56657273696f6e304f'), True, 5)
            self.device.char_write_handle(37, self.convert_str_bytearray('04001600000005d7100000004d6561737572656d'), True, 5)
            self.device.char_write_handle(37, self.convert_str_bytearray('656e744379636c656161'), True, 5)
            self.device.char_write_handle(37, self.convert_str_bytearray('110000000000035a'), True, 5)
                                
            #print self.device.get_rssi()
            #print self.device._connected
    def callback_fun(self, handle, data):
        if data[0]==16:
            self.data_to_log = bytearray()
            self.data_to_log = self.data_to_log + data
        else:
            self.data_to_log = self.data_to_log + data

            print (datetime.datetime.now().strftime("%H:%M:%S>") + ' ' + self.name + '> '),
            if len(self.data_to_log) > 12:
                if self.data_to_log[12]==0x42: #B > BatteryLevel
                    print (self.data_to_log[12:24] + ' '),
                    print (str(struct.unpack('f', self.data_to_log[24:28])[0]))
                    self.battery = struct.unpack('f', self.data_to_log[24:28])[0] 
                    self.dataFileBatteryLevel.addRow(datetime.datetime.now().strftime("%H:%M:%S") ,self.battery)
                if self.data_to_log[12]==0x54: #T > Temperature
                    print (self.data_to_log[12:23] + ' '),
                    print (str(struct.unpack('f', self.data_to_log[23:27])[0]))
                    self.temperature = struct.unpack('f', self.data_to_log[23:27])[0]
                    self.dataFileTemperature.addRow(datetime.datetime.now().strftime("%H:%M:%S") ,self.temperature) 
                if self.data_to_log[12]==0x56: #V > Velocity
                    print (self.data_to_log[12:20] + ' '),
                    print (str(struct.unpack('f', self.data_to_log[20:24])[0]))
                    self.velocity = struct.unpack('f', self.data_to_log[20:24])[0]
                    self.dataFileVelocity.addRow(datetime.datetime.now().strftime("%H:%M:%S") ,self.velocity)
        
    def convert_str_bytearray(self, s):
        split_string = lambda x, n: [x[i:i+n] for i in range(0, len(x), n)]
        a = split_string(s,2)
        ba = bytearray()
        for z in a:
            ba.append(int(z,16))
    
        return ba