Tuya Curtain robot

Tuya Curtain robot

Pekin Denis

Идея автоматизировать открытие/закрытие штор давно напрашивалась в умный дом. Появилось много хороших вариантов, ну большенство из них рассчитаны на определенные типы карнизов, либо полную замену карниза, для некоторых необходимо стационарное питание. Больше всего мне понравилась концепция от SwitchBot Curtain , подходят под любой карниз, просты в установке, зяряжать их раз в пол года не сложно. Но цена слишком высокая 99$ за одного робота и 188$ за 2. В поиске аналогов я наткнулся на продукт от tuya который мне обошелся 77$ за 2шт в период скидок.


Шторные моторы
Описание мотора
Типы поддерживаемых карнизов


Распаковка

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

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

Для карниза с типом Roman Rod поддерживает разный диапазон диаметров

Вид сбоку

Подключиться к шторному мотору можно через приложение smart life или tuya smart. Скачиваем любое из приложений из плей маркета, логинимся в приложении, включаем блютуз на телефоне и 2 раза кликаем кнопку включения на шторном моторе. Далее в приложении нажимаем кнопку добавить устройство и если все сделано верно, появится приглашение от устройства с кнопкой подключить.

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

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

интерфейс управления

Первый тест

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

У меня установлен телескопический карниз RÄCKA от ikea, на котором висят довольно тяжелые блекаут шторы из плотной ткани. Решил протестировать, хватит ли мощности у мотора протянуть за собой штору и преодолеть ступеньку телескопического карниза.

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

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

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

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

Seller's reply :
This should be a problem with the customer's operation;
A set of products shipped (a host and a secondary machine), when
adding app, the APP only searches to the host, the auxiliary machine
does not need to be added separately, the host control product works,
and the auxiliary machine will also be controlled to work
synchronously. At the same time, the main machine and the auxiliary
machine are turned on, and the main and auxiliary machines will be
automatically paired;
Product pairing method: Press the power button of two machines at the
same time (2 machines are automatically interconnected) to --- the
product and the mobile phone are successfully connected---- operate
through the APP.

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

Воспользовавшись шлюзом, и интеграцией через Tuya IoT Platform мне удалось пробросить шторные моторы в home assistant.

Шлюз

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

Пример отправки команды на шлюз

В идеале хотелось бы пробросить эти моторы через esp32 и управлять ими локально, и шлюз не нужен и лага не будет. Немного погуглив я наткнулся на интересную прошивку , насколько я понял ранее выпускались похожие шторные моторы с esp8266 на борту, видимо позже решили перейти на ble чтобы сократить расход батареи.

Разборка:

Чтобы разобрать шторные моторы необходимо выкрутить 4 винта в углублениях куда вставляются защелки.


Далее корпус легко открывается на 2 части

Под платой находится аккумулятор который подключен к плате через разъем

Аккумулятор на 4000mAh

Собственно вот 2 платы от шторных моторов, слева мастер, справа слейв

Обратная сторона


На мастере установлено 2 радиомодуля, судя по всему BT7L содержит контроллер с прошивкой, второй радиомодуль JDY-25M необходим для общения между мастером и слейвом.

Судя по документации JDY-25M поддерживает много режимов, в том числе режим master/slave который можно настроить с помощью команд AT+ , в документации даже есть приложение для андройда которое позволяет отправлять команды на этот модуль.

Для расширенного поиска в сети радиомодулей я воспользовался приложением nrf connect , сразу нашелся радиомодуль JDY-25M и TY - судя по всему BT7L

Подключившись к JDY-25M я нашел сервисы куда нужно отправить команду

Насколько я понял, зная команды управления можно отправлять их на JDY-25M и управлять мотором напрямую минуя мастер. Собственно зная этот набор команд можно мастер модуль превратить в такой же управляемый модуль по JDY-25M , только для этого необходимо подключить ttl адаптер к мастер модулю и настроить его с помощью AT команд как на слейве, ну это все теория.

Тут есть и минусы при таком способе управления, если отправить команду open, мотор начнет открывать штору, но если по какой-то причине команда stop не дойдет мотор будет продолжать движение и не будет остановлен до тех пор пока не будет получена команда stop или не сядет аккумулятор. В мастере который содержит BT7L прошивка контролирует эти моменты.

Выводы:

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


PS

Возникает еще один вопрос, как управлять моторами через модуль BT7L минуя облако и приложение на телефоне ?

Для этого я решил воспользоваться wireshark и посмотреть какие пакеты отправляются из приложения smartlife на BT7L.

Нас интересует ATT протокол и hex значения которое отправляется и принимается приложением. В данном случае была отправлена команда на открытие шторы и получен ответ от BT7L. Максимальный размер пакета в ATT 32 байта, из них 20 байт это данные, скорее всего часть пакета передаваемых данных зашифровано, ну есть общая закономерность, первый байт данных скорее всего содержит порядковый номер пакета данных.

соответственно в приложение приходит команда из 2х пакетов данных

00 21 20 04 25 0f 3c ea e9 ed 0a 02 dd 49 09 dd 27 7a 61 d8

01 41 ef 3a cb 73 14 11 87 cd e8 de 66 17 b8 07 41

Далее данные собираются в общий пакет и декодируются на стороне BT7L.

Так же в обратную сторону, приложение smart life получает rcvd пакеты, собирает все это в один и дешефрует на своей стороне.

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

Все команды имеют фиксированную длину которая состоит из 2х пакетов

20 байт и 17 байт . Первые 4 байта команды содержат фиксированное значение 00 21 20 04 , скорее всего это заголовок начала пакета данных. Далее 16 байт первого пакета постоянно меняются, скорее всего применяется AES шифрование. Первый байт второго пакета данных всегда содержит значение 01, а далее 16 байт рандомное значение. Возможно 16 байт второго пакета это случайная величина для вектора инициализации, тогда полезные данные это 16 байт первого пакета после заголовка в 4 байта. В данном случае это:

92 07 a3 cc 4e 78 aa 2f 92 bf f2 83 2d a5 c2 a5. - полезные зашифрованные данные

ca f2 59 21 09 6d 68 57 f4 3e cc 44 2d 67 f7 9f - вектор инициализации

Ну собственно остается узнать как получить ключ шифрования. ))

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

Еще я нашел исходники прошивки для этих моторов с неплохим описанием пакетов и их структуры.

Собственно функция tuya_ble_commData_send , описывает формирование пакета, вектора инициализации а дальше все это передается в функцию tuya_ble_encryption . Но исходников этой функции найти не удалось, выяснилось только что первый байт пакета с вектором инициализации содержит режим шифрования.

И этот режим шифования в данном случае 01 = encryption_mode_key_1 .

Что это означает и куда копать дальше непонятно. Возможно кто-то сможет найти в исходниках как отправляется команда на JDY-25 , мне с ходу этого сделать не удалось.





Report Page