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 mb2db.is_device_registered(mb2db.cnxn, 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": mb2db.unregister_device(mb2db.cnxn, self.mibands.keys()[dev_id]) mb2db.delete_all_alarms(mb2db.cnxn, self.mibands.keys()[dev_id]) else: self.registered_devices.remove(self.mibands.keys()[dev_id]) print("MiBand2 unregistered!") except BTLEException: print("There was a problem unregistering this MiBand2, try again later") else: print("Disconnect the miBand2 first!") else: print("That MiBand2 is not registered")
def devices(): if request.method == "GET": dev_list = [] print(connected_devices) mibands = copy.deepcopy(tmp_mibands) for idx, mb in enumerate(mibands.keys()): dev_id = mb2db.get_device_id(cnxn_string, mb) dev_user = mb2db.get_device_user(cnxn_string, dev_id) device = mb2db.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, "user_name": username, "battery": battery, "strikes": strikes[mibands[mibands.keys()[idx]].addr.upper()] } if mb2db.is_device_registered(cnxn_string, mb): dev_dict["registered"] = True if mb in connected_devices.keys(): dev_dict["connected"] = True dev_list += [dev_dict] print json.dumps(dev_list) return json.dumps(dev_list) elif request.method == "POST": addr = request.form["address"].upper() if mb2db.is_device_registered(cnxn_string, addr): abort(403) else: try: strikes[addr] = -9999 mb2 = MiBand2(addr, initialize=True) mb2.cleanAlarms() dev_id = mb2db.register_device(cnxn_string, mb2.addr) mb2db.delete_all_alarms(cnxn_string, dev_id) mb2db.update_battery(cnxn_string, mb2.addr, mb2.battery_info['level']) # Device stays connected after initialize, but we don't want that mb2.disconnect() strikes[addr] = 0 return json.dumps({"dev_id": dev_id, "registered": True}) except BTLEException as e: print( "There was a problem registering this MiBand2, try again later" ) print e abort(500) except BTLEException.DISCONNECTED as d: print("Device disconnected, removing from connected devices") del connected_devices[addr] del mb2 abort(500)
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 mb2db.is_device_registered(mb2db.cnxn, self.mibands.keys()[dev_id])) or args.mode == "json" and self.mibands.keys()[dev_id] in self.registered_devices): print("That MiBand2 is already registered") else: mb2 = None try: addr = self.mibands.keys()[dev_id] self.scd.tmp_devices[addr]["strikes"] = -9999 if not addr in self.devices_keys.keys(): self.devices_keys[addr] = random_key() mb2 = MiBand2(addr, self.devices_keys[addr], initialize=False) mb2.cleanAlarms() if args.mode == "db": mb2db.delete_all_alarms(mb2db.cnxn, mb2.addr) mb2db.register_device(mb2db.cnxn, mb2.addr) mb2db.update_battery(mb2db.cnxn, mb2.addr, mb2.battery_info['level']) else: self.registered_devices += [mb2.addr] # Device stays connected after initialize, but we don't want that mb2.disconnect() except BTLEException as e: print( "There was a problem registering this MiBand2, try again later" ) print e mb2.disconnect
def alarms(dev_id): row = mb2db.get_device_by_id(cnxn_string, dev_id) if row: if request.method == "GET": alarms = mb2db.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(): mb2 = 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 = mb2.queueAlarm(hour, minute, enableAlarm=enabled, repetitionMask=repetition_mask) db_alarm = mb2db.set_alarm(cnxn_string, dev_id, mb2.alarms[alarm_id], alarm_id) al = mb2.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": mb2.cleanAlarms() mb2db.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 mb2 abort(500) else: abort(403) else: abort(404)
def device(dev_id): row = mb2db.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 = mb2db.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), "user_name": username } return json.dumps(detail_dict) elif request.method == "PUT": if mb2db.is_device_registered(cnxn_string, row.mac): action = request.form.get("action") strikes[row.mac] = -9999 if action == "connect" and row.mac not in connected_devices.keys( ): try: mb2 = MiBand2(row.mac, initialize=False) connected_devices[row.mac] = mb2 alarms = mb2db.get_device_alarms(cnxn_string, mb2.addr) mb2db.update_battery(cnxn_string, mb2.addr, mb2.battery_info['level']) for a in alarms: mb2.alarms += [ MiBand2Alarm(a["hour"], a["minute"], enabled=a["enabled"], repetitionMask=a["repetition"]) ] return json.dumps({ "connected": True, "dev_id": row.dispositivoId }), 200 except BTLEException as e: print( "There was a problem (dis)connecting to this MiBand2, 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 mb2 abort(500) elif action == "disconnect" and row.mac in connected_devices.keys( ): try: mb2 = connected_devices[row.mac] mb2.disconnect() del connected_devices[row.mac] del mb2 print("MiBand2 disconnected!") return json.dumps({ "connected": False, "dev_id": row.dispositivoId }), 200 except BTLEException as e: print( "There was a problem disconnecting this MiBand2, 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 mb2 abort(500) elif request.method == "DELETE": # Just Unregister MiBand2 if mb2db.is_device_registered(cnxn_string, row.mac): if not row.mac in connected_devices.keys(): try: dev_id = mb2db.get_device_id(cnxn_string, row.mac) mb2db.unregister_device(cnxn_string, dev_id) mb2db.delete_all_alarms(cnxn_string, dev_id) print("MiBand2 unregistered!") return json.dumps({ "registered": False, "dev_id": row.dispositivoId }), 200 except BTLEException as e: print( "There was a problem unregistering this MiBand2, 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 mb2 abort(500) abort(403) else: abort(404)
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 mb2db.is_device_registered(mb2db.cnxn, 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(): mb2 = connected_devices[self.mibands.keys()[dev_id]] if args.mode == "db": alarms = mb2db.get_device_alarms( mb2db.cnxn, 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(mb2.alarms): print "[%s]" % idx + str(a) if command == 'clear': if len(alarms) > 0: mb2.cleanAlarms() if args.mode == "db": mb2db.delete_all_alarms(mb2db.cnxn, mb2.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 = mb2.queueAlarm(hour, minute) if args.mode == "db": mb2db.set_alarm(mb2db.cnxn, mb2.addr, mb2.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]) mb2.deleteAlarm(alarm_id) if len(alarms) > 0: if args.mode == "db": mb2db.delete_alarm(mb2db.cnxn, mb2.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]) mb2.toggleAlarm(alarm_id) if args.mode == "db": mb2db.set_alarm(mb2db.cnxn, mb2.addr, mb2.alarms[alarm_id], alarm_id) else: self.devices_alarms[ self.mibands.keys()[dev_id]][alarm_id][ "enabled"] = mb2.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: mb2.toggleAlarmDay(alarm_id, day_id - 1) if args.mode == "db": mb2db.set_alarm(mb2db.cnxn, mb2.addr, mb2.alarms[alarm_id], alarm_id) else: self.devices_alarms[ self.mibands.keys()[dev_id]][alarm_id][ "repetition"] = mb2.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(":")) mb2.changeAlarmTime(alarm_id, hour, minute) if args.mode == "db": mb2db.set_alarm(mb2db.cnxn, mb2.addr, mb2.alarms[alarm_id], alarm_id) else: self.devices_alarms[self.mibands.keys()[dev_id]][ alarm_id]["hour"] = mb2.alarms[alarm_id].hour self.devices_alarms[ self.mibands.keys()[dev_id]][alarm_id][ "minute"] = mb2.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( "MiBand2 should be connected before viewing/changing alarms" ) else: print( "MiBand2 should be registered before viewing/changing alarms")