TionAPI / tion_python

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

Бризер начал сопрягаться "штатно", метод "из библиотеки" не работает #23

Closed crimean-celica closed 3 years ago

crimean-celica commented 3 years ago

Версия модуля: 1.1.2a2 (пробовал 1.2.0, с ней - тот же результат) Модель бризера: 3S Версия прошивки (если известна): 003C

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

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

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

При попытке выполнить сопряжение бризера с новой "малиной" (с новым телефоном - без проблем) обнаружил невозможность сопряжения. После отключения от старой RPi - невозможно сопрячь "обратно". Пробовал 4 разных устройства 2RPi 4B (2 и 8 Gb) и 2RPi Zero W с одинаковым результатом. В итоге решил перепроверить MAC устройства и не нашел ничего лучшего, чем просто сопрячь с ноутом. Сопряглось. Удивился. МАК - тот. После чего выполнил сопряжение с "нужной" "малиной" просто через bluetoothctrl: scan on / pair / scan off / trust (на всякий случай). Все отработало. Дальше api server работает и отдает данные без проблем.

Логи

pi@Maxi:~/tion $ bluetoothctl
Agent registered
[bluetooth]# devices
[bluetooth]# scan on
Discovery started
[CHG] Controller DC:A6:32:BB:64:1D Discovering: yes
[NEW] Device FB:AD:7D:2C:20:3B Tion Breezer 3S
[bluetooth]# scan off
[CHG] Controller DC:A6:32:BB:64:1D Discovering: no
Discovery stopped
[bluetooth]# devices
Device FB:AD:7D:2C:20:3B Tion Breezer 3S
[bluetooth]# pair FB:AD:7D:2C:20:3B
Attempting to pair with FB:AD:7D:2C:20:3B
[CHG] Device FB:AD:7D:2C:20:3B Connected: yes
Failed to pair: org.bluez.Error.AuthenticationTimeout
[CHG] Device FB:AD:7D:2C:20:3B Connected: no
[bluetooth]# devices
Device FB:AD:7D:2C:20:3B Tion Breezer 3S
[bluetooth]# quit
pi@Maxi:~/tion $ sudo systemctl restart bluetooth
pi@Maxi:~/tion $ bluetoothctl
Agent registered
[bluetooth]# devices
Device FB:AD:7D:2C:20:3B Tion Breezer 3S
[bluetooth]#

Это логи от соединения RPi4, которая после соединения данные не получает. При этом Zero W после такого же соединения данные получает. Zero здесь поставленая "наново", RPi4 - на склоненой SD карты от другой "малины". Я убил на это все около 3 вечеров, не получая значимого результата. И только сегодня получилось соединить устройства с последующим успешным получением данных. Уже с этой позиции попробую как-то систематизировать происходящее. Потому как с одной стороны я получил желаемое - управление через api server. С другой - хочется найти причину проблем сопряжения, становится жалко потраченного времени. С третьей, если таких проблем больше ни у кого нет - можно времени больше не тратить, так как я свою проблему решил.

IATkachenko commented 3 years ago

У проблем с сопряжением есть две стороны:

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

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

При этом если бризер находится в режиме сопряжения, он корректно ответит на одну любую команду (ожидает, конечно, получить команду сопряжения, но если придет запрос состояния -- пришлет ответ) => если в режиме сопряжения с бризером ничего не получается сделать через библиотеку, то разбираться надо с bluetooth-стеком в системе.

crimean-celica commented 3 years ago

По факту у меня 2 ZeroW как-то подключились и стабильно работают, каждая со своим бризером (нет удобного места для того, чтобы 1 малина уверенно видела оба бризера), одна на 1.1.2a2, вторая на 1.1.2. Как делалось сопряжение на старой - уже не скажу, на новой - описал выше. А вот 2 RPi4 не могу подключить. Я не трогал ничего где-то с декабря прошлого года - тогда RPi4 получалось "запинать" (было обсуждение здесь, которое привело к некоторым модификациям данной библиотеки) и поднять стабильно работающий api server. Собственно, это и послужило причиной появления второй ZeroW. Которая, в итоге, решила мою проблему управления после неудачных попыток оживить коннект с 4й модели. Так что зависимость от стека хоста определенно есть - у меня налицо разное поведение RPi 4 vs RPi Zero при том что обе ставились с нуля, "начисто", актуальными версиями. Если есть время/желание повозиться с поиском причин - я готов тратить время - у меня "образовалась" выделенная "песочница" в виде "лишней" RPi4, с которой можно делать что угодно без существенных ограничений по времени и без вреда для существующей инфраструктуры. Могу начать с установки "чистой" системы + проведение тестового сопряжения.

IATkachenko commented 3 years ago

Чистой установка не получится: бризер уже помнит что с этой малиной было сопряжение. Поэтому возможно всякое.

У меня под рукой тоже образовалась одна RPi4 не очень часто занята чем-то полезным. Будет время на ней посмотрю что происходит, может там действительно что-то не очевидное в части bluetooth.

Я почти уверен что в части библиотеки работает все корректно (просто потому что библиотека на уровень BT лезет в двух местах: сопряжение и работа с уведомлениями. И то, и другое делается через bluepy, те от кода библиотеки не зависит). Так что исследование будет посвящено скорее правильной настройке BT/bluepy на Pi4.

ps. более того, у меня есть идея добавить поддержку bleak в качестве второго backend для работы с BT. Первые тесты я делал несколько лет назад и было все гораздо лучше чем через bluepy.

crimean-celica commented 3 years ago

Чистой установка не получится: бризер уже помнит что с этой малиной было сопряжение.

насколько я помню, вот тут https://github.com/TionAPI/tion_python/issues/17 я использовал как раз RPi4, на ней совершенно спокойно выполнялось многократное сопряжение через tion_btle/remove из bluetoothctrl. и таких проблем, как сейчас - не возникало. к сожалению, у меня не осталось образа системы той версии для "контрольной проверки". а в текущих версиях (за год было прилично обновлений) стабильно работают только Zero, у которых чуть другой набор библиотек в силу чуть другой элементной базы

образовалась одна RPi4 на ней посмотрю что происходит

спасибо! да, так будет гораздо быстрее (и эффективнее)

IATkachenko commented 3 years ago

Да, в Pi4 происходят неочевидные вещи с bluetooth.

На встроенном адаптере заставить это работать не получилось. Даже с внешним адаптером вставленным прямо в малину не работает. Пришлось уносить на удлинителе. Вот тут обсуждается похожая проблема https://github.com/TionAPI/HA-tion/issues/60

Похоже что эту проблему программными способами решить не получится.

crimean-celica commented 3 years ago

На встроенном адаптере заставить это работать не получилось

да, но я начинал "это" запускать именно на RPi4 и все работало - если поднять мои первые инциденты - они были именно про RPi4 и там было вполне себе успешно-стабильное поведение. но после определенного времени (и обновлений!) я уже совсем не смог запинать "четверку" (пробовал с 2 разных устройств). при этом Zero все это время работает достаточно стабильно. итого, есть неплохая вероятность, что сломали что-то в обновлениях. этот вариант можно проверить, если получится "откатиться" с прошивками на пару лет назад. но времени-желания это делать у меня пока особого нет. спасибо за совет про "шнурок" - будет повод - проверю с ним. хотя я для себя закрыл вопрос управления покупкой пары Zero, которые у меня как device proxy работают и работают вполне стабильно, с чистым syslog.

IATkachenko commented 3 years ago

Между "старыми" и "новыми" версиями есть одно существенное отличие в способе общения с бризером. Оно появилось в v0.2.2: до этого компонент читал характеристику, а в 0.2.2 начал подписываться на notification'ы, поскольку Lite (и 4S в будущем) используют многопакетные сообщения.