mirror of
https://github.com/markqvist/Sideband.git
synced 2025-11-30 04:06:39 -05:00
64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
"""Turn the alert on Mi Band device
|
|
"""
|
|
from kivy.app import App
|
|
from kivy.uix.button import Button
|
|
|
|
from able import BluetoothDispatcher, GATT_SUCCESS
|
|
from error_message import install_exception_handler
|
|
|
|
|
|
class BLE(BluetoothDispatcher):
|
|
device = alert_characteristic = None
|
|
|
|
def start_alert(self, *args, **kwargs):
|
|
if self.alert_characteristic: # alert service is already discovered
|
|
self.alert(self.alert_characteristic)
|
|
elif self.device: # device is already founded during the scan
|
|
self.connect_gatt(self.device) # reconnect
|
|
else:
|
|
self.stop_scan() # stop previous scan
|
|
self.start_scan() # start a scan for devices
|
|
|
|
def on_device(self, device, rssi, advertisement):
|
|
# some device is found during the scan
|
|
name = device.getName()
|
|
if name and name.startswith('MI'): # is a Mi Band device
|
|
self.device = device
|
|
self.stop_scan()
|
|
|
|
def on_scan_completed(self):
|
|
if self.device:
|
|
self.connect_gatt(self.device) # connect to device
|
|
|
|
def on_connection_state_change(self, status, state):
|
|
if status == GATT_SUCCESS and state: # connection established
|
|
self.discover_services() # discover what services a device offer
|
|
else: # disconnection or error
|
|
self.alert_characteristic = None
|
|
self.close_gatt() # close current connection
|
|
|
|
def on_services(self, status, services):
|
|
# 0x2a06 is a standard code for "Alert Level" characteristic
|
|
# https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.alert_level.xml
|
|
self.alert_characteristic = services.search('2a06')
|
|
self.alert(self.alert_characteristic)
|
|
|
|
def alert(self, characteristic):
|
|
self.write_characteristic(characteristic, [2]) # 2 is for "High Alert"
|
|
|
|
|
|
class AlertApp(App):
|
|
|
|
def build(self):
|
|
self.ble = None
|
|
return Button(text='Press to Alert Mi', on_press=self.start_alert)
|
|
|
|
def start_alert(self, *args, **kwargs):
|
|
if not self.ble:
|
|
self.ble = BLE()
|
|
self.ble.start_alert()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
install_exception_handler()
|
|
AlertApp().run()
|