mavrikkk / ha_kettler

allows you to connect Redmond SkyKettle, SkyCooker and SkyHeat to your Home Assistant. see README to know further
132 stars 51 forks source link

Поддержка более старых моделей чайников и мультиварки с Bluetooth #16

Closed vring0 closed 4 years ago

vring0 commented 4 years ago

Добрый день! Ранее я видел, что Вас просили добавить поддержку старых моделей чайников. Так как у них более качественная сборка, я как раз такую купил и реализовал интеграцию через gattool в linux, а также у меня была давно мультиварка m800s, я тоже её решил интегрировать в систему УД. Уже после проделанной работы я наткнулся недавно на Ваш компонент и не увидел поддержки других моделей redmond, я предлагаю помощь чтобы добавить их. У меня уже есть все перехваченные пакеты управления и всё протестировано. Будет замечательно если Вы согласитесь расширить свой компонент, я думаю что многие используют данные модели мультиварок и чайников.

vring0 commented 4 years ago

мой рабочий init.py https://yadi.sk/d/0Xfe-dw2Az90lA и water_heater.py https://yadi.sk/d/Q2iwk6DZl8K70Q добавил шаг регулировки температуры в 5 градусов, как то 0.5 регулировать не очень удобно.

@property
def device_state_attributes(self):
    data = {"target_temp_step": 5}
    return data

чайник: RK173S При добавлении чайника, можно автоматически определять поколение, прочитав пакет состояния, в старых версиях он значительнее отличается.

vring0 commented 4 years ago

Тестируя, я заметил что периодически отваливается связь с чайником и он не принимает команды. Получаю ошибку:

Failed to connect to peripheral D4:E3:40:73:99:F9, addr type: random После этого интеграция больше не работает, только после рестарта HA.

Используя gattool(bash скрипт), я не замечал таких проблем, чайник работает в таком режиме более шести месяцев. Возможно это связано с переходом на библиотеку bluepy.

mavrikkk commented 4 years ago

мой рабочий init.py https://yadi.sk/d/0Xfe-dw2Az90lA и water_heater.py https://yadi.sk/d/Q2iwk6DZl8K70Q

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

mavrikkk commented 4 years ago

Тестируя, я заметил что периодически отваливается связь с чайником и он не принимает команды. Получаю ошибку:

Failed to connect to peripheral D4:E3:40:73:99:F9, addr type: random После этого интеграция больше не работает, только после рестарта HA.

Используя gattool(bash скрипт), я не замечал таких проблем, чайник работает в таком режиме более шести месяцев. Возможно это связано с переходом на библиотеку bluepy.

  1. По поводу отвала связи - было в ранних версиях...последняя версия на моем HA работала неделею перед тем, как я обновил репозиторий на github. За это время 0 вылетов. Возможно, у нас разные условия тестирования?

  2. По поводу bluepy. Я специально ушел на нее, так как в родных HA интеграциях используется именно эта библиотека. Переход на нее связан с попытками увеличить стабильность и отказаться от костыля в виде pexpect. Честно, не заметил, что стало лучше )) Однако я также не заметил, что стало хуже. Ну и правильная подписка на уведомления, возможно, поможет со другими чайниками, у которых была дурная привычка слать уведомления каждую секунду, даже без запросов с моей стороны, что ухудшало парсинг.

  3. По поводу скриптов ))) Я разработал как минимум 4 разных подхода к общению с чайником...и все эти методы идеально работают в скриптах. Вот прям идеально. Без намека на проблемы, ошибки и вылеты. Однако как только я эти методы начинаю использовать в интеграциях - все идет к черту: вылеты, подвисания, ошибки. Из всех методов адекватно работают только два: один на pexpect и один новый на bluepy. И то, с периодическими ворнингами (на какомнть методе связь может прерваться, например). Однако это приведет лишь к задержке обновления статуса, ибо в следующий сеанс связи (через 30-60 сек) все работает. То есть нет подвисания до перезагрузки, о котором вы говорили. Выводы можно сделать разные: Либо HA не очень хорошо работает с блютус устройствами в принципе, либо я очень плохо знаю архитектуру HA и просто не использую все и правильные возможности интеграции.

mavrikkk commented 4 years ago

мой рабочий init.py https://yadi.sk/d/0Xfe-dw2Az90lA и water_heater.py https://yadi.sk/d/Q2iwk6DZl8K70Q

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

Код просмотрел. Ранее я с помощью сообщества установил отличия в способе включения (у меня sendMode и sendOn, а у вас только sendMode), также была разница в авторизации (у меня код возврата 0 - это неудача, а код 1 - успех...а в ваших чайниках вроде было 0 - неудача, а 2 - успех...во всяком случае в тестах помощников было так. У вас же осталось, как и у меня, 1 - успех. Это проверено?) Также я вижу разницу в считывании параметра текущей температуры, у вас за это отвечает другой байт.

mavrikkk commented 4 years ago
  1. Как вы предлагаете по команде sendStatus различать устройства? Только по параметру текущей температуры? а что у вас хранится в том байте, откуда я считываю температуру в своей модели?

  2. Не пробовали остальные команды? sendSync, sendUseBackLight, sendSetLights, sendGetLights? Или они другие у вас?

  3. Где можно увидеть ваши скрипты, которые у вас работали идеально?

mavrikkk commented 4 years ago

Отдельное спасибо за шаг температуры )) Раньше это делалось свойством:

@property def target_temperature_step(self): return 5

даже не замечал, что данная функция уже не работает...

vring0 commented 4 years ago

мой рабочий init.py https://yadi.sk/d/0Xfe-dw2Az90lA и water_heater.py https://yadi.sk/d/Q2iwk6DZl8K70Q

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

Код просмотрел. Ранее я с помощью сообщества установил отличия в способе включения (у меня sendMode и sendOn, а у вас только sendMode), также была разница в авторизации (у меня код возврата 0 - это неудача, а код 1 - успех...а в ваших чайниках вроде было 0 - неудача, а 2 - успех...во всяком случае в тестах помощников было так. У вас же осталось, как и у меня, 1 - успех. Это проверено?) Также я вижу разницу в считывании параметра текущей температуры, у вас за это отвечает другой байт.

На счет авторизации у старого поколения используется 01 успех и 00 не успех. Автор статьи это тоже упоминает https://habr.com/ru/post/371965/

vring0 commented 4 years ago
  1. Как вы предлагаете по команде sendStatus различать устройства? Только по параметру текущей температуры? а что у вас хранится в том байте, откуда я считываю температуру в своей модели?

Как минимум различие будет в количестве байт ответа, у старого поколения он менее информативен, я могу чуть позже скинуть статус каждого состояния. Если говорить про мультиварку, то у нее свой будет набор байт. Если найдется человек, у которого мультиварка r4s отличается от m800s , можно сравнить, но я думаю у них будет похожий статус.

  1. Не пробовали остальные команды? sendSync, sendUseBackLight, sendSetLights, sendGetLights? Или они другие у вас?

Этот функционал не поддерживается, поддерживается:кипеть, поддерживать температуру, после кипения поддерживать. Со статуса можно считать: текущую температуру и температуру установленную в режиме поддержания, а также прочесть текущий режим(кипение или поддержание).

  1. Где можно увидеть ваши скрипты, которые у вас работали идеально?

Позже когда буду дома я могу сюда их скинуть. Я модифицировал под себя скрипт от сюда https://github.com/PimenovAlexander/r4s-bluetooth

mavrikkk commented 4 years ago

Этот функционал не поддерживается, поддерживается:кипеть, поддерживать температуру, после кипения поддерживать. Со статуса можно считать: текущую температуру и температуру установленную в режиме поддержания, а также прочесть текущий режим(кипение или поддержание).

Значит мы про разные модели говорим. Просто здесь уже просили добавить поддержку какой то М-серии...но у нее, как и у моей модели есть подсветка. И вот у нее успех авторизации - это 02. В общем, запутаться можно в этих моделях...

Как минимум различие будет в количестве байт ответа

жду тогда примеры ответов

vring0 commented 4 years ago

Насколько я понимаю этот чайник уже новее https://redmond.company/ru/products/sky-kettle/umnyy-chaynik-redmond-skykettle-m216s/ , чем ваш и мой тем более. Возможно это уже 3-е поколение, либо какая то модификация 2-ого поколения.

  1. Я предлагаю разобраться с чайниками моей серии. Вообще по качеству первое поколение намного лучше, они и правда дороже стоят.
  2. Рассмотреть возможность интеграции Мультиварок.
vring0 commented 4 years ago

Забыл упомянуть про еще одну интеграцию вашего чайника на Python. Работает на bluepy https://github.com/w1r0x/g200s/

3AXAPOB commented 4 years ago

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

Я предлагаю не забывать SkyKettle M216S ))) Это чайник новый и самый качественный, их количество будет только расти тогда как старые чайники никому уже будут не нужны!

vring0 commented 4 years ago

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

Я предлагаю не забывать SkyKettle M216S ))) Это чайник новый и самый качественный, их количество будет только расти тогда как старые чайники никому уже будут не нужны!

1 . Новый не всегда бывает, что он качественный. Начнем с того, что материал корпуса у вас пластик, а у старого поколения это металл.

  1. По поводу вашего чайника никто не забывает, просто чайник первого поколения уже вдоль и поперек изучен. Я предложил его добавить, так как проблем нет. Есть только проблема с авторизацией, но нужно понять она общая для всех или нет.
mavrikkk commented 4 years ago

Забыл упомянуть про еще одну интеграцию вашего чайника на Python. Работает на bluepy https://github.com/w1r0x/g200s/

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

mavrikkk commented 4 years ago
  • Я предлагаю разобраться с чайниками моей серии. Вообще по качеству первое поколение намного лучше, они и правда дороже стоят.
  • Рассмотреть возможность интеграции Мультиварок.

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

чайники можно попробовать слить в 1 интеграции

vring0 commented 4 years ago
  • Я предлагаю разобраться с чайниками моей серии. Вообще по качеству первое поколение намного лучше, они и правда дороже стоят.
  • Рассмотреть возможность интеграции Мультиварок.

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

Я просто думал о глобальном модуле r4s, который в будущем автоматически находил устройства в сети и предлагал их интегрировать(если это возможно) .

mavrikkk commented 4 years ago

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

vring0 commented 4 years ago

возможно и такое...

вот мой Telegram:@ring04 , предлагаю там оперативно обсудить вопросы тестирования.

проблема больше в том, чтобы добиться стабильности

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

vring0 commented 4 years ago

как и обещал, BLE пакеты моего чайника

Boil 0x000b value: 55 01 06 00 00 00 00 00 02 00 00 02 00 4c 00 00 00 00 00 aa Off after boiling 0x000b value: 55 01 06 00 00 00 00 00 02 00 00 00 00 54 00 00 00 00 00 aa Warming 0x000b value: 55 01 06 01 00 28 00 00 02 00 01 02 00 58 00 00 00 00 00 aa Off after warming 0x000b value: 55 01 06 00 00 28 00 00 02 00 01 00 00 52 00 00 00 00 00 aa Warm after boiling 0x000b value: 55 01 06 00 00 32 00 00 02 00 01 02 00 4d 00 00 00 00 00 aa

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

mavrikkk commented 4 years ago

не стал малинку засирать бесконечным циклом )) немного оптимизировал модуль...добавил цикл из 3 попыток, если коннект неудачный...тестирую

mavrikkk commented 4 years ago

длина ответов у нас одинаковая (( порядок несколько другой, но по нему нельзя однозначно дать ответ, что за чайник подключен...надо искать другой путь

fr00kt commented 4 years ago

Пару раз прочитал и не совсем понял, Redmond SkyKettle RK-M216S можно будет подключить или все же нет?

mavrikkk commented 4 years ago

Пару раз прочитал и не совсем понял, Redmond SkyKettle RK-M216S можно будет подключить или все же нет?

пока все в процессе...официально работает только G200S серия. немного отличаются команды

vring0 commented 4 years ago

длина ответов у нас одинаковая (( порядок несколько другой, но по нему нельзя однозначно дать ответ, что за чайник подключен...надо искать другой путь

А что мешает сканировать сеть BT и делать обнаружение устройств ?

vring0 commented 4 years ago

не стал малинку засирать бесконечным циклом )) немного оптимизировал модуль...добавил цикл из 3 попыток, если коннект неудачный...тестирую

Не всегда 3-ех попыток хватает. Подскажите пожалуйста где можно увеличить количество попыток в вашей интеграции ? Предлагаю вывести это как параметр.

mavrikkk commented 4 years ago

Не всегда 3-ех попыток хватает. Подскажите пожалуйста где можно увеличить количество попыток в вашей интеграции ? Предлагаю вывести это как параметр.

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

mavrikkk commented 4 years ago

А что мешает сканировать сеть BT и делать обнаружение устройств ?

интерфейс config flow. коннект устанавливается на этапе подключения, а значит до этого он должен уже обнаружить все устройства, что не миллисекундная задача. есть вариант, что установщик нехило задумается, ожидая список устройств найденных ))

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

mavrikkk commented 4 years ago

Я предлагаю не забывать SkyKettle M216S )))

для вас готов тест. но я писал по памяти. точно не помню, все ли отличия учел.

https://yadi.sk/d/td2jQvvvfGwkcA

если при запуске ошибки, то нужен HA лог

3AXAPOB commented 4 years ago

для вас готов тест. но я писал по памяти. точно не помню, все ли отличия учел. https://yadi.sk/d/td2jQvvvfGwkcA если при запуске ошибки, то нужен HA лог

Спасибо! Вечером протестирую и отпишусь!

3AXAPOB commented 4 years ago

Рузультаты такие.

  1. Обновляется статус
  2. Показывает текущую температуру
  3. Показывает оff или electric при включении чайника руками.
  4. При попытке включить чайник через ХА выпала ошибка: ... File "/config/custom_components/r4s_kettler/water_heater.py", line 82, in async_set_operation_mode lightIsOn = self._kettler.theLightIsOn() AttributeError: 'RedmondKettler' object has no attribute 'theLightIsOn'

Закоментил в ватерхиатере эту строчку, но это не помогло. Включить чайник через ХА не получается.

mavrikkk commented 4 years ago

Закоментил в ватерхиатере эту строчку, но это не помогло. Включить чайник через ХА не получается.

да, остатки от полного модуля с подсветкой. я не с того начал. лучше скрипт запустить...

https://pastebin.com/iJvwcQaY

сохраняете как kettler.py например если нужно то ставите библиотеку bluepy

pip3 install bluepy

запускать скрипт так:

python3 kettler.py

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

mavrikkk commented 4 years ago

как и обещал, BLE пакеты моего чайника

попробуйте тоже запустить скрипт в предыдущем сообщении. интересны результаты

vring0 commented 4 years ago
BEGIN
start mode UPDATE
['55', '00', 'ff', '01', 'aa']
['55', '01', '06', '00', '00', '55', '00', '00', '00', '1e', '01', '00', '00', '2d', '00', '00', '00', '00', '00', 'aa']
------------------------------------
sleeping 5 sec
start mode ON
['55', '02', 'ff', '01', 'aa']
['55', '03', '05', '01', 'aa']
['55', '04', '06', '00', '00', '00', '00', '00', '00', '1e', '00', '02', '00', '2e', '00', '00', '00', '00', '00', 'aa']
------------------------------------
sleeping 15 sec
start mode UPDATE
['55', '05', 'ff', '01', 'aa']
['55', '06', '06', '00', '00', '00', '00', '00', '00', '1e', '00', '02', '00', '2e', '00', '00', '00', '00', '00', 'aa']
------------------------------------
sleeping 5 sec
start mode OFF
['55', '07', 'ff', '01', 'aa']
['55', '08', '04', '01', 'aa']
['55', '09', '06', '00', '00', '00', '00', '00', '00', '1e', '00', '00', '00', '30', '00', '00', '00', '00', '00', 'aa']
------------------------------------
sleeping 5 sec
start mode UPDATE
['55', '0a', 'ff', '01', 'aa']
['55', '0b', '06', '00', '00', '00', '00', '00', '00', '1e', '00', '00', '00', '31', '00', '00', '00', '00', '00', 'aa']
END

Отработало все идеально!

mavrikkk commented 4 years ago

Отработало все идеально!

у меня тоже работает идеально. сегодня внес правки в основной модуль. за полдня ни одной неудачи...

mavrikkk commented 4 years ago

из ответа вижу, где хранится состояние вкл-выкл...вижу текущую температуру

mavrikkk commented 4 years ago

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

vring0 commented 4 years ago

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

Boil
0x000b value: 55 01 06 00 00 00 00 00 02 00 00 02 00 4c 00 00 00 00 00 aa
Off after boiling
0x000b value: 55 01 06 00 00 00 00 00 02 00 00 00 00 54 00 00 00 00 00 aa
Warming
0x000b value: 55 01 06 01 00 28 00 00 02 00 01 02 00 58 00 00 00 00 00 aa
Off after warming
0x000b value: 55 01 06 00 00 28 00 00 02 00 01 00 00 52 00 00 00 00 00 aa
Warm after boiling
0x000b value: 55 01 06 00 00 32 00 00 02 00 01 02 00 4d 00 00 00 00 00 aa

Считаю после 06. первый байт который говорит о том, что включен режим подогрева это 01, если 00 выключен или кипячение.

девятый байт 02, это значит чайник работает, 00 не работает.

vring0 commented 4 years ago

@mavrikkk , что то нужно ещё от меня? Или я жду когда моё поколение чайников добавишь в интеграцию?

tayanov commented 4 years ago

чайник m216s

Logger: custom_components.r4s_kettler Source: custom_components/r4s_kettler/init.py:474 First occurred: 18:49:20 (2 occurrences) Last logged: 18:50:05

three attempts of firstConnect failed

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

Кстати в моей старой вилке 216 работает вроде как, но там не вырезанна лишняя подсветка да и есть странные поведения, потому решил попробовать вашу

3AXAPOB commented 4 years ago

Запустился не с первого раза. Во время работы скрипта чайник не включался.

https://pastebin.com/N22FF0wa

mavrikkk commented 4 years ago

что то нужно ещё от меня?

пока нет. думаю, как все уместить в 1 модуль

mavrikkk commented 4 years ago

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

у вас отличается протокол. проблемы те же, что и у ЗАХАРОВа.

mavrikkk commented 4 years ago

Запустился не с первого раза. Во время работы скрипта чайник не включался.

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

  1. через официальное приложение таких проблем нет?
  2. когда вы скрипт запускали чайник еще куданть синхронился? в приложение? или к HA? тест должен быть чистым...если я скрипт запускаю не отключая чайник от других мест, то если не вовремя запустить скрипт, то параллельные запросы с разныз устройств точно дадут сбой. а там, кому повезет.

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

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

tayanov commented 4 years ago

в той ветке был энтузиаст, который

обещал помочь, но что то пропал...

Видимо речь обомне. Попробовал включить журнал но так и не нашел в телефоне лог hci. Понял что для многих мобил это то же проблема. Готов к помощи. Что нужно? Скрипт попробовать запустить? Или все же журнал hci. И ещё раз. В моем профиле есть Форк для m216s. Там и сенсоры видны и включение работает. Но лог кишит дисконектами. Потому отказался от использования. И слежу за вашими решениями тут.

mavrikkk commented 4 years ago

В моем профиле есть Форк для m216s

гляну

3AXAPOB commented 4 years ago

через официальное приложение таких проблем нет?

Проблем нет.

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

ХА был выключен. В телефоне тоже.

mavrikkk commented 4 years ago

что то нужно ещё от меня?

запустите скрипт

https://pastebin.com/PSszEaUg

нужно узнать название вашего чайника

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

mavrikkk commented 4 years ago

в принципе этот скрипт могут все запустить. нужно собирать модели чайников

mavrikkk commented 4 years ago

через официальное приложение таких проблем нет?

Проблем нет.

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

ХА был выключен. В телефоне тоже.

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