TionAPI / tion_python

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

[Feature Request] Поддержка Tion Lite #2

Closed mozoh closed 3 years ago

mozoh commented 4 years ago

Есть ли какие-то различия в API между S3 и Lite устройствами?

IATkachenko commented 4 years ago

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

Чтобы добавить поддержку мне нужно (как минимум) убедиться что формируемые мной пакеты соответсвуют тем, которые отправляет приложение, а как максимум еще как-то проверить что все работает. В моем случае это можно сделать только руками энтузиастов.

IATkachenko commented 4 years ago

На Хабре мне прислали дамп взаимовдействия с Lite, так что в ближайшее время попробую сделать поддержку и для них.

IATkachenko commented 4 years ago

Потихоньку в эту сторону копаем. Уже сделана экспериментальная поддержка (ветка lite). После окончания тестирования буду причесывать код, сводить вместе dev и lite и готовить релиз 1.0 с поддержкой обоих бризеров.

lych commented 3 years ago

Привет. В lite.py, вот тут немного странный код

            self._state = bool(self._process_status(data[0] & 1))
            self._sound = bool(self._process_status(data[0] >> 1 & 1))
            self._light = bool(self._process_status(data[0] >> 2 & 1))
            self._filter_change_required = self._process_status(data[0] >> 4 & 1)
            self._co2_auto_control = self._process_status(data[0] >> 5 & 1)
            self._heater = bool(self._process_status(data[0] >> 6 & 1))
            self._have_heater = self._process_status(data[0] >> 7 & 1)

приведение bool к строке и потом опять к bool, результат всегда true, из буфера читаются правильные значения а в переменные всегда записывается True. Наверное как то вот так должно быть:

            self._state = data[0] & 1
            self._sound = data[0] >> 1 & 1
            self._light = data[0] >> 2 & 1
            self._filter_change_required = data[0] >> 4 & 1
            self._co2_auto_control = data[0] >> 5 & 1
            self._heater = data[0] >> 6 & 1
            self._have_heater = data[0] >> 7 & 1

Все функции которые есть в приложении работают, считываются и выставляются, кроме количества дней оставшихся до замены фильтра. Ну и все остальные счетчики и температуры тоже не попадают, но их и в приложении нет. Ну еще self._light считывается и записывается но ни на что не влияет, лампочки на девайсе все равно горят. Через приложение их тоже нельзя отключить.

IATkachenko commented 3 years ago

@lych, спасибо за тестирование!

Я не очень знаком с приложением. Не могли бы вы указать какие именно параметры определяются/выставляются корректно, какие -- нет и каких нет в приложении? Я тогда солью все в dev до перехода на bleak и асинхронный режим работы.

Со статусами понял, посмотрю внимательнее, что я хотел этим сказать ;) Точнее что хотел сказать понятно, но, действительно, какая-то фигня получилась.

lych commented 3 years ago

1) Включение/выключение 2) Скорость вентилятора 3) Вкл/Выкл подогрева 4) Температура подогрева 5) Вкл/Выкл звукового подтверждения (пикает в ответ на команды) 6) Количество дней до замены фильтра Вот, это весь функционал приложения для lite. Больше ничего нет.

1-5 работают, корректно считываются и выставляются.

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

Всего остального в приложении нет.

Единственное, electronic temp похож на температуру выходящего из бризера воздуха, колеблется около целевой температуры нагрева, но если нагрев отключить ниже ноля не падает, хотя за окном -12.

DEBUG:tion.tion:Doing _connect. Attempt 1/3
DEBUG:tion.tion:Enabling notification
DEBUG:tion.tion:Notify handler is 18
DEBUG:tion.tion:Will write b'\x01\x00' to 19 handle
DEBUG:tion.tion:Result is {'rsp': ['wr']}
DEBUG:tion.tion:Final read
DEBUG:tion.tion:Enable notification finished
DEBUG:tion.tion:Doing _try_write. Attempt 1/3
DEBUG:tion.tion:Writing 8010003a0232120dd71f8f48d3c31abbaa to 98f00002-3788-83ea-453e-f52244709ddb
DEBUG:tion.lite:Collecting data
DEBUG:tion.tion:Got data in 18 response 0049003a0131120dd71f8f181a50f1cfd8020f04
DEBUG:tion.lite:Got 0049003a0131120dd71f8f181a50f1cfd8020f04 from tion
DEBUG:tion.tion:Got data in 18 response 40000f146b170300e0d802004275ea004d670c00
DEBUG:tion.lite:Got 40000f146b170300e0d802004275ea004d670c00 from tion
DEBUG:tion.tion:Got data in 18 response 4000000000000000000000000200010000000000
DEBUG:tion.lite:Got 4000000000000000000000000200010000000000 from tion
DEBUG:tion.tion:Got data in 18 response c000000000000a1419020406062800ef7e
DEBUG:tion.lite:Got c000000000000a1419020406062800ef7e from tion
DEBUG:tion.lite:Header is 0049003a0131120dd71f8f181a50f1
DEBUG:tion.lite:Data is cfd8020f0440000f146b170300e0d802004275ea004d670c004000000000000000000000000200010000000000c000000000000a1419020406062800
INFO:tion.lite:state is on
INFO:tion.lite:sound is on
INFO:tion.lite:light is on
INFO:tion.lite:filter change required is 0
INFO:tion.lite:co2 auto control is 0
INFO:tion.lite:have_heater is 1
INFO:tion.lite:heater is on
INFO:tion.lite:air mode 2
INFO:tion.lite:target temperature is 15
INFO:tion.lite:fan sped is 4
INFO:tion.lite:in temp is 64
INFO:tion.lite:out temp is 0
INFO:tion.lite:electronic temp is 15
INFO:tion.lite:electronic work time is 15.487673611111111
INFO:tion.lite:filter_used 50.4%
INFO:tion.lite:device work time is 58.71125
INFO:tion.lite:error code is 0
crc is: ef7e
header._package_size = 73
header_commad_type = 31
DEBUG:__main__:Initial state: device is on, light is on, sound is on, heater is on, fan_speed is 4, target_temp is 15
lych commented 3 years ago

filter change required is 0 - верно, если через 177 дней станет 1, значит работает :) have_heater is 1 - верно, но подтвердить можно только на бризере без нагревателя co2 auto control is 0 - похоже верно, чтобы проверить думаю нужна базовая станция, у меня ее нет air mode 2 - меняется, когда выключен 1 (предполагаю что это значит - заслонка закрыта), когда включен 2 (открыта), ловить в момент когда заслонка двигается чет лениво) но может попробую in temp is 64 - всегда 64 out temp is 0 - видел два значения 0 и 255, 255 было при выключенном нагреве и температуре на улице -12 electronic work time is 15.487673611111111, device work time is 58.71125 непонятно что, бризер установлен ~2,5 суток назад, работает практически 24/7 c небольшими перерывами

dkrylov1990 commented 3 years ago

А планируете lite в компонент HA вынести?

IATkachenko commented 3 years ago

@lych, еще раз спасибо! Ваших проверок вполне достаточно чтобы перенести lite часть в основную ветку. out temp проверю еще раз -- у меня, вроде есть нужные дампы. Да и ваш лог дает нужный пакет.

device work -- это действительно время работы (судя по всему чистое). electronic work -- подозреваю что время работы нагревателя.

@dkrylov1990, да, поскольку для HA принципиальной разницы не будет что за бризер (всю разницу берет на себя этот python-модуль). Следите за релизами!

IATkachenko commented 3 years ago

@lych, проблему out temp увидел -- пакет неправильно восстанавливается.

IATkachenko commented 3 years ago

Готово. Изменения слиты в v0.2.2 и выложены в pypi.

@lych, подправил найденные вами ошибки (и добавил новых). Не могли бы вы проверить v0.2.2 из pypi (pip3 install tion_btle). Если базовый функционал работает, то это issue я закрою, а то что выловится предлагаю править в новых.

lych commented 3 years ago

Забрал изменения из репы, pip пока не пробовал. Как минимум в счетчиках порядок байт обратный. response[16:20], byteorder='little', signed=False - количество секунд оставшихся до замены фильтра, при делении на 86400 получается количество дней, в моем случае 176 дней осталось. @IATkachenko, поправьте пожалуйста и тогда всё, 100% функций приложения покрыто.

lych commented 3 years ago

А вот с остальным не очень понятно. electronic work time is 4.259432870370371 device work time is 16.69193287037037 Непонятно что эти цифры означают, да и не особо интересно :-), но теперь они хотя бы не скачут от запуска к запуску (после смены byteorder на little) а видно что это какие-то увеличивающиеся счетчики.

А вот с температурами непонятно. У лайт из-за особенностей конструкции при включенном нагревателе входную температуру наверное измерить невозможно, там нагреватель прям на входе (девайс не разбирал, но так мне показалось). out_temp теперь при изменении target_temp, стремится к ней, но опять же ниже нуля не показывает при отключенном нагревателе и температуре снаружи -15. Может это не ошибка а так и задумано, в приложении никаких температур не показывает, так что не понятно. Могу еще дампов выложить с включенным нагревателем и без если интересно.

IATkachenko commented 3 years ago

у work time тоже был неправильный порядок -- тоже little должен быть. При замене на little похоже на что-то осмысленное?

При отключенном нагревателе и отрицательных температурах бризер может закрывать заслонку (s3 так делает). Не ваш случай? Может еще нагреватель принудительно включается.

Из дампов, на текущем этапе, наиболее интересны строчки:

Обновление залил (модуль пока не выкладываю, до завершения исправлений).

lych commented 3 years ago

При big все счетчики скачут как попало, то есть очень похоже на перепутанный порядок. С little все гораздо лучше, просто увеличивающиеся цифры (уменьшающиеся в случае filter_used). electronic work time похож на секунды, сейчас у меня 4.2 дня, столько он у меня вроде бы не работает но возможно они еще на заводе какое-то время испытания проходят, по крайней мере близко к реальному. electronic work time - как будто увеличивается каждые 200мс, у меня нет идей что это может быть. Да ну и не особо это важно, главное время до замены фильтра правильно.

lych commented 3 years ago

Нагрев выключен, заслонка открыта, на улице -12 (приблизительно). Воздух из тиона дует точно ниже 0, к сожалению точно померить нечем.

DEBUG:tion.tion:Doing _connect. Attempt 1/3
DEBUG:tion.tion:Enabling notification
DEBUG:tion.tion:Notify handler is 18
DEBUG:tion.tion:Will write b'\x01\x00' to 19 handle
DEBUG:tion.tion:Result is {'rsp': ['wr']}
DEBUG:tion.tion:Doing _try_write. Attempt 1/3
DEBUG:tion.tion:Writing 8010003a0232120dd71f8f48d3c31abbaa to 98f00002-3788-83ea-453e-f52244709ddb
DEBUG:tion.lite:Collecting data
DEBUG:tion.tion:Got data in 18 response 0049003a4531120dd71f8fe05f88498fd8020004
DEBUG:tion.lite:Got 0049003a4531120dd71f8fe05f88498fd8020004 from tion
DEBUG:tion.tion:Got data in 18 response 40fd001117aa0500b75605006bf7e7002f401600
DEBUG:tion.lite:Got 40fd001117aa0500b75605006bf7e7002f401600 from tion
DEBUG:tion.lite:Package is [253, 0, 17, 23, 170, 5, 0, 183, 86, 5, 0, 107, 247, 231, 0, 47, 64, 22, 0]
DEBUG:tion.tion:Got data in 18 response 4000000000000000000000000200010000000000
DEBUG:tion.lite:Got 4000000000000000000000000200010000000000 from tion
DEBUG:tion.lite:Package is [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0]
DEBUG:tion.tion:Got data in 18 response c000000000000a1419020406061800734c
DEBUG:tion.lite:Got c000000000000a1419020406061800734c from tion
DEBUG:tion.lite:Header is 0049003a4531120dd71f8fe05f8849
DEBUG:tion.lite:Data is 8fd8020004fd001117aa0500b75605006bf7e7002f4016000000000000000000000000020001000000000000000000000a1419020406061800
INFO:tion.lite:state is on
INFO:tion.lite:sound is on
INFO:tion.lite:light is on
INFO:tion.lite:filter change required is 0
INFO:tion.lite:co2 auto control is 0
INFO:tion.lite:have_heater is 1
INFO:tion.lite:heater is off
INFO:tion.lite:air mode 2
INFO:tion.lite:target temperature is 0
INFO:tion.lite:fan sped is 4
INFO:tion.lite:in temp is 253
INFO:tion.lite:out temp is 0
INFO:tion.lite:electronic temp is 17
INFO:tion.lite:electronic work time is 371223
INFO:tion.lite:filter_used 15202155.000000
INFO:tion.lite:days left until filter replacement: 175
INFO:tion.lite:device work time is 1458223
INFO:tion.lite:error code is 0
crc is: 1800
header._package_size = 73
header_commad_type = 31
DEBUG:__main__:Initial state: device is on, light is on, sound is on, heater is off, fan_speed is 4, target_temp is 0
lych commented 3 years ago

Нагрев включен, заслонка открыта, на улице -12 (приблизительно). Воздух дует нагретый, опять же точно померить нечем, по ощущениям градусов +20, при цевлевых +23.

''' DEBUG:tion.tion:Doing _connect. Attempt 1/3 DEBUG:tion.tion:Enabling notification DEBUG:tion.tion:Notify handler is 18 DEBUG:tion.tion:Will write b'\x01\x00' to 19 handle DEBUG:tion.tion:Result is {'rsp': ['wr']} DEBUG:tion.tion:Doing _try_write. Attempt 1/3 DEBUG:tion.tion:Writing 8010003a0232120dd71f8f48d3c31abbaa to 98f00002-3788-83ea-453e-f52244709ddb DEBUG:tion.lite:Collecting data DEBUG:tion.tion:Got data in 18 response 0049003a5531120dd71f8fd44a950fcfd8021704 DEBUG:tion.lite:Got 0049003a5531120dd71f8fd44a950fcfd8021704 from tion DEBUG:tion.tion:Got data in 18 response 40fe17115aac0500fa58050028f5e7007e4b1600 DEBUG:tion.lite:Got 40fe17115aac0500fa58050028f5e7007e4b1600 from tion DEBUG:tion.lite:Package is [254, 23, 17, 90, 172, 5, 0, 250, 88, 5, 0, 40, 245, 231, 0, 126, 75, 22, 0] DEBUG:tion.tion:Got data in 18 response 4000000000000000000000000200010000000000 DEBUG:tion.lite:Got 4000000000000000000000000200010000000000 from tion DEBUG:tion.lite:Package is [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0] DEBUG:tion.tion:Got data in 18 response c000000000000a14190204060549001c78 DEBUG:tion.lite:Got c000000000000a14190204060549001c78 from tion DEBUG:tion.lite:Header is 0049003a5531120dd71f8fd44a950f DEBUG:tion.lite:Data is cfd8021704fe17115aac0500fa58050028f5e7007e4b16000000000000000000000000020001000000000000000000000a1419020406054900 INFO:tion.lite:state is on INFO:tion.lite:sound is on INFO:tion.lite:light is on INFO:tion.lite:filter change required is 0 INFO:tion.lite:co2 auto control is 0 INFO:tion.lite:have_heater is 1 INFO:tion.lite:heater is on INFO:tion.lite:air mode 2 INFO:tion.lite:target temperature is 23 INFO:tion.lite:fan sped is 4 INFO:tion.lite:in temp is 254 INFO:tion.lite:out temp is 23 INFO:tion.lite:electronic temp is 17 INFO:tion.lite:electronic work time is 371802 INFO:tion.lite:filter_used 15201576.000000 INFO:tion.lite:days left until filter replacement: 175 INFO:tion.lite:device work time is 1461118 INFO:tion.lite:error code is 0 crc is: 4900 header._package_size = 73 header_commad_type = 31 DEBUG:main:Initial state: device is on, light is on, sound is on, heater is on, fan_speed is 4, target_temp is 23 '''

lych commented 3 years ago

Да в общем и целом не нужны они эти температуры. Вместо входной из-за конструкции там похоже температура нагревателя. Выходная - соответствует целевой, если мощности нагревателя не хватает поддерживать целевую он просто снижает обороты, например сейчас он у меня с включенным нагревателем не дает поставить 6 скорость, максимум 5 (на улице около -12), а если нагреватель выключить то 6 (максимальная) без проблем. Вот и получается что в повседневном использовании они не нужны эти температуры, ничего неизвестного они не показывают.

IATkachenko commented 3 years ago

Похоже что out_temp не умеет (на стороне бризера) быть ниже нуля. in temp кодируется при помощи дополнительного кода (поправил в последних коммитах) и, поскольку, как вы говорите, датчик стоит в районе нагревателя, показывает (для нас) погоду на Венере.

А out temp, в вашем случае, бывает отличным от нуля и target_temp? Например в момент перехода из "нагреватель выключен" -> "нагреватель включен" удается увидеть, например, 15 градусов?

мне температуры интересны в контексте интеграции в Home Assistant. Извернуться, думаю, смогу и без них, но хочется сделать хорошо.

dkrylov1990 commented 3 years ago

@IATkachenko может поможет, но я не видел функциональной возможности в приложухе на lite внешней температуры. Там конструктивно даже ничего на улице нет. А температура, которая выдаётся в приложухе - это температура выходящего воздуха (по сути своей просто управление мощностью нагревателя)

lych commented 3 years ago

Вот теперь похоже на правду.

INFO:tion.lite:heater is off INFO:tion.lite:fan sped is 6 INFO:tion.lite:in temp is -4 INFO:tion.lite:out temp is -1 Должно быть в районе -10-12, хз почему -4, но на работе есть тион о2, он тоже все время показывает зимой температуру градусов на 10 выше чем на улице, прогреваться что ли воздух пока по каналу в стене идет (в обоих случаях канал довольно длинный и проходит через неотапливаемое помещение).

INFO:tion.lite:target temperature is 23 INFO:tion.lite:fan sped is 3 INFO:tion.lite:in temp is -2 INFO:tion.lite:out temp is 21 Как ни странно при включенном обогревателе хоть и выше но все равно отрицательная, все таки видимо датчик всунули впереди нагревателя.

На счет out temp, да бывает, она следует за target_temp c запозданием, более того если выключить бризер (нагреватель был включен) то она резко поднимается (тока воздуха нет, а нагреватель все еще горячий) и постепенно остывает. Т.е. с моей точки зрения out temp ведет себя так и должна.

Если не лень будет в выходные сделаю термометр из ds18b20 и засуну в воздуховод чтобы сравнить с in temp

IATkachenko commented 3 years ago

Те out_temp можно верить. Хорошо. in_temp -- под вопросом, но тоже примерно похожа на правду. У меня (s3) in отличается от уличной на 4 градуса примерно, при достаточно тонкой стене (коротком канале). Она меня меньше всего беспокоит. Думаю что тест с ds18b20 особо не нужен.

В ближайшие дни еще немного причешу код и зафиксирую все еще раз в виде v1.0.0 релиза, чтобы потом можно было спокойно все ломать переводя на асинхронный bleak ;)

Еще раз спасибо за помощь с тестированием.

IATkachenko commented 3 years ago

Implemented in v1.0.0