Описание
Итак, я пытаюсь подключиться к лампе Philips Hue через BLE с моей Raspberry Pi Model 3B +. Поэтому я написал следующий скрипт python с использованием библиотеки pygatt
.
Код
import pygatt
ADDRESS_TYPE = pygatt.BLEAddressType.random
CHARACTERISTIC = '932c32bd-0002-47a2-835a-a8d455b859dd'
adapter = pygatt.GATTToolBackend()
try:
adapter.start()
devices = adapter.scan(run_as_root=True, timeout=3)
for entry in devices:
if entry['name'] == 'Hue Lamp':
try:
device = adapter.connect(entry['address'], address_type=ADDRESS_TYPE)
device.char_write(CHARACTERISTIC, bytearray([0x00]), wait_for_response=False)
value = device.char_read(CHARACTERISTIC)
device.disconnect()
except pygatt.exceptions.NotConnectedError:
print('Failed to connect to %s' % entry['address'])
finally:
adapter.stop()
Поведение кода
Когда я запускаю скрипт, кажется, что соединение установлено успешно. Вызов char_write()
должен выключить лампу, но ничего не происходит. Вызов char_read()
вызывает исключение с отслеживанием, указанным ниже.
Отслеживание исключения
Traceback (most recent call last):
File "main.py", line 21, in <module>
value = device.char_read(CHARACTERISTIC)
File "/usr/local/lib/python3.7/dist-packages/pygatt/backends/gatttool/device.py", line 17, in wrapper
return func(self, *args, **kwargs)
File "/usr/local/lib/python3.7/dist-packages/pygatt/backends/gatttool/device.py", line 40, in char_read
return self._backend.char_read(self, uuid, *args, **kwargs)
File "/usr/local/lib/python3.7/dist-packages/pygatt/backends/gatttool/gatttool.py", line 50, in wrapper
return func(self, *args, **kwargs)
File "/usr/local/lib/python3.7/dist-packages/pygatt/backends/gatttool/gatttool.py", line 593, in char_read
self.sendline('char-read-uuid %s' % uuid)
File "/usr/lib/python3.7/contextlib.py", line 119, in __exit__
next(self.gen)
File "/usr/local/lib/python3.7/dist-packages/pygatt/backends/gatttool/gatttool.py", line 191, in event
self.wait(event, timeout)
File "/usr/local/lib/python3.7/dist-packages/pygatt/backends/gatttool/gatttool.py", line 157, in wait
raise NotificationTimeout()
pygatt.exceptions.NotificationTimeout: None
Примечание
Я могу прочитать характеристики BLE лампы с pygatt
. Также я могу управлять лампой через приложение NRF Connect Android. Когда я записываю в приложение вышеуказанные характеристики c значение 0x00
, лампа выключается, как и ожидалось.