示例#1
0
 def do_reluser(self, params):
     if args.mode == "db":
         try:
            l = params.split()
            dev_id = int(l[0])
            user_id = int(l[1])
         except ValueError:
            print "*** argument should be number"
            return
         except IndexError:
            print "*** reluser takes at least one parameter"
            return
         if dev_id >= len(self.mibands.keys()):
             print "*** device not in the device list"
             return
         udata = mbdb.get_user_data(cnxn_string, user_id)
         if udata:
             if mbdb.is_device_registered(cnxn_string, self.mibands.keys()[dev_id]):
                 if self.mibands.keys()[dev_id] in connected_devices.keys():
                     mb = connected_devices[self.mibands.keys()[dev_id]]
                     if mbdb.release_device_user(cnxn_string, mb.addr, user_id):
                         print "MiBand Released from user"
                     else:
                         print "There was a problem releasing this MiBand"
                 else:
                     print("MiBand should be connected before releasing user data")
             else:
                 print("MiBand should be registered before releasing user data")
         else:
             print("*** user with id %s doesn't exist" % user_id)
     else:
         # TODO: If storage, release properly
         print("This operation is only available for DB mode")
示例#2
0
 def do_unregister(self, params):
     try:
        l = int(params)
     except ValueError:
        print "*** argument should be number"
        return
     except IndexError:
        print "*** unregister takes at least one parameter"
        return
     dev_id = l
     if dev_id >= len(self.mibands.keys()):
         print "*** device not in the device list"
         return
     if ((args.mode == "db" and mbdb.is_device_registered(cnxn_string, self.mibands.keys()[dev_id]))
         or args.mode == "json" and self.mibands.keys()[dev_id] in self.registered_devices):
         if not self.mibands.keys()[dev_id] in connected_devices.values():
             try:
                 if args.mode == "db":
                     mbdb.unregister_device(cnxn_string, self.mibands.keys()[dev_id])
                     mbdb.delete_all_alarms(cnxn_string, self.mibands.keys()[dev_id])
                 else:
                     self.registered_devices.remove(self.mibands.keys()[dev_id])
                     del self.devices_keys[self.mibands.keys()[dev_id]]
                 print("MiBand unregistered!")
             except BTLEException:
                 print("There was a problem unregistering this MiBand, try again later")
         else:
             print("Disconnect the miBand2 first!")
     else:
         print("That MiBand is not registered")
示例#3
0
 def do_alert(self, params):
     l = params.split()
     if len(l)!=2:
        print "*** invalid number of arguments"
        return
     try:
        l = [int(i) for i in l]
     except ValueError:
        print "*** arguments should be numbers"
        return
     except IndexError:
        print "*** alert takes at least one parameter"
        return
     dev_id = int(l[0])
     if dev_id >= len(self.mibands.keys()):
         print "*** device not in the device list"
         return
     alert_int = int(l[1])
     if ((args.mode == "db" and mbdb.is_device_registered(cnxn_string, self.mibands.keys()[dev_id]))
         or args.mode == "json" and self.mibands.keys()[dev_id] in self.registered_devices):
         if self.mibands.keys()[dev_id] in connected_devices.keys():
             try:
                 mb = connected_devices[self.mibands.keys()[dev_id]]
                 data = struct.pack('B', alert_int)
                 mb.send_alert(data)
                 print "Sending Notification: " + binascii.hexlify(data)
             except BTLEException:
                 print("There was a problem alerting this MiBand, try again later")
         else:
             print("That MiBand is not connected!")
     else:
         print("That MiBand is not registered")
示例#4
0
 def do_devices(self, line):
     tmp_mibands = copy.deepcopy(self.scd.tmp_devices)
     self.mibands = {k: v["device"] for k, v in tmp_mibands.items()}
     self.models = {k: v["model"] for k, v in tmp_mibands.items()}
     tmp_strikes = {k: v["strikes"] for k, v in tmp_mibands.items()}
     for idx,mb in enumerate(self.mibands.keys()):
         name = "Someone"
         uid = 0
         udata = None
         if args.mode == "db":
             devid = mbdb.get_device_id(cnxn_string, mb.upper())
             devuser = mbdb.get_device_user(cnxn_string, devid)
             if devuser != -1:
                 udata = mbdb.get_user_data(cnxn_string,devuser)
             else:
                 udata = None
         else:
             # TODO: User Data on local storage???
             pass
         if udata:
             name = udata["alias"]
             uid = udata["id"]
         model = self.models[self.mibands.keys()[idx]].upper()
         str = "[%s]%10s's %s <U:%05d> (%s) %sdB S:%s " % (idx, name, model, uid, mb, self.mibands[self.mibands.keys()[idx]].rssi, "X"*tmp_strikes[self.mibands.keys()[idx]])
         if (args.mode == "db" and mbdb.is_device_registered(cnxn_string, mb)) or (args.mode == "json" and mb in self.registered_devices):
             str += "[R]"
         if mb in connected_devices:
             mb_dev = connected_devices[mb]
             if args.mode == "db":
                 mbdb.update_battery(cnxn_string, mb_dev.addr, mb_dev.battery_info['level'])
             str += "[C] [B:{0:03d}%]".format(mb.battery_info["level"])
         print str
示例#5
0
 def do_setuser(self, params):
     try:
        l = params.split()
        dev_id = int(l[0])
        if args.mode == "db":
            user_id = int(l[1])
        else:
            # TODO: Not persisted
            user_alias = l[1]
            if l[2] == "M":
                user_gender = 0
            elif l[2] == "F":
                user_gender = 1
            else:
                user_gender = 2
            user_bd_year = int(l[3])
            user_bd_month = int(l[4])
            user_bd_day = 0
            user_weight = float(l[5])
            user_height = int(l[6])
        position = None
        if l[2] == "left":
            position = (0, "left")
        elif l[2] == "right":
            position = (1, "right")
        else:
            print("*** only left and right supported")
            return
     except ValueError:
        print "*** argument should be number"
        return
     except IndexError:
        print "*** setuser takes at least one parameter"
        return
     if dev_id >= len(self.mibands.keys()):
         print "*** device not in the device list"
         return
     if args.mode == "db":
         udata = mbdb.get_user_data(cnxn_string, user_id)
     if udata or args.mode == "json":
         if ((args.mode == "db" and mbdb.is_device_registered(cnxn_string, self.mibands.keys()[dev_id]))
             or args.mode == "json" and self.mibands.keys()[dev_id] in self.registered_devices):
             if self.mibands.keys()[dev_id] in connected_devices.keys():
                 mb = connected_devices[self.mibands.keys()[dev_id]]
                 if args.mode == "db":
                     if mbdb.set_device_user(cnxn_string, mb.addr, user_id, position[0]):
                         mb.setUserInfo(udata["alias"], udata["sex"], udata["height"], udata["weight"], udata["birth"])
                 else:
                     mb.setUserInfo(user_alias, user_gender, user_height, user_weight, (user_bd_year, user_bd_month, user_bd_day))
                 mb.setWearLocation(position[1])
             else:
                 print("MiBand should be connected before setting user data")
         else:
             print("MiBand should be registered before setting user data")
     else:
         print("*** user with id %s doesn't exist" % user_id)
示例#6
0
    def configure_miband(self, dev_id, preset):
        if dev_id >= len(self.mibands.keys()):
            print "*** device not in the device list"
            return
        if ((args.mode == "db" and mbdb.is_device_registered(cnxn_string, self.mibands.keys()[dev_id]))
            or args.mode == "json" and self.mibands.keys()[dev_id] in self.registered_devices):
            if self.mibands.keys()[dev_id] in connected_devices.keys():
                try:
                    mb = connected_devices[self.mibands.keys()[dev_id]]
                    print("Configuring MiBand to [%s] presets" % preset)
                    if config.has_option(preset, "MonitorHRSleep"):
                        mb.monitorHeartRateSleep(config.getint(preset, "MonitorHRSleep"))
                    if config.has_option(preset, "MonitorHRInterval"):
                        mb.setMonitorHeartRateInterval(config.getint(preset, "MonitorHRInterval"))
                    if config.has_option(preset, "DisplayTimeFormat"):
                        mb.setDisplayTimeFormat(config.get(preset, "DisplayTimeFormat"))
                    if config.has_option(preset, "DisplayTimeHours"):
                        mb.setDisplayTimeHours(config.getint(preset, "DisplayTimeHours"))
                    if config.has_option(preset, "DistanceUnit"):
                        mb.setDistanceUnit(config.get(preset, "DistanceUnit"))
                    if config.has_option(preset, "LiftWristActivate"):
                        mb.setLiftWristToActivate(config.getint(preset, "LiftWristActivate"))
                    if config.has_option(preset, "RotateWristSwitch"):
                        mb.setRotateWristToSwitchInfo(config.getint(preset, "RotateWristSwitch"))
                    if config.has_option(preset, "DisplayItems"):
                        disp = [x.strip() for x in config.get(preset, 'DisplayItems').split(',')]
                        steps = True if 'steps' in disp else False
                        distance = True if 'distance' in disp else False
                        calories = True if 'calories' in disp else False
                        heartrate = True if 'heartrate' in disp else False
                        battery = True if 'battery' in disp else False
                        mb.setDisplayItems(steps=steps, distance=distance, calories=calories, heartrate=heartrate, battery=battery)
                    if config.has_option(preset, "DoNotDisturb"):
                        enableLift = config.getint(preset, "DoNotDisturbLift") if config.has_option(preset, "DoNotDisturbLift") else 1
                        mb.setDoNotDisturb(config.get(preset, "DoNotDisturb"), enableLift=enableLift)
                    if config.has_option(preset, "InactivityWarnings"):
                        start = config.getint(preset, "InactivityWarningsStart") if config.has_option(preset, "InactivityWarningsStart") else 8
                        end = config.getint(preset, "InactivityWarningsEnd") if config.has_option(preset, "InactivityWarningsEnd") else 19
                        threshold = config.getint(preset, "InactivityWarningsThresholdHours") if config.has_option(preset, "InactivityWarningsThresholdHours") else 1
                        mb.setInactivityWarnings(config.getint(preset, "InactivityWarnings"), threshold=threshold*60, start=(start, 0), end=(end, 0))
                    if config.has_option(preset, "DisplayCaller"):
                        mb.setDisplayCaller(config.getint(preset, "DisplayCaller"))

                except BTLEException as e:
                    print("There was a problem configuring this MiBand, try again later")
                    print e
            else:
                print("That MiBand is not connected, please connect it before configuring.")
        else:
            print("That MiBand is not registered, please register it before configuring.")
示例#7
0
 def do_connect(self, params):
     try:
        l = int(params)
     except ValueError:
        print "*** argument should be number"
        return
     except IndexError:
        print "*** connect takes at least one parameter"
        return
     dev_id = l
     if dev_id >= len(self.mibands.keys()):
         print "*** device not in the device list"
         return
     if len(connected_devices.keys()) >= 5:
         print("Can't connect to more than 5 devices at the same time, disconnect some")
     else:
         if ((args.mode == "db" and mbdb.is_device_registered(cnxn_string, self.mibands.keys()[dev_id]))
             or args.mode == "json" and self.mibands.keys()[dev_id] in self.registered_devices):
             if self.mibands.keys()[dev_id] in connected_devices.keys():
                 print("That MiBand is already connected")
             else:
                 try:
                     addr = self.mibands.keys()[dev_id]
                     model = self.models[addr]
                     if not addr in self.devices_keys.keys():
                         self.devices_keys[addr] = random_key()
                     if model.upper() == "MB2":
                         mb = MiBand2(addr, self.devices_keys[addr], initialize=False)
                     elif model.upper() == "MB3":
                         mb = MiBand3(addr, self.devices_keys[addr], initialize=False)
                     connected_devices[self.mibands.keys()[dev_id]] = mb
                     if args.mode == "db":
                         alarms = mbdb.get_device_alarms(cnxn_string, mb.addr)
                         mbdb.update_battery(cnxn_string, mb.addr, mb.battery_info['level'])
                     else:
                         if mb.addr in self.devices_alarms.keys():
                             alarms = self.devices_alarms[mb.addr]
                         else:
                             alarms = []
                     for a in alarms:
                         mb.alarms += [MiBandAlarm(a["hour"], a["minute"], enabled=a["enabled"], repetitionMask=a["repetition"])]
                 except BTLEException as e:
                     print("There was a problem connecting to this MiBand, try again later")
                     print e
         else:
             print("You have to register the MiBand before connecting to it")
示例#8
0
 def do_register(self, params):
     try:
        l = int(params)
     except ValueError:
        print "*** argument should be number"
        return
     except IndexError:
        print "*** register takes at least one parameter"
        return
     dev_id = l
     if dev_id >= len(self.mibands.keys()):
         print "*** device not in the device list"
         return
     if ((args.mode == "db" and mbdb.is_device_registered(cnxn_string, self.mibands.keys()[dev_id]))
         or args.mode == "json" and self.mibands.keys()[dev_id] in self.registered_devices):
         print("That MiBand is already registered")
     else:
         mb = None
         try:
             addr = self.mibands.keys()[dev_id]
             model = self.models[addr]
             if not addr in self.devices_keys.keys():
                 self.devices_keys[addr] = random_key()
             if model.upper() == "MB2":
                 mb = MiBand2(addr, self.devices_keys[addr], initialize=False)
             elif model.upper() == "MB3":
                 mb = MiBand3(addr, self.devices_keys[addr], initialize=False)
             mb.cleanAlarms()
             if args.mode == "db":
                 dev_id = mbdb.get_device_id(cnxn_string, mb.addr)
                 mbdb.delete_all_alarms(cnxn_string, dev_id)
                 mbdb.register_device(cnxn_string, mb.addr)
                 mbdb.update_battery(cnxn_string, mb.addr, mb.battery_info['level'])
             else:
                 self.registered_devices += [mb.addr]
             # Device stays connected after initialize, but we don't want that
             mb.disconnect()
         except BTLEException as e:
             print("There was a problem registering this MiBand, try again later")
             print e
         except KeyError as e:
             print("Device was kicked out")
             print e
示例#9
0
 def do_activity(self, params):
     try:
        l = int(params)
     except ValueError:
         print "*** argument should be number"
         return
     except IndexError:
        print "*** activity takes at least one parameter"
        return
     dev_id = l
     if dev_id >= len(self.mibands.keys()):
         print "*** device not in the device list"
         return
     if ((args.mode == "db" and mbdb.is_device_registered(cnxn_string, self.mibands.keys()[dev_id]))
         or args.mode == "json" and self.mibands.keys()[dev_id] in self.registered_devices):
         if self.mibands.keys()[dev_id] in connected_devices.keys():
             q.put(self.mibands.keys()[dev_id])
             q.join()
         else:
             print("MiBand should be connected before fetching activity data")
     else:
         print("MiBand should be registered before fetching activity data")
示例#10
0
 def do_reboot(self, params):
     try:
        dev_id = int(params)
     except ValueError:
        print "*** arguments should be numbers"
        return
     except IndexError:
        print "*** alert takes at least one parameter"
        return
     if dev_id >= len(self.mibands.keys()):
         print "*** device not in the device list"
         return
     if ((args.mode == "db" and mbdb.is_device_registered(cnxn_string, self.mibands.keys()[dev_id]))
         or (args.mode == "json" and self.mibands.keys()[dev_id] in self.registered_devices)):
         if self.mibands.keys()[dev_id] in connected_devices.keys():
             try:
                 mb = connected_devices[self.mibands.keys()[dev_id]]
                 mb.reboot()
             except BTLEException:
                 print("There was a problem rebooting this MiBand, try again later")
         else:
             print("That MiBand is not connected!")
     else:
         print("That MiBand is not registered")
示例#11
0
def device(dev_id):
    row = mbdb.get_device_by_id(cnxn_string, dev_id)
    if row:
        if request.method == "GET":
            connected = True if row.mac in connected_devices else False
            signal = 0
            mibands = copy.deepcopy(tmp_mibands)
            if row.mac in mibands.keys():
                signal = mibands[row.mac].rssi
            dev_user = mbdb.get_device_user(cnxn_string, dev_id)
            username = (dev_user.nombre + " " +
                        dev_user.apellidos) if dev_user else "Unregistered"
            detail_dict = {
                "dev_id": row.dispositivoId,
                "battery": row.bateria,
                "registered": row.registrado,
                "address": row.mac,
                "connected": connected,
                "signal": signal,
                "visible": (signal < 0),
                "model": row.tipoDispositivo.upper(),
                "user_name": username,
                "reputation": reputation[row.mac.upper()]
            }
            return json.dumps(detail_dict)
        elif request.method == "PUT":
            if mbdb.is_device_registered(cnxn_string, row.mac):
                action = request.form.get("action")
                if action == "connect" and row.mac not in connected_devices.keys(
                ):
                    try:
                        reputation[row.mac.upper()] = 100
                        if not row.mac in devices_keys.keys():
                            key = DEFAULT_KEY
                        else:
                            key = devices_keys[row.mac.upper()]
                        if model[row.mac.upper()] == "mb2":
                            mb = MiBand2(
                                row.mac.upper(),
                                key,
                                initialize=False,
                            )
                        elif model[row.mac.upper()] == "mb3":
                            mb = MiBand3(
                                row.mac.upper(),
                                key,
                                initialize=False,
                            )
                        connected_devices[row.mac] = mb
                        alarms = mbdb.get_device_alarms(cnxn_string, mb.addr)
                        mbdb.update_battery(cnxn_string, mb.addr,
                                            mb.battery_info['level'])
                        for a in alarms:
                            mb.alarms += [
                                MiBandAlarm(a["hour"],
                                            a["minute"],
                                            enabled=a["enabled"],
                                            repetitionMask=a["repetition"])
                            ]
                        reputation[row.mac.upper()] = 50
                        return json.dumps({
                            "connected": True,
                            "dev_id": row.dispositivoId
                        }), 200
                    except BTLEException as e:
                        reputation[row.mac.upper()] = 50
                        print(
                            "There was a problem (dis)connecting to this MiBand, try again later"
                        )
                        print e
                        abort(500)
                    except BTLEException.DISCONNECTED as d:
                        reputation[row.mac.upper()] = 50
                        print(
                            "Device disconnected, removing from connected devices"
                        )
                        del connected_devices[row.mac]
                        del mb
                        abort(500)
                elif action == "disconnect" and row.mac in connected_devices.keys(
                ):
                    try:
                        mb = connected_devices[row.mac]
                        mb.disconnect()
                        mb.force_disconnect()
                        del connected_devices[row.mac]
                        del mb
                        print("MiBand disconnected!")
                        return json.dumps({
                            "connected": False,
                            "dev_id": row.dispositivoId
                        }), 200
                    except BTLEException as e:
                        print(
                            "There was a problem disconnecting this MiBand, try again later"
                        )
                        print e
                        abort(500)
                    except BTLEException.DISCONNECTED as d:
                        print(
                            "Device disconnected, removing from connected devices"
                        )
                        del connected_devices[row.mac]
                        del mb
                        abort(500)
                elif action == "alert" and row.mac in connected_devices.keys():
                    try:
                        print("Alerting MB2 " + row.mac)
                        mb = connected_devices[row.mac]
                        if request.args.get('notification') == "message":
                            mb.send_alert(b'\x01')
                        elif request.args.get('notification') == "call":
                            mb.send_alert(b'\x02')
                        elif request.args.get('notification') == "vibrate":
                            mb.send_alert(b'\x03')
                        elif request.args.get('notification') == "stop":
                            mb.send_alert(b'\x00')
                        else:
                            mb.send_alert(b'\x03')
                        return json.dumps({
                            "alerting": True,
                            "dev_id": row.dispositivoId
                        }), 200
                    except BTLEException as e:
                        print(
                            "There was a problem alerting this MiBand, try again later"
                        )
                        del connected_devices[row.mac]
                        print e
                        abort(500)
                    except BTLEException.DISCONNECTED as d:
                        print(
                            "Device disconnected, removing from connected devices"
                        )
                        del connected_devices[row.mac]
                        del mb
                        abort(500)
        elif request.method == "DELETE":
            # Just Unregister MiBand
            if mbdb.is_device_registered(cnxn_string, row.mac):
                if not row.mac in connected_devices.keys():
                    try:
                        dev_id = mbdb.get_device_id(cnxn_string, row.mac)
                        mbdb.unregister_device(cnxn_string, dev_id)
                        mbdb.delete_all_alarms(cnxn_string, dev_id)
                        del devices_keys[row.mac.upper()]
                        print("MiBand unregistered!")
                        save_keys(devices_keys)
                        return json.dumps({
                            "registered": False,
                            "dev_id": row.dispositivoId
                        }), 200
                    except BTLEException as e:
                        print(
                            "There was a problem unregistering this MiBand, try again later"
                        )
                        print e
                        abort(500)
                    except BTLEException.DISCONNECTED as d:
                        print(
                            "Device disconnected, removing from connected devices"
                        )
                        if row.mac in connected_devices.keys():
                            connected_devices[row.mac].force_disconnect()
                            del connected_devices[row.mac]
                        abort(500)
        abort(403)
    else:
        abort(404)
示例#12
0
def devices():
    if request.method == "GET":
        dev_list = []
        mibands = copy.deepcopy(tmp_mibands)
        for idx, mb in enumerate(mibands.keys()):
            dev_id = mbdb.get_device_id(cnxn_string, mb)
            dev_user = mbdb.get_device_user(cnxn_string, dev_id)
            device = mbdb.get_device_by_id(cnxn_string, dev_id)
            battery = -1
            if device:
                battery = device.bateria
            username = (dev_user.nombre + " " +
                        dev_user.apellidos) if dev_user else "Unregistered"
            dev_dict = {
                "address": mb,
                "signal": mibands[mibands.keys()[idx]].rssi,
                "registered": False,
                "connected": False,
                "dev_id": dev_id,
                "model":
                model[mibands[mibands.keys()[idx]].addr.upper()].upper(),
                "user_name": username,
                "battery": battery,
                "reputation":
                reputation[mibands[mibands.keys()[idx]].addr.upper()]
            }
            if mbdb.is_device_registered(cnxn_string, mb):
                dev_dict["registered"] = True
            if mb in connected_devices.keys():
                dev_dict["connected"] = True
            dev_list += [dev_dict]
        return json.dumps(dev_list)
    elif request.method == "POST":
        addr = request.form["address"].upper()
        if mbdb.is_device_registered(cnxn_string, addr):
            abort(403)
        else:
            try:
                reputation[addr] = 100
                if not addr in devices_keys.keys():
                    devices_keys[addr] = random_key()
                if model[addr] == "mb2":
                    mb = MiBand2(addr, devices_keys[addr], initialize=False)
                elif model[addr] == "mb3":
                    mb = MiBand3(addr, devices_keys[addr], initialize=False)
                devices_keys[addr] = mb.key
                connected_devices[addr] = mb
                save_keys(devices_keys)
                mb.cleanAlarms()
                dev_id = mbdb.register_device(cnxn_string, mb.addr,
                                              mb.get_model())
                mbdb.delete_all_alarms(cnxn_string, dev_id)
                mbdb.update_battery(cnxn_string, mb.addr,
                                    mb.battery_info['level'])
                # Device stays connected after initialize, but we don't want that
                del connected_devices[addr]
                mb.disconnect()
                reputation[addr] = 50
                return json.dumps({"dev_id": dev_id, "registered": True})
            except BTLEException as e:
                print(
                    "There was a problem registering this MiBand, try again later"
                )
                print e
                if addr in connected_devices.keys():
                    connected_devices[addr].force_disconnect()
                    del connected_devices[addr]
                abort(500)
            except BTLEException.DISCONNECTED as d:
                print("Device disconnected, removing from connected devices")
                print e
                if addr in connected_devices.keys():
                    connected_devices[addr].force_disconnect()
                    del connected_devices[addr]
                abort(500)
示例#13
0
def scan_miband2(scanner, scanthresh):
    print("Scanning!")
    scanner.clear()
    scanner.start()
    t = threading.currentThread()
    while getattr(t, "do_scan", True):
        old_mibands = copy.deepcopy(tmp_mibands)
        scanner.process(2)
        for d in old_mibands.keys():
            if d in connected_devices.keys():
                reputation[d.upper()] = 50
            if d in tmp_mibands.keys() and (d not in connected_devices.keys()):
                new_signal = tmp_mibands[d.upper()].rssi
                signal_diff = (old_mibands[d.upper()].rssi -
                               tmp_mibands[d.upper()].rssi)
                proximity_factor = 1
                if new_signal < scanthresh:
                    # If the device is away positive reputation increases slowly
                    proximity_factor = 0.5
                elif new_signal > (scanthresh + 2 * (scanthresh / 3)):
                    # Pretty close
                    proximity_factor = 1.5
                elif new_signal > (scanthresh + (scanthresh / 3)):
                    # Mid range
                    proximity_factor = 1.25
                elif new_signal > (scanthresh):
                    # Away but ok
                    proximity_factor = 1

                if signal_diff == 0:
                    # If stagnant, reputation decreases drastically
                    reputation[d.upper()] -= 10
                elif signal_diff in range(-5, 6):
                    # If there is little variation, reputation increases
                    reputation[d.upper()] += 10 * proximity_factor
                elif signal_diff < -5:
                    # If there is a VERY big negative variation, reputation decreases drastically
                    reputation[d.upper()] -= 10
                elif signal_diff > 5:
                    # If there is a big positive variation, reputation increases a bit
                    reputation[d.upper()] += 5 * proximity_factor

                if reputation[d.upper()] >= 100:
                    reputation[d.upper()] = 100
                if reputation[d.upper()] <= 0:
                    reputation[d.upper()] = 0

                if reputation[d.upper()] >= 90 and autofetch:
                    if (mbdb.is_device_registered(cnxn_string, d.upper())):
                        last_sync = mbdb.get_device_last_sync(
                            cnxn_string, d.upper())
                        timediff = None
                        if last_sync != None:
                            timediff = (datetime.datetime.now() - last_sync)
                        if timediff == None or timediff.total_seconds(
                        ) > autofetch_cooldown:
                            q.put((
                                d.upper(),
                                True,
                            ))
                if reputation[d.upper()] <= 10:
                    del tmp_mibands[d.upper()]
                    del model[d.upper()]
                    if d.upper() in mibands.keys():
                        mibands[d.upper()].force_disconnect()

    q.join()
    print("Stopped scanning...")
    scanner.stop()
示例#14
0
    def do_alarms(self, params):
        l = params.split()
        try:
           dev_id = int(l[0])
           command = "list"
           if len(l) > 1:
               command = l[1]
        except ValueError:
           print "*** argument 1 should be number"
           return
        except IndexError:
           print "*** alarms takes at least one parameter"
           return
        if command not in ['list', 'queue', 'set', 'toggle', 'toggleday', 'delete', 'clear']:
           print "*** invalid alarm command, see help"
           return
        if dev_id >= len(self.mibands.keys()):
            print "*** device not in the device list"
            return
        if ((args.mode == "db" and mbdb.is_device_registered(cnxn_string, self.mibands.keys()[dev_id]))
            or args.mode == "json" and self.mibands.keys()[dev_id] in self.registered_devices):
            if self.mibands.keys()[dev_id] in connected_devices.keys():
                mb = connected_devices[self.mibands.keys()[dev_id]]
                if args.mode == "db":
                    alarms = mbdb.get_device_alarms(cnxn_string, self.mibands.keys()[dev_id])
                else:
                    if self.mibands.keys()[dev_id] in self.devices_alarms.keys():
                        alarms = self.devices_alarms[self.mibands.keys()[dev_id]]
                    else:
                        alarms = []
                if command == 'list':
                    if len(alarms) > 0:
                        for idx,a in enumerate(mb.alarms):
                            print "[%s]" % idx + str(a)
                if command == 'clear':
                    if len(alarms) > 0:
                        mb.cleanAlarms()
                        if args.mode == "db":
                            mbdb.delete_all_alarms(cnxn_string, mb.addr)
                        else:
                            self.devices_alarms[self.mibands.keys()[dev_id]] = []
                elif command == 'queue':
                    try:
                        hour, minute = map(lambda x: int(x), l[2].split(":"))
                        alarm_id = mb.queueAlarm(hour, minute)
                        if args.mode == "db":
                            mbdb.set_alarm(cnxn_string, mb.addr, mb.alarms[alarm_id], alarm_id)
                        else:
                            if len(alarms) > 0:
                                self.devices_alarms[self.mibands.keys()[dev_id]] += [{"enabled": True, "repetition": 128, "hour": hour, "minute": minute}]
                            else:
                                self.devices_alarms[self.mibands.keys()[dev_id]] = [{"enabled": True, "repetition": 128, "hour": hour, "minute": minute}]
                    except IndexError:
                        print "*** queue takes an hour parameter in format HH:MM"
                    except ValueError:
                        print "*** queue takes an hour parameter in format HH:MM"
                elif command == 'delete':
                    try:
                        alarm_id = int(l[2])
                        mb.deleteAlarm(alarm_id)
                        if len(alarms) > 0:
                            if args.mode == "db":
                                mbdb.delete_alarm(cnxn_string, mb.addr, alarm_id)
                            else:
                                del self.devices_alarms[self.mibands.keys()[dev_id]][alarm_id]
                    except IndexError:
                        print "*** delete takes an alarm_id parameter"
                    except ValueError:
                        print "*** delete's alarm_id should be a number"
                elif command == 'toggle':
                    try:
                        alarm_id = int(l[2])
                        mb.toggleAlarm(alarm_id)
                        if args.mode == "db":
                            mbdb.set_alarm(cnxn_string, mb.addr, mb.alarms[alarm_id], alarm_id)
                        else:
                            self.devices_alarms[self.mibands.keys()[dev_id]][alarm_id]["enabled"] = mb.alarms[alarm_id].enabled
                    except IndexError:
                        print "*** toggle takes an alarm_id parameter"
                    except ValueError:
                        print "*** toggle's alarm_id should be a number"
                elif command == 'toggleday':
                    try:
                        alarm_id = int(l[2])
                        day_id = int(l[3])
                        if day_id not in range(1,8):
                            print "*** day_id should be between 1 (Monday) and 7 (Sunday)"
                            return
                        else:
                            mb.toggleAlarmDay(alarm_id, day_id-1)
                            if args.mode == "db":
                                mbdb.set_alarm(cnxn_string, mb.addr, mb.alarms[alarm_id], alarm_id)
                            else:
                                self.devices_alarms[self.mibands.keys()[dev_id]][alarm_id]["repetition"] = mb.alarms[alarm_id].repetitionMask

                    except IndexError:
                        print "*** toggleday takes an alarm_id parameter and a day_id parameter (1-7)"
                    except ValueError:
                        print "*** toggleday's alarm_id and day_id should be both numbers"
                elif command == "set":
                    try:
                        alarm_id = int(l[2])
                        hour, minute = map(lambda x: int(x), l[3].split(":"))
                        mb.changeAlarmTime(alarm_id, hour, minute)
                        if args.mode == "db":
                            mbdb.set_alarm(cnxn_string, mb.addr, mb.alarms[alarm_id], alarm_id)
                        else:
                            self.devices_alarms[self.mibands.keys()[dev_id]][alarm_id]["hour"] = mb.alarms[alarm_id].hour
                            self.devices_alarms[self.mibands.keys()[dev_id]][alarm_id]["minute"] = mb.alarms[alarm_id].minute
                    except IndexError:
                        print "*** set takes an alarm_id parameter and an hour parameter in format HH:MM"
                    except ValueError:
                        print "*** toggleday's alarm_id and hour (HH:MM) should be both numbers"
            else:
                print("MiBand should be connected before viewing/changing alarms")
        else:
            print("MiBand should be registered before viewing/changing alarms")