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")
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
def alarms(dev_id): row = mbdb.get_device_by_id(cnxn_string, dev_id) if row: if request.method == "GET": alarms = mbdb.get_device_alarms_by_id(cnxn_string, dev_id) al_list = [] for al in alarms: al_list.append({ "id": al.alarmaId, "dev_id": al.dispositivoId, "index": al.indiceAlarma, "hour": al.hora, "minute": al.minuto, "enabled": al.activada, "repetition": al.repeticion }) return json.dumps(al_list) if row.mac in connected_devices.keys(): mb = connected_devices[row.mac] try: if request.method == "POST": hour = int(request.form["hour"]) minute = int(request.form["minute"]) enabled = int(request.form.get( "enabled")) if request.form.get("enabled") else 1 repetition_mask = int( request.form.get("repetition")) if request.form.get( "repetition") else 128 alarm_id = mb.queueAlarm(hour, minute, enableAlarm=enabled, repetitionMask=repetition_mask) db_alarm = mbdb.set_alarm(cnxn_string, dev_id, mb.alarms[alarm_id], alarm_id) al = mb.alarms[alarm_id] return json.dumps({ "dev_id": dev_id, "id": db_alarm.alarmaId, "index": alarm_id, "hour": al.hour, "minute": al.minute, "enabled": al.enabled, "repetition": al.repetitionMask }) if request.method == "DELETE": mb.cleanAlarms() mbdb.delete_all_alarms(cnxn_string, dev_id) return json.dumps({ "alarms_deleted": True, "dev_id": row.dispositivoId }), 200 except BTLEException as e: print( "There was a problem handling the alarms, 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) else: abort(403) else: abort(404)
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)
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)
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")