TionAPI / tion_python

Python module for Tion
GNU Lesser General Public License v3.0
64 stars 9 forks source link

сопряжение удачно, но невозможно считать информацию #17

Closed crimean-celica closed 3 years ago

crimean-celica commented 3 years ago

Версия модуля: 1.1.1 Модель бризера: S3 Версия прошивки (если известна): 003C

Описание проблемы

не получается прочитать состояние бризера

Порядок действий, которые приводят к проявлению проблемы

rpi4 8GB. свежий, обновленный инстал. ставился из "2020-12-02-raspios-buster-armhf-lite.img" минимум настроек: разрешен SSH + настроена работа по WiFi, вся работа идет по SSH запускаю напрямую тестовый пример (открываю нужные строки в зависимости от того, что нужно сделать):

тестовый пример:

#import sys
#from tion_btle.s3 import S3 as s3device
from tion_btle.s3 import S3 as s3device
mac: str=str("FB:AD:7D:2C:20:3B")
s3 = s3device(mac)
#print(s3.pair())
print(s3.get())

спарить получилось с повышением привилегий (sudo) после чего бризер показывается как спареный через "bluetoothctl"

pi@Mini:~/projects $ sudo bluetoothctl
Agent registered
[bluetooth]# paired-devices
Device FB:AD:7D:2C:20:3B Tion Breezer 3S
[bluetooth]# quit
pi@Mini:~/projects $

спаривание:

pi@Mini:~/projects $ sudo -s
root@Mini:/home/pi/projects# python3 p1.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Connected. BT pairing ...
DEBUG:tion_btle.tion:Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [19], 'emsg': ['Already Paired']}
DEBUG:tion_btle.tion:Already Paired
DEBUG:tion_btle.tion:Device-specific pairing ...
DEBUG:tion_btle.s3:Sending pair command
DEBUG:tion_btle.tion:Doing _try_write. Attempt 1/3
DEBUG:tion_btle.tion:Writing 3d0501000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
DEBUG:tion_btle.s3:Done!
DEBUG:tion_btle.tion:Device pair is done
DEBUG:tion_btle.tion:disconnected
None
root@Mini:/home/pi/projects#

после чего попытка использовать .get успехом не завершается ни под обычным пользователем ни с повышением привилегий. под обычным:

Логи

pi@Mini:~/projects $ python3 p1.py
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Doing _try_write. Attempt 1/3
DEBUG:tion_btle.tion:Writing 3d0100000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
DEBUG:tion_btle.s3:Got Device disconnected while waiting for notification
Traceback (most recent call last):
  File "p1.py", line 9, in <module>
    print(s3.get())
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 218, in get
    response = self._get_data_from_breezer()
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/s3.py", line 90, in _get_data_from_breezer
    raise TionException("s3 _get_data_from_breezer", "Could not get breezer state")
tion_btle.tion.TionException: ('s3 _get_data_from_breezer', 'Could not get breezer state')
pi@Mini:~/projects $

с повышением привилений:

root@Mini:/home/pi/projects# python3 p1.py
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Doing _try_write. Attempt 1/3
DEBUG:tion_btle.tion:Writing 3d0100000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
DEBUG:tion_btle.s3:Got Device disconnected while waiting for notification
Traceback (most recent call last):
  File "p1.py", line 9, in <module>
    print(s3.get())
  File "/usr/local/lib/python3.7/dist-packages/tion_btle/tion.py", line 218, in get
    response = self._get_data_from_breezer()
  File "/usr/local/lib/python3.7/dist-packages/tion_btle/s3.py", line 90, in _get_data_from_breezer
    raise TionException("s3 _get_data_from_breezer", "Could not get breezer state")
tion_btle.tion.TionException: ('s3 _get_data_from_breezer', 'Could not get breezer state')
root@Mini:/home/pi/projects#
IATkachenko commented 3 years ago

Спасибо за подробную диагностику. Notification не приходит. Вот тут https://github.com/TionAPI/tion_python/commit/047158d2ff26dcc1b96c060edbddee28250601d1 был упрощен механизм подписки на уведомления (и на моем бризере проблем не возникает). Попробуйте откатить эту правку (если с этим возникнут трудности, завтра сделаю тестовый релиз). Если не поможет, то, пожалуйста, добавьте в /usr/local/lib/python3.7/dist-packages/tion_btle/s3.py в _get_data_from_breezer в ветке else немного дебага:

def _get_data_from_breezer(self) -> bytearray:
 ...
            else:
                _LOGGER.debug("Waiting too long for data")
                result = self.notify.read()
                _LOGGER.debug(result)
                return result           
IATkachenko commented 3 years ago

Кстати, про сопряжение вопрос: обычного s3.pair() не хватило или его от рута даже не запускали? Пользователь от которого запускали в группе пользователей bluetooth состоял? (вопрос в связи с тем что модуль используется в компоненте для Home Assistant и там нужно как-то реализовывать процедуру сопряжения. У некоторых, кто пользуется HA сопряжение прошло корректно без привлечения bluetoothctl. Правда я не знаю: может быть HA запущен от рута)

stsergo commented 3 years ago

setcap нужно настроить, если HA не от рута запущен. Не уверен, нужно ли на bluepy-helper права.

sudo setcap 'cap_net_raw,cap_net_admin+eip' `readlink -f \`which python3\``
sudo setcap 'cap_net_raw,cap_net_admin+eip' `which hcitool`
sudo setcap 'cap_net_raw,cap_net_admin+eip' /usr/local/lib/python3/site-packages/bluepy/bluepy-helper
IATkachenko commented 3 years ago

@crimean-celica, попробуйте, пожалуйста tion-btle==1.1.2a1. В этой версии подозрительный коммит откачен.

@stsergo, HA говорит что helper не нужен

sudo apt-get install libcap2-bin
sudo setcap 'cap_net_raw,cap_net_admin+eip' $(readlink -f $(which python3))
sudo setcap 'cap_net_raw+ep' $(readlink -f $(which hcitool))
crimean-celica commented 3 years ago

Кстати, про сопряжение вопрос: обычного s3.pair() не хватило или его от рута даже не запускали? Пользователь от которого запускали в группе пользователей bluetooth состоял?

я работаю от имени "pi" (лень, да). он в указанной группе не состоял (уже добавил). с сопряжением были проблемы, пробовал и так и так в итоге, если не путаю, от рута прошло (что теперь выглядит логично)

попробуйте, пожалуйста tion-btle==1.1.2a1.

не нашел способа взять указанную версию. если что, "я не настоящий сварщик", я из другой песочницы (базы данных). буду признателен, если "ткнете пальцем" (ссылочку, скрин или более подробное описание как взять)

IATkachenko commented 3 years ago

@crimean-celica, pip3 install tion-btle==1.1.2a1 или сырцы с PyPi забрать https://files.pythonhosted.org/packages/18/39/7c6a58b6668f7c6a34217ac780615bac5788420a2484c17e7f8b64f29c1d/tion_btle-1.1.2a1.tar.gz распаковать и заменить файлы из папки модуля в /usr/local/lib/python3.7/dist-packages/tion_btle

crimean-celica commented 3 years ago

заработало. но нестабильно. могу получить "чистое" выполнение:

pi@Mini:~/projects $ python3 p1.py
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done. Data is b31023140b001416040e011210003c26003c005a
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Doing _try_write. Attempt 1/3
DEBUG:tion_btle.tion:Writing 3d0100000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
DEBUG:tion_btle.tion:Got data in 11 response b31023140b001416040e011211003c26003c005a
DEBUG:tion_btle.s3:Data is b31023140b001416040e011211003c26003c005a
{'state': 'on', 'heater': 'on', 'heating': 'on', 'sound': 'on', 'mode': 'outside', 'out_temp': 22, 'in_temp': 4, 'heater_temp': 20, 'fan_speed': 3, 'filter_remain': 270, 'time': '18:17', 'request_error_code': 0, 'model': 'S3', 'code': 200, 'timer': 'off', 'productivity': 60, 'fw_version': '003c'}

но чаще получаю такое:

pi@Mini:~/projects $ python3 p1.py
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
WARNING:tion_btle.tion:Got Device disconnected exception
Traceback (most recent call last):
  File "p1.py", line 9, in <module>
    print(s3.get())
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 217, in get
    self._connect()
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 311, in _connect
    raise e
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 307, in _connect
    self._enable_notifications()
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 354, in _enable_notifications
    result = self._btle.writeCharacteristic(notify_handle, setup_data, withResponse=True)
  File "/home/pi/.local/lib/python3.7/site-packages/bluepy/btle.py", line 543, in writeCharacteristic
    return self._getResp('wr')
  File "/home/pi/.local/lib/python3.7/site-packages/bluepy/btle.py", line 407, in _getResp
    resp = self._waitResp(wantType + ['ntfy', 'ind'], timeout)
  File "/home/pi/.local/lib/python3.7/site-packages/bluepy/btle.py", line 362, in _waitResp
    raise BTLEDisconnectError("Device disconnected", resp)
bluepy.btle.BTLEDisconnectError: Device disconnected

или даже так:

pi@Mini:~/projects $ python3 p1.py
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
WARNING:tion_btle.tion:Got exception '[Errno 32] Broken pipe' while first read, but it is OK and we may ignore it
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Doing _try_write. Attempt 1/3
DEBUG:tion_btle.tion:Writing 3d0100000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
WARNING:tion_btle.tion:Got exception while _try_write: [Errno 32] Broken pipe
DEBUG:tion_btle.tion:Doing _try_write. Attempt 2/3
DEBUG:tion_btle.tion:Writing 3d0100000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
WARNING:tion_btle.tion:Got exception while _try_write: [Errno 32] Broken pipe
DEBUG:tion_btle.tion:Doing _try_write. Attempt 3/3
DEBUG:tion_btle.tion:Writing 3d0100000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
WARNING:tion_btle.tion:Got exception while _try_write: [Errno 32] Broken pipe
Traceback (most recent call last):
  File "p1.py", line 9, in <module>
    print(s3.get())
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 218, in get
    response = self._get_data_from_breezer()
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/s3.py", line 68, in _get_data_from_breezer
    self._do_action(self._try_write, request=self.get_status_command)
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 342, in _do_action
    raise TionException(action.__name__, message)
tion_btle.tion.TionException: ('_try_write', 'Could not do _try_write')
Exception ignored in: <function Peripheral.__del__ at 0xb65e6810>
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/bluepy/btle.py", line 630, in __del__
  File "/home/pi/.local/lib/python3.7/site-packages/bluepy/btle.py", line 453, in disconnect
  File "/home/pi/.local/lib/python3.7/site-packages/bluepy/btle.py", line 305, in _writeCmd
BrokenPipeError: [Errno 32] Broken pipe
IATkachenko commented 3 years ago

А на сколько удален бризер от той штуки, с которой управляете? В разных issue делали наблюдение что 3 метра и/или стена -- уже много.

crimean-celica commented 3 years ago

малина рядом с телефоном. с телефона - уверенное управление. стена - в наличии. реальное расстояние - около 2 метров. успешных получений данных "подряд" у меня не бывает. через 1 ошибку - да. есть внешний BT модуль, если заведется - попробую с него.

IATkachenko commented 3 years ago

Телефон не показатель от слова вообще. Кстати, закономерности нет в проблеме: условно, после двух неудач всегда нормальный запуск или после одного нормального всегда провал. Ошибки которые я вижу -- разрыв связи (причем при передаче данных в обе стороны). btmon, кстати, может что-нибудь еще подскажет/покажет.

Еще есть такая особенность, что бризер не любит частые дерганья (у меня уже на 30 секундных интервалах начинают проявляться проблемы, но редко).

А еще я не знаю как объясните bluepy использовать правильный адаптер -- возможно для теста придется отключать основной адаптер на малине.

crimean-celica commented 3 years ago

пробую 1.1.2a1

малину положил в пределах прямой видимости от бризера

группы для пользователя, под которым пробую:

root@Mini:/home/pi/projects# groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users input netdev bluetooth spi i2c gpio

сопряжение без рута, неудачное:

pi@Mini:~/projects $ python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
WARNING:tion_btle.tion:Got exception 'Device disconnected' while first read, but it is OK and we may ignore it
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Connected. BT pairing ...
CRITICAL:tion_btle.tion:Got exception while pair BTLEInternalError: Helper not started (did you call connect()?)
DEBUG:tion_btle.tion:disconnected
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 481, in pair
    self._btle._writeCmd('pair' + '\n')
  File "/home/pi/.local/lib/python3.7/site-packages/bluepy/btle.py", line 302, in _writeCmd
    raise BTLEInternalError("Helper not started (did you call connect()?)")
bluepy.btle.BTLEInternalError: Helper not started (did you call connect()?)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "p2.py", line 9, in <module>
    print(s3.pair())
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 505, in pair
    raise TionException('pair', f"{type(e).__name__}: {str(e)}")
tion_btle.tion.TionException: ('pair', 'BTLEInternalError: Helper not started (did you call connect()?)')

сопряжение под рутом, удачное:

pi@Mini:~/projects $ sudo -s
root@Mini:/home/pi/projects# python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done. Data is b3
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Connected. BT pairing ...
DEBUG:tion_btle.tion:Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [19], 'emsg': ['Already Paired']}
DEBUG:tion_btle.tion:Already Paired
DEBUG:tion_btle.tion:Device-specific pairing ...
DEBUG:tion_btle.s3:Sending pair command
DEBUG:tion_btle.tion:Doing _try_write. Attempt 1/3
DEBUG:tion_btle.tion:Writing 3d0501000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
DEBUG:tion_btle.s3:Done!
DEBUG:tion_btle.tion:Device pair is done
DEBUG:tion_btle.tion:disconnected
None

но! на самом деле отключение не происходит:

pi@Mini:~/projects $ bluetoothctl
Agent registered
[Tion Breezer 3S]# devices
Device F1:5A:F4:6E:FB:62 Tion Breezer 3S

понятно, что работы не будет, пока принудительно не отключился. после отключения - все ожидаемо:

[Tion Breezer 3S]# disconnect F1:5A:F4:6E:FB:62
Attempting to disconnect from F1:5A:F4:6E:FB:62
[CHG] Device F1:5A:F4:6E:FB:62 ServicesResolved: no
Successful disconnected
[CHG] Device F1:5A:F4:6E:FB:62 Connected: no
[bluetooth]# quit
pi@Mini:~/projects $ nano p1.py
pi@Mini:~/projects $ pi@Mini:~/projects $ python3 p1.py
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done. Data is b3
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Doing _try_write. Attempt 1/3
DEBUG:tion_btle.tion:Writing 3d0100000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
DEBUG:tion_btle.tion:Got data in 11 response b31022160b0016150467011528002d01003c005a
DEBUG:tion_btle.s3:Data is b31022160b0016150467011528002d01003c005a
{'state': 'on', 'heater': 'on', 'heating': 'on', 'sound': 'on', 'mode': 'outside', 'out_temp': 21, 'in_temp': 4, 'heater_temp': 22, 'fan_speed': 2, 'filter_remain': 359, 'time': '21:40', 'request_error_code': 0, 'model': 'S3', 'code': 200, 'timer': 'off', 'productivity': 45, 'fw_version': '003c'}

и повторные вызовы отрабатывают достаточно стабильно. то есть, таки да, расстояние решает. возможно, это можно обработать, так как удачные сеансы на большом удалении были. нечасто, но - были.

p.s.

внешний адаптер малина "видит", он "работает", но тионы через него "не живут". пробовал UGREEN 30524, разумеется, ставил его по умолчанию и запрещал встроенный. но - не пошло. в итоге, все описанные эксперименты делались с встроенным.

IATkachenko commented 3 years ago

Значит обычной группы bluetooth не достаточно, как говорил @stsergo нужны, видимо, setcap.

Дисконнект у себя половлю -- это должно воспроизводиться.

stsergo commented 3 years ago

Наличие caps можно проверить командой getcap:

getcap $(readlink -f $(which python3))
getcap $(readlink -f $(which hcitool))
IATkachenko commented 3 years ago

@crimean-celica, нет, не воспроизводится. Отключается 10 из 10. С задержкой в пару секунд, но отключается. В 1.1.2a2 добавил побольше дебага в disconnect. Давайте смотреть что у вас происходит.

crimean-celica commented 3 years ago

версии модулей:

pi@Mini:~/projects $ pip3 list
Package       Version
------------- ---------
asn1crypto    0.24.0
bluepy        1.3.0
certifi       2018.8.24
chardet       3.0.4
cryptography  2.6.1
entrypoints   0.3
idna          2.6
keyring       17.1.1
keyrings.alt  3.1.1
pip           18.1
pycrypto      2.6.1
PyGObject     3.30.4
python-apt    1.8.4.2
pyxdg         0.25
requests      2.21.0
SecretStorage 2.3.1
setuptools    40.8.0
six           1.12.0
ssh-import-id 5.7
tion-btle     1.1.2a2
urllib3       1.24.1
wheel         0.32.3

добавил capabilities

pi@Mini:~/projects $ getcap $(readlink -f $(which python3))
/usr/bin/python3.7 = cap_net_admin,cap_net_raw+eip
pi@Mini:~/projects $ getcap $(readlink -f $(which hcitool))
/usr/bin/hcitool = cap_net_raw+ep

сопряжение идет без рута, но дает ошибку и все еще оставляет законнекченным.

pi@Mini:~/projects $ python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done. Data is b3
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Connected. BT pairing ...
DEBUG:tion_btle.tion:Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']}
CRITICAL:tion_btle.tion:Unexpected response: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']}
CRITICAL:tion_btle.tion:Got exception while pair TionException: ('pair', {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']})
DEBUG:tion_btle.tion:disconnected
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 503, in pair
    raise TionException('pair', rsp)
tion_btle.tion.TionException: ('pair', {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']})

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "p2.py", line 9, in <module>
    print(s3.pair())
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 510, in pair
    raise TionException('pair', f"{type(e).__name__}: {str(e)}")
tion_btle.tion.TionException: ('pair', "TionException: ('pair', {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']})")
pi@Mini:~/projects $ bluetoothctl
Agent registered
[Tion Breezer 3S]# quit
pi@Mini:~/projects $

получение данных (после disconnect) идет стабильно (устройства теперь рядом) сопрягать пытался несколько раз, стабильно получаю ошибку и подключенное устройство под рутом (tion-btle обновлена до 1.1.2a2) - ошибок сопряжения нет, устройство остается "connected":

root@Mini:/home/pi/projects# python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done. Data is b3
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Connected. BT pairing ...
DEBUG:tion_btle.tion:Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [19], 'emsg': ['Already Paired']}
DEBUG:tion_btle.tion:Already Paired
DEBUG:tion_btle.tion:Device-specific pairing ...
DEBUG:tion_btle.s3:Sending pair command
DEBUG:tion_btle.tion:Doing _try_write. Attempt 1/3
DEBUG:tion_btle.tion:Writing 3d0501000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
DEBUG:tion_btle.s3:Done!
DEBUG:tion_btle.tion:Device pair is done
DEBUG:tion_btle.tion:disconnected
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
None
root@Mini:/home/pi/projects# bluetoothctl
Agent registered
[Tion Breezer 3S]# quit

получение данных (после disconnect) идет без проблем

IATkachenko commented 3 years ago

По поводу проблем не под рутом: у вас система не позволяет не руту сопрягать новые устройства. Вам примерно сюда

Под рутом, за исключением того что вы остаетесь подключенным, все идет правильно. И даже disconnect из bluepy вызывается. Почему соединение не разрывается я пока не понимаю... Хотя нет, понимаю.

Сейчас alpha-3 сделаю и проверим.

crimean-celica commented 3 years ago

у вас система не позволяет не руту сопрягать новые устройства.

почему? выше в логе идет сопряжения от имени "pi" и после сопряжения сразу вызов "bluetoothctl" который показывает, что устройство сопряжено и подключено. p.s. если удобно и если есть смысл - можно попробовать skype/telegram/... для оперативной отладки. так-то у меня моя главная проблема уже решена - данные получаются стабильно, но я не против потратить еще времени, раз у меня стабильно воспроизводятся проблемы

IATkachenko commented 3 years ago
DEBUG:tion_btle.tion:Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']}

Permission Denied -- правов не хватает на. И это явно не бризер нам говорит.

Устройство сопряжено, потому что до этого было успешное сопряжение от рута:

DEBUG:tion_btle.tion:Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [19], 'emsg': ['Already Paired']}
DEBUG:tion_btle.tion:Already Paired

Already Paired -- это как раз оно.

А висит соедние, как я сейчас думаю, потому что мы подписались на уведомления и тут же отключились. А нам пришло уведомление, которое мы не обработали и все дисциплинированно ждут когда же это случится.

tion-btle==1.1.2a3, попробуйте, пожалуйста. Там pairing происходит без подписки на уведомления.

issue -- достаточно удобно. Все история в одном месте и это позволяет заниматься проблемой тогда, когда это удобно.

crimean-celica commented 3 years ago

я просто покажу (это еще версия 2a2):

pi@Mini:~/projects $ bluetoothctl
Agent registered
[bluetooth]# devices
[bluetooth]# quit
pi@Mini:~/projects $ python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done. Data is b3
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Connected. BT pairing ...
DEBUG:tion_btle.tion:Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']}
CRITICAL:tion_btle.tion:Unexpected response: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']}
CRITICAL:tion_btle.tion:Got exception while pair TionException: ('pair', {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']})
DEBUG:tion_btle.tion:disconnected
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 503, in pair
    raise TionException('pair', rsp)
tion_btle.tion.TionException: ('pair', {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']})

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "p2.py", line 9, in <module>
    print(s3.pair())
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 510, in pair
    raise TionException('pair', f"{type(e).__name__}: {str(e)}")
tion_btle.tion.TionException: ('pair', "TionException: ('pair', {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']})")
pi@Mini:~/projects $ bluetoothctl
Agent registered
[Tion Breezer 3S]#
crimean-celica commented 3 years ago

обновил версию (2a3):

pi@Mini:~/projects $ bluetoothctl
Agent registered
[bluetooth]# devices
[bluetooth]# quit
pi@Mini:~/projects $ python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:_connect: connected
DEBUG:tion_btle.tion:_connect: notification was not requested
DEBUG:tion_btle.tion:Connected
DEBUG:tion_btle.tion:BT pairing ...
DEBUG:tion_btle.tion:   Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']}
CRITICAL:tion_btle.tion:__bt_pair: could not pair! Permission denied. Check permissions at host
DEBUG:tion_btle.tion:BT pairing is done
DEBUG:tion_btle.tion:pair: disconnecting
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
None
pi@Mini:~/projects $ bluetoothctl
Agent registered
[bluetooth]# devices
[bluetooth]#
crimean-celica commented 3 years ago

оу. второй запуск, "подряд":

pi@Mini:~/projects $ python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:_connect: connected
DEBUG:tion_btle.tion:_connect: notification was not requested
DEBUG:tion_btle.tion:Connected
DEBUG:tion_btle.tion:BT pairing ...
DEBUG:tion_btle.tion:   Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']}
CRITICAL:tion_btle.tion:__bt_pair: could not pair! Permission denied. Check permissions at host
DEBUG:tion_btle.tion:BT pairing is done
DEBUG:tion_btle.tion:pair: disconnecting
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
None
pi@Mini:~/projects $ bluetoothctl
Agent registered
[CHG] Device F1:5A:F4:6E:FB:62 Connected: no
[DEL] Device F1:5A:F4:6E:FB:62 Tion Breezer 3S
[bluetooth]# devices
[bluetooth]#
IATkachenko commented 3 years ago

Видимо, ему не нравился exception во время обработки exception'a. Надо будет внимательно эту часть переработать.

Отлично, теперь и в случае проблем отключается правильно.

Как я понимаю, теперь у вас все работает корректно и стабильно. И, как только будет разрешена проблема с правами доступа к bluetooth, все заработает и от непривилегированного пользователя.

crimean-celica commented 3 years ago

так оно и так работало для обычного пользователя. версия 2a2 (уже после реализации инструкции https://stackoverflow.com/questions/34599703/rfcomm-bluetooth-permission-denied-error-raspberry-pi)

под обычным пользователем сопрягается несмотря на ошибку и (после ручного отключения) отдает данные

tion-btle     1.1.2a2
urllib3       1.24.1
wheel         0.32.3
pi@Mini:~/projects $ bluetoothctl
Agent registered
[bluetooth]# devices
[bluetooth]# quit
pi@Mini:~/projects $ python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done. Data is b3
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Connected. BT pairing ...
DEBUG:tion_btle.tion:Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']}
CRITICAL:tion_btle.tion:Unexpected response: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']}
CRITICAL:tion_btle.tion:Got exception while pair TionException: ('pair', {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']})
DEBUG:tion_btle.tion:disconnected
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 503, in pair
    raise TionException('pair', rsp)
tion_btle.tion.TionException: ('pair', {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']})

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "p2.py", line 9, in <module>
    print(s3.pair())
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 510, in pair
    raise TionException('pair', f"{type(e).__name__}: {str(e)}")
tion_btle.tion.TionException: ('pair', "TionException: ('pair', {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']})")
pi@Mini:~/projects $ bluetoothctl
Agent registered
[Tion Breezer 3S]# devices
Device F1:5A:F4:6E:FB:62 Tion Breezer 3S
[Tion Breezer 3S]# disconnect F1:5A:F4:6E:FB:62
Attempting to disconnect from F1:5A:F4:6E:FB:62
[CHG] Device F1:5A:F4:6E:FB:62 ServicesResolved: no
Successful disconnected
[CHG] Device F1:5A:F4:6E:FB:62 Connected: no
[bluetooth]# quit

получение данных:

pi@Mini:~/projects $ python3 p1.py
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done. Data is b3
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Doing _try_write. Attempt 1/3
DEBUG:tion_btle.tion:Writing 3d0100000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
DEBUG:tion_btle.tion:Got data in 11 response b31022160b001616046601122d002d02003c005a
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
DEBUG:tion_btle.s3:Data is b31022160b001616046601122d002d02003c005a
{'state': 'on', 'heater': 'on', 'heating': 'on', 'sound': 'on', 'mode': 'outside', 'out_temp': 22, 'in_temp': 4, 'heater_temp': 22, 'fan_speed': 2, 'filter_remain': 358, 'time': '18:45', 'request_error_code': 0, 'model': 'S3', 'code': 200, 'timer': 'off', 'productivity': 45, 'fw_version': '003c'}
pi@Mini:~/projects $

обновляю на 2a3, там все "хуже"

tion-btle     1.1.2a3
urllib3       1.24.1
wheel         0.32.3
pi@Mini:~/projects $ bluetoothctl
Agent registered
[bluetooth]# devices
[bluetooth]# quit
pi@Mini:~/projects $ python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:_connect: connected
DEBUG:tion_btle.tion:_connect: notification was not requested
DEBUG:tion_btle.tion:Connected
DEBUG:tion_btle.tion:BT pairing ...
DEBUG:tion_btle.tion:   Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']}
CRITICAL:tion_btle.tion:__bt_pair: could not pair! Permission denied. Check permissions at host
DEBUG:tion_btle.tion:BT pairing is done
DEBUG:tion_btle.tion:pair: disconnecting
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
None
pi@Mini:~/projects $ bluetoothctl
Agent registered
[bluetooth]# devices
[bluetooth]# quit
pi@Mini:~/projects $

то есть сопряжения нет. итого, 2a3 не сопрягается под обычным пользователем в отличие от 2a2

crimean-celica commented 3 years ago

пробую 2a3 под рутом - работает. то есть в 2a3 сопряжение у меня работает только под рутом. а вот в 2a2 спокойно работает под обычным пользователем. и в обоих версиях нужно вручную отключаться после сопряжения (ну или, наверное, долго ждать отключения, не пробовал "долго" ждать)

tion-btle     1.1.2a3
urllib3       1.24.1
wheel         0.32.3
root@Mini:/home/pi/projects# bluetoothctl
Agent registered
[bluetooth]# devices
[bluetooth]# quit
root@Mini:/home/pi/projects# python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:_connect: connected
DEBUG:tion_btle.tion:_connect: notification was not requested
DEBUG:tion_btle.tion:Connected
DEBUG:tion_btle.tion:BT pairing ...
DEBUG:tion_btle.tion:   Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['success']}
DEBUG:tion_btle.tion:__bt_pair: success
DEBUG:tion_btle.tion:BT pairing is done
DEBUG:tion_btle.tion:pair: disconnecting
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
None
root@Mini:/home/pi/projects# bluetoothctl
Agent registered
[Tion Breezer 3S]# devices
Device F1:5A:F4:6E:FB:62 Tion Breezer 3S
[Tion Breezer 3S]# disconnect F1:5A:F4:6E:FB:62
Attempting to disconnect from F1:5A:F4:6E:FB:62
[CHG] Device F1:5A:F4:6E:FB:62 ServicesResolved: no
Successful disconnected
[CHG] Device F1:5A:F4:6E:FB:62 Connected: no
[bluetooth]# quit
root@Mini:/home/pi/projects# python3 p1.py
DEBUG:tion_btle.tion:_connect: connected
DEBUG:tion_btle.tion:_connect: notification was requested
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done. Data is b3
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Doing _try_write. Attempt 1/3
DEBUG:tion_btle.tion:Writing 3d0100000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
DEBUG:tion_btle.tion:Got data in 11 response b31022160b0016160466011238002d02003c005a
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
DEBUG:tion_btle.s3:Data is b31022160b0016160466011238002d02003c005a
{'state': 'on', 'heater': 'on', 'heating': 'on', 'sound': 'on', 'mode': 'outside', 'out_temp': 22, 'in_temp': 4, 'heater_temp': 22, 'fan_speed': 2, 'filter_remain': 358, 'time': '18:56', 'request_error_code': 0, 'model': 'S3', 'code': 200, 'timer': 'off', 'productivity': 45, 'fw_version': '003c'}
root@Mini:/home/pi/projects#
IATkachenko commented 3 years ago

a2 и a3 отличаются подпиской на уведомления и тем, что в a3 если не проходит bluetooth сопряжение, то и не выполняется тинон-специфичное сопряжение.

Логи в части BT сопряжения у a2 и a3 идентичные. Давайте попробуем merge: выполнять тион-сопряжение даже если BT не прошло, но не подписываться на уведомления. tion-btle==1.1.2a4 доступна

crimean-celica commented 3 years ago

пробую 2a4 под обычным:

tion-btle     1.1.2a4
urllib3       1.24.1
wheel         0.32.3
pi@Mini:~/projects $ bluetoothctl
Agent registered
[bluetooth]# devices
[bluetooth]# quit
pi@Mini:~/projects $ python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:_connect: connected
DEBUG:tion_btle.tion:_connect: notification was not requested
DEBUG:tion_btle.tion:Connected
DEBUG:tion_btle.tion:BT pairing ...
DEBUG:tion_btle.tion:   Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']}
CRITICAL:tion_btle.tion:__bt_pair: could not pair! Permission denied. Check permissions at host
DEBUG:tion_btle.tion:BT pairing is failed
DEBUG:tion_btle.tion:pair: device-specific pairing ...
DEBUG:tion_btle.s3:Sending pair command
DEBUG:tion_btle.tion:Doing _try_write. Attempt 1/3
DEBUG:tion_btle.tion:Writing 3d0501000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
DEBUG:tion_btle.s3:Done!
DEBUG:tion_btle.tion:pair: device pair is done
DEBUG:tion_btle.tion:pair: disconnecting
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: current status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
None
pi@Mini:~/projects $ bluetoothctl
Agent registered
[bluetooth]# devices
[bluetooth]# quit
pi@Mini:~/projects $

p.s. попробовал 3 раза. результат одинаковый. сопряжения нет.

crimean-celica commented 3 years ago

под рутом - поведение все то же. сопряжение есть, дисконнекта нет:

tion-btle     1.1.2a4
urllib3       1.24.1
wheel         0.32.3
root@Mini:/home/pi/projects# bluetoothctl
Agent registered
[bluetooth]# devices
[bluetooth]# quit
root@Mini:/home/pi/projects# python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:_connect: connected
DEBUG:tion_btle.tion:_connect: notification was not requested
DEBUG:tion_btle.tion:Connected
DEBUG:tion_btle.tion:BT pairing ...
DEBUG:tion_btle.tion:   Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['success']}
DEBUG:tion_btle.tion:__bt_pair: success
DEBUG:tion_btle.tion:BT pairing is failed
DEBUG:tion_btle.tion:pair: device-specific pairing ...
DEBUG:tion_btle.s3:Sending pair command
DEBUG:tion_btle.tion:Doing _try_write. Attempt 1/3
DEBUG:tion_btle.tion:Writing 3d0501000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
DEBUG:tion_btle.s3:Done!
DEBUG:tion_btle.tion:pair: device pair is done
DEBUG:tion_btle.tion:pair: disconnecting
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: current status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
None
root@Mini:/home/pi/projects# bluetoothctl
Agent registered
[Tion Breezer 3S]# devices
Device F1:5A:F4:6E:FB:62 Tion Breezer 3S
[Tion Breezer 3S]# quit
root@Mini:/home/pi/projects#
crimean-celica commented 3 years ago

может разделить issue? по сути, "невозможно считать информацию" было решено в 1.1.2a2. а дальше мы занимаемся сопряжением. которое, в принципе, было рабочее под обычным пользователем в той же 2a2 (но у меня требовало отключения и писало лишние сообщения), а в последующих версиях сопряжение уже работает только под рутом и все равно требует ручного отключения

IATkachenko commented 3 years ago

Видимо да, по результатам я возьму 2a2 как рабочую. А дальше буду думать как сделать правильно отключение. Но я не понимаю за счет чего в 2a3 сломалось сопряжение...

IATkachenko commented 3 years ago

@crimean-celica, не могли бы вы еще раз проверить 2a2 на тему сопряжения. Интересует следующий тест:

pip3 list | grep tion-btle
bluetoothctl paired-devices
# тут мы удаляем всю информацию о сопряжении с бризером из системы
sudo rm -rf '/var/lib/bluetooth/*/F1:5A:F4:6E:FB:62'
# после этого нужен рестарт bluetooth
sudo systemctl restart bluetooth
# убеждаемся что сопряжения нет
bluetoothctl paired-devices
python3 p2.py
# если нужно bluetoothctl disconnect
# узнаем есть ли сопряжение
bluetoothctl paired-devices
# если бризер вышел из режима сопряжения получаем данные
python3 p1.py

Если это сработает -- выкачу 1.1.2 на основе 2a2 и буду решать проблему disconnect. Если нет -- на основе результата сделаем еще одно issue, а в примечаниях напишем что нужен root и все трюки не помогли.

crimean-celica commented 3 years ago

внимание! я делал вот это вот "до того, как": https://www.raspberrypi.org/forums/viewtopic.php?t=108581 "как оказалось" (ц) (тм) без "этого" сопряжение не под рутом не работает. как минимум у меня. вернул. дальше - "по инструкции":

pi@Mini:~/projects $ pip3 list | grep tion-btle
etoothctl paired-devices
# тут мы удаляем всю информацию о сопряжении с бризером из системы
sudo rm -rf '/var/lib/bluetooth/*/F1:5A:F4:6E:FB:62'
# после этого нужен рестарт bluetooth
sudo systemctl restart bluetooth
# убеждаемся что сопряжения нет
bluetoothctl paired-devicestion-btle     1.1.2a2
pi@Mini:~/projects $ bluetoothctl paired-devices
Device F1:5A:F4:6E:FB:62 Tion Breezer 3S
pi@Mini:~/projects $ # тут мы удаляем всю информацию о сопряжении с бризером из системы
pi@Mini:~/projects $ sudo rm -rf '/var/lib/bluetooth/*/F1:5A:F4:6E:FB:62'
pi@Mini:~/projects $ # после этого нужен рестарт bluetooth
pi@Mini:~/projects $ sudo systemctl restart bluetooth
pi@Mini:~/projects $ # убеждаемся что сопряжения нет
pi@Mini:~/projects $ bluetoothctl paired-devices
Device F1:5A:F4:6E:FB:62 Tion Breezer 3S
pi@Mini:~/projects $ bluetoothctl paired-devices
Device F1:5A:F4:6E:FB:62 Tion Breezer 3S
pi@Mini:~/projects $ bluetoothctl
Agent registered
[bluetooth]# remove F1:5A:F4:6E:FB:62
[DEL] Device F1:5A:F4:6E:FB:62 Tion Breezer 3S
Device has been removed
[bluetooth]# quit

итого, на этот момент у нас точно нет устройств. первое спаривание:

pi@Mini:~/projects $ bluetoothctl devices
pi@Mini:~/projects $ sudo systemctl restart bluetooth
pi@Mini:~/projects $ bluetoothctl devices
pi@Mini:~/projects $ python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
WARNING:tion_btle.tion:Got exception 'Device disconnected' while first read, but it is OK and we may ignore it
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Connected. BT pairing ...
CRITICAL:tion_btle.tion:Got exception while pair BTLEInternalError: Helper not started (did you call connect()?)
DEBUG:tion_btle.tion:disconnected
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: status is disc
DEBUG:tion_btle.tion:_disconnect: done
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 486, in pair
    self._btle._writeCmd('pair' + '\n')
  File "/home/pi/.local/lib/python3.7/site-packages/bluepy/btle.py", line 302, in _writeCmd
    raise BTLEInternalError("Helper not started (did you call connect()?)")
bluepy.btle.BTLEInternalError: Helper not started (did you call connect()?)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "p2.py", line 9, in <module>
    print(s3.pair())
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 510, in pair
    raise TionException('pair', f"{type(e).__name__}: {str(e)}")
tion_btle.tion.TionException: ('pair', 'BTLEInternalError: Helper not started (did you call connect()?)')
pi@Mini:~/projects $

вторая попытка:

pi@Mini:~/projects $ python3 p2.py
DEBUG:tion_btle.tion:Pairing
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done. Data is b3
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Connected. BT pairing ...
DEBUG:tion_btle.tion:Got response while sending pair command: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']}
CRITICAL:tion_btle.tion:Unexpected response: {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']}
CRITICAL:tion_btle.tion:Got exception while pair TionException: ('pair', {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']})
DEBUG:tion_btle.tion:disconnected
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 503, in pair
    raise TionException('pair', rsp)
tion_btle.tion.TionException: ('pair', {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']})

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "p2.py", line 9, in <module>
    print(s3.pair())
  File "/home/pi/.local/lib/python3.7/site-packages/tion_btle/tion.py", line 510, in pair
    raise TionException('pair', f"{type(e).__name__}: {str(e)}")
tion_btle.tion.TionException: ('pair', "TionException: ('pair', {'rsp': ['mgmt'], 'code': ['mgmterr'], 'estat': [20], 'emsg': ['Permission Denied']})")
pi@Mini:~/projects $ bluetoothctl devices
Device F1:5A:F4:6E:FB:62 Tion Breezer 3S
pi@Mini:~/projects $ bluetoothctl
Agent registered
[bluetooth]# quit
pi@Mini:~/projects $

то есть, мы сопряжены и отключены. мистика. проверка получения данных:

pi@Mini:~/projects $ python3 p1.py
DEBUG:tion_btle.tion:Enabling notification
DEBUG:tion_btle.tion:Notify handler is 11
DEBUG:tion_btle.tion:Will write b'\x01\x00' to 12 handle
DEBUG:tion_btle.tion:Result is {'rsp': ['wr']}
DEBUG:tion_btle.tion:Delegation enabled
DEBUG:tion_btle.tion:First read done. Data is b3
DEBUG:tion_btle.tion:enable_notification is done
DEBUG:tion_btle.tion:Doing _try_write. Attempt 1/3
DEBUG:tion_btle.tion:Writing 3d0100000000000000000000000000000000005a to 6e400002-b5a3-f393-e0a9-e50e24dcca9e
DEBUG:tion_btle.tion:Got data in 11 response b31022160b001616056501001a002d03003c005a
DEBUG:tion_btle.tion:_disconnect: disconnecting
DEBUG:tion_btle.tion:_disconnect: status is conn
DEBUG:tion_btle.tion:_disconnect: calling disconnect()
DEBUG:tion_btle.tion:_disconnect: done
DEBUG:tion_btle.s3:Data is b31022160b001616056501001a002d03003c005a
{'state': 'on', 'heater': 'on', 'heating': 'on', 'sound': 'on', 'mode': 'outside', 'out_temp': 22, 'in_temp': 5, 'heater_temp': 22, 'fan_speed': 2, 'filter_remain': 357, 'time': '0:26', 'request_error_code': 0, 'model': 'S3', 'code': 200, 'timer': 'off', 'productivity': 45, 'fw_version': '003c'}
pi@Mini:~/projects $

все работает p.s. вообще это сопряжение как-то "волшебно" работает. если начинать с рестарта синезуба, то (вроде как пока) со второй попытки есть сопряжение и устройство отключено, то есть, готово к работе "накануне" было не так. но я НЕ делал рестарт синезубому сервису

crimean-celica commented 3 years ago

оставлю это тут "на всякий случай" https://www.raspberrypi.org/forums/viewtopic.php?p=746917#p746917 step.1.

sudo nano /etc/dbus-1/system.d/bluetooth.conf

step.2.

  <policy user="pi">
    <allow send_destination="org.bluez"/>
    <allow send_interface="org.bluez.Agent1"/>
    <allow send_interface="org.bluez.GattCharacteristic1"/>
    <allow send_interface="org.bluez.GattDescriptor1"/>
    <allow send_interface="org.freedesktop.DBus.ObjectManager"/>
    <allow send_interface="org.freedesktop.DBus.Properties"/>
  </policy>
crimean-celica commented 3 years ago

некропостинг, извините. но. еще информация на RPi4 были и (пока) есть вопросы установки bluepy (и зависимых компонент, того же bluez). на RPi Zero все ставится "чисто" с первого раза и без вопросов. работает аналогично. то есть как и должно, без вопросов все тестирование выше делалось только с RPi4. при повторной "чистой" установке на тот же RPi4 1.1.2a2 стала давать очень быстрый disconnect после сопряжения в ранних установках я ставил руками libglib2.0-dev в финальной установке делал ручное "sudo pip3 install bluepy" перед установкой "tion-btle" и проблем не возникло итого - похоже, часть проблем связано со спецификой зависимостей на RPi4