Example #1
0
class FitBitClient(object):
    CLIENT_UUID = "2ea32002-a079-48f4-8020-0badd22939e3"
    FITBIT_HOST = "client.fitbit.com"
    START_PATH = "/device/tracker/uploadData"

    def __init__(self, debug=False):
        self.info_dict = {}
        self.log_info = {}
        self.time = time.time()
        self.data = []
        conn = getConn()
        if conn is None:
            print "No base found!"
            exit(1)
        base = ANT(conn)
        self.fitbit = FitBit(base)
        if not self.fitbit:
            print "No devices connected!"
            exit(1)

    def __del__(self):
        self.close()
        self.fitbit = None

    def form_base_info(self, remote_info=None):
        self.info_dict.clear()
        self.info_dict["beaconType"] = "standard"
        self.info_dict["clientMode"] = "standard"
        self.info_dict["clientVersion"] = "1.0"
        self.info_dict["os"] = "libfitbit"
        self.info_dict["clientId"] = self.CLIENT_UUID
        if remote_info:
            self.info_dict.update(remote_info)
        for f in ['deviceInfo.serialNumber','userPublicId']:
            if f in self.info_dict:
                self.log_info[f] = self.info_dict[f]

    def dump_connection(self, directory='~/.fitbit'):
        directory = os.path.expanduser(directory)
        data = yaml.dump(self.data)
        if 'userPublicId' in self.log_info:
            directory = os.path.join(directory, self.log_info['userPublicId'])
            if not os.path.isdir(directory):
                os.makedirs(directory)
            f = open(os.path.join(directory,'connection-%d.txt' % int(self.time)), 'w')
            f.write(data)
            f.close()
        print data

    def close(self):
        self.dump_connection()
        print 'Closing USB device'
        try:
            self.fitbit.base.connection.close()
        except AttributeError:
            pass
        self.fitbit.base = None

    def run_upload_requests(self):
        self.fitbit.init_tracker_for_transfer()

        conn = FitBitRequest(self.FITBIT_HOST, self.START_PATH, https=True)

        # Start the request Chain
        self.form_base_info()
        while conn is not None:
            self.form_base_info(conn.response)

            self.info_dict.update(conn.run_opcodes(self.fitbit))

            conn.upload(self.info_dict)

            self.data.append(conn.dump())
            conn = conn.getNext()

        self.fitbit.command_sleep()