- Почему устройства умного дома не подключаются к шлюзу Xiaomi
- Не подключается выключатель Aqara
- Как подключиться к шлюзу Xiaomi
- Как сменить регион в Mi Home
- Как понять, что разрядился Aqara D1
- Xiaomi Gateway 2 можно и не паять
- Developer API
- Более родной протокол MIIO
- Зачем нам кузнец?
- Ненастоящее miio устройство
Почему устройства умного дома не подключаются к шлюзу Xiaomi
Умный дом. Как много технологичности в этой фразе. Однако так думаешь только до тех пор, пока не обзаводишься им самостоятельно. Далее начинаются проблемы с подключением, настройкой и поддержанием работы устройств, которые, собственно, и составляют умный дом. При этом количество проблем, с которыми вам придётся столкнуться, прямо пропорционально зависит от количества приобретённых умных гаджетов. Хорошо, что в подавляющем большинстве случаев речь идёт о повторяющихся проблемах, у которых существуют универсальные решения.
Экосистема устройств умного дома Xiaomi очень обширна, но из-за этого не всегда работоспособна
Буквально на днях я получил посылку с оставшейся партией беспроводных выключателей Aqara D1. Они были нужны мне для организации в квартире освещения по системе «умный дом». Их подключение и настройка не были для меня чем-то необычным, потому что ранее я уже покупал такие на пробу, и остался ими полностью доволен.
Кстати, если вам интересно, можете почитать об этом подробнее по этой ссылке. Там я рассказываю, как работают беспроводные выключатели, как они устроены и чем они лучше обычных. Поэтому новые я подключал по уже знакомому сценарию.
Не подключается выключатель Aqara
Это тот самый беспроводной выключатель, с которым у меня возникли проблемы
Вернее говоря, пытался подключить. Как понимаете, безуспешно. Нет, мой шлюз Xiaomi Gateway 3 исправно подцепил первый выключатель, а вот второй отказывался принимать наотрез. Или сам выключатель не хотел подключаться, мне было не очень понятно.
Каждый раз, когда я зажимал клавишу на выключателе, по прошествии положенных 10 секунд его индикатор не мигал три раза, свидетельствуя о переходе в режим сопряжения, а загорался примерно на секунду, после чего гас. Само собой, я полез в Google, но прямого ответа на свой вопрос на нашёл.
Мне рекомендовали (в порядке убывания):
- Изменить регион на Китай;
- Перезагрузить шлюз;
- Обновить приложение Mi Home;
- Написать продавцу и пожаловаться.
Как подключиться к шлюзу Xiaomi
Самый быстрый способ подключить умное устройство к шлюзу — три раза нажать на кнопку на шлюзе
Стоит ли говорить, что я перепробовал всё и даже больше. Я даже узнал о существовании «прямого» способа подключения умного устройства к шлюзу, о котором раньше не знал. Хоть он мне и не помог, но оказался полезен, поскольку в будущем я планирую пользоваться только им:
- Нажимаете три раза подряд на кнопку на шлюзе;
- Дождитесь, пока индикатор шлюза не замигает розовым;
- Нажмите и удерживайте клавишу на выключателе 10 секунд;
- После того, как синий индикатор на выключателе, мигнёт три раза, произойдёт сопряжение, а шлюз издаст подтверждающий гудок.
Как сменить регион в Mi Home
Что касается смены региона, то тут ничего особенного нет:
- Запустите приложение Mi Home и войдите в аккаунт;
- Перейдите в «Профиль», а оттуда – в «Настройки»;
Смена региона зачастую позволяет предотвратить самопроизвольные отключения устройств от шлюза
- В «Настройках» выберите вкладку «Регион»;
- Выберите «Китай» и перезагрузите учётную запись.
Этот способ может подойти как в ситуации, если устройство не сопрягается со шлюзом, так и в случае, когда устройство от него самопроизвольно отключается. Иногда помогает обратная смена региона, когда вместо Китая выставляется Россия. В некоторых случаях подходит Германия или Индия.
Как понять, что разрядился Aqara D1
На самом деле и тот способ, что я описал выше, и этот – со сменой региона – может помочь вам не только при проблемах с подключением (особенно, если устройства были куплены в разных странах), но и с избавлением от разрывов. Ведь нередко бывает, что устройства просто отключаются от шлюза, и их приходится подключать повторно.
Чтобы заменить батарейку в Aqara D1, нужно снять вот эту самую крышку, поддев её сначала с одного выступа, а потом — с другого
Моя же проблема оказалась до смешного банальной. Просто батарейка в одном из моих выключателей оказалась разряженной. Именно об этом, судя по всему, сигнализировал индикатор, отказываясь мигнуть три раза, а просто затухая. Ему просто не хватало энергии для подключения к шлюзу, несмотря на то что для этого используется энергоэффективный протокол Zigbee.
Xiaomi представила MIUI+. Что это такое и как этим пользоваться
Но есть в этой истории как минимум два положительных аспекта. Во-первых, я научился с лёгкостью открывать выключатель для замены элементов питания. А, во-вторых, сбил с продавца купон на следующую покупку, заставив его компенсировать траты на батарейки, которые я заказал на Озон.
Новости, статьи и анонсы публикаций
Свободное общение и обсуждение материалов
Сделать хорошую фотографию сложно. Куда легче сделать просто сносную фотографию, а потом подправить её. Но если раньше заниматься редактурой снимков могли себе позволить только некоторые, сегодня это занятие стало доступно каждому. Никаких тебе фотошопов, лайтрумов и прочей братии. Просто скачиваешь «Google Фото» и вносишь необходимые коррективы, опираясь на предложения сервиса. Но в какой-то момент пользователям и этого стало мало, и они начали просить Google о внедрении кнопки «сделать красиво». Вот что из этого получилось.
Android-смартфоны устроены намного сложнее, чем нам кажется. Это производители сделали так, чтобы мы могли без особого труда пользоваться своими аппаратами. Для этого они создали удобный и понятный интерфейс, который позволяет нам обращаться к тем или иным компонентам Android, отдавать смартфону команды и реагировать на его предложения. В общем, ничего сложного. Однако, помимо рядовых пользователей, Android используют ещё и продвинутые, которых хлебом не корми, дай что-нибудь изменить, настроить или кастомизировать. Для них и существуют такие режимы, как FastBoot.
Android – операционка очень понятная и интуитивная. Но только до тех пор, пока ты либо не сталкиваешься с проблемами вообще, либо сталкиваешься, но только с теми, которые можешь решить самостоятельно. А ведь бывает и такое, что смартфон начинает вести себя совершенно нетипично, а ты и понятия не имеешь, что с этим нужно делать, чтобы вернуть его к привычной модели работы. Одна из таких проблем – отсутствие уведомлений о входящих звонках и невозможность принять вызов. Впрочем, ничего сложного в её решении нет.
Источник
Xiaomi Gateway 2 можно и не паять
Привет Хабр! В предыдущих сериях я:
- Накупил устройств от Xiaomi для умного дома и посредством паяльника заставил их работать в увлекательнной манере без родных серверов через home assistant (ссылка на пост)
- Завернул web interface от home assistant в electron (ссылка на пост) с поддержкой нотификаций, менюшек, точбара итд (код тут)
Но по мере появления всё новых устройств стало вскрываться странное…
Например, что поддержки Aqara Wireless Relay 2ch (LLKZMK11LM) в интеграции xiaomi_aqara нет, а на открытие Issues в GitHub владельцы кода отвечали, что поддержать это реле невозможно без обновления прошивки устройства. «Что-то тут не так» — подумал я и пошел разбираться по коду, как так вышло. И так увлекся, что запилил интеграцию сначала для работы с реле через xiaomi_miio (ссылка), а затем реализовал поддержку кубика и кнопки Xiaomi для этой интеграции (ссылка), а теперь расскажу зачем и как.
Developer API
Когда-то давно Xiaomi выпуская шлюз (lumi.gateway.v3) укомплектовали его developer api и даже документацией к нему. Developer API это та штука что общается по UDP на портах 4321 и 9898. Такой ход очень понравился сообществу и оно ответило пачкой репозиториев, интегрирующих устройство во всё что можно. Работа с этим developer api легла в основу home assistant интеграции xiaomi_aqara (ссылка) и всё было замечательно пока…
Пока Xiaomi не переклинило и они не стали забивать на поддержку developer api, в нем перестали появляться идентификаторы новых устройств. Искомое реле есть в списке устройств подключённых по zigbee к gateway, но там реле фигурирует с пустым идентификатором модели, без которого невозможно что-либо сделать. Затем, уже совсем недавно, Xiaomi выкатили обновление прошивки gateway после установки которой невозможно было включить developer api без паяльника (если он не был включен до обновления), ссылка.
Оказавшись в самом центре этой Санта-Барбары, я всплакнул и пошел заказывать немецкий ZigBee донгл ConBee2 на амазоне, чтобы работать с zigbee устройствами без gateway. Но пока немцы в условиях апокалипсиса готовили к отправке мой заказ, я утомленный ожиданием стал копать глубже…
Более родной протокол MIIO
Miio — это более новый протокол работы с устройствами Xiaomi, подключаемыми к сети по wi-fi. Родное приложение Mi Home общается по этому протоколу и с wi-fi розетками, и с IR Remote, и пылесосами, и со всеми остальными и даже с моим xiaomi gateway v2. Это тоже UDP протокол, но на этот раз задействован не порт 4321, а порт 54321 (прекрасный метод выбора портов я считаю). «Опаньки» — подумал я: «Значит оно еще и другой протокол знает, а не попробовать ли подключить реле по этому новому протоколу?».
Протокол miio шифрует все сообщения токеном, но, к счастью, методы извлечения токена и шифрования/дешифрования уже были вскрыты и работа с ними реализована в нескольких библиотеках (ссылка раз, ссылка два). Я не первый, кто занялся интеграцией нового устройства по протоколу miio, поэтому путь был известен и я ему последовал.
- Добываем security token устройств извлекая их из логов (ссылка) или из модифицированного приложения (ссылка)
- Снимаем трафик между мобильным приложением и устройством
- Расшифровываем UDP пакеты с security token полученным в начале
- Учим код создавать аналогичные пакеты
Я снял трафик прямо со своего wi-fi роутера, к счастью для него есть кастомная прошивка asuswrt-merlin, в которую можно с помощью Entware поставить tcpdump. Утилита прекрасна, но дампы от tcpdump она не понимает, зато понимает json-dump генерируемый Wireshark. Для перегона бинарного дампа из tcpdump в json я использовал утилиту tshark. После этого увидел какими командами приложение mi home управляет реле я породил PR с добавлением поддержки реле (ссылка).
Заказ на ConBee2 я отменил, ибо программным методом и быстрее и веселее…
Зачем нам кузнец?
И вот значит я, с шашкой наголо, оказываюсь в ситуации, когда всё, вроде работает, но теперь в home assistant мой Xiamo Gateway 2 представлен двумя сущностями одна по протоколу developer api (интеграция xiaomi_aqara) и еще одна по проколу miio (интеграция xiaomi_miio). А еще я не люблю паять, хотелось и себе и людям жизнь упростить. Нужно было реализовать недостающую часть устройств в xiaomi_miio.
По большей части, после созидания программной обвязки это механическая работа:
- включил tcpdump
- создал в приложении Mi Home автоматизацию включающую действие которое я хочу отслеживать
- инициировал это автоматизацию
- расшифровал дамп
- копипаста из расшифровки в код
- посылаем команды с консоли
- доработка напильником до блеска
Но руки чешутся, а приключения зовут…
Ненастоящее miio устройство
Вскрытие показало, что в протоколе miio нет механизма колбеков. Сенсоры можно и раз в 20 секунд pullить, а вот для корректной работы кнопок и кубиков опрашивать устройство по 10 раз в секунду показалось плохой идеей. В этом парадоксе я увидел интересную деятельность, а механическим кодированием отснифанных пакетов заниматься не очень хотелось.
Исследование еще одной библиотеки работающий с протоколом miio (ссылка) удивило меня до глубины души. Авторы собрали комбайн который общается с устройством по протоколу miio, но для перехвата событий с кубиков и кнопок использует developer-api. Такой подход меня основательно напряг, приводит он к тому, что часть функционала начинает работать сразу, а для части таки надо паять устройство…
Снова вооружившись tcpdump и, доработав дешифратор функцией расшифровки от всех устройств за один запуск, стал слушать всё что летает по сети на UDP порт 54321. И вижу довольно интересную картину. Когда я создаю автоматизацию типа “Если повернули zigbee кубик, включить wi-fi розетку” из приложения в gateway по протоколу miio засылается json внутри поля data которого json закодированный в строку; “DSL” — подумал Штирлиц, их почему-то испокон веков все так пакуют… Детали тут.
Просмотр содержимого этой строки показал, что реакция на действие не передается куда-то в облака, прямо в этой json программке фигурировал ip адрес и токен шифрования wi-fi розетки (этот абзац противоречит абзацу из первой серии, там я был не прав ;( гейт сам общается с дружественными устройствами — без помощи облаков). Да и сам скрипт напоминает автоматизацию из home assistant, есть параметры триггера, есть ip куда заслать реакцию. То есть никакого протокола pub/sub найти в дампах не удалось.
Зато родилась идея как всё-таки отловить все нужные события с кнопок и кубиков:
- Эмулируем miio устройство в приложении, отвечаем на PINGи приложения и запросы от gateway
- Пишем генератор скриптов для gateway для генерации по одному на пару
(устройство, событие)
Пару дней заняло это всё реализовать и привести в божеский вид.
На текущий момент библиотека python-miio умеет работать и с реле и с кубиком и с кнопкой, ссылка.
Остается примотать этот апдейт к home assistant и можно будет работать с Xiaomi gateway 2 без пайки и developer api.
Если кто готов потестировать на своих устройствах и/или добавить поддержку новых — присоединяйтесь 🙂
Еще в продаже есть славный Xiaomi 1C пылесос вот такой и недоделка (ссылка) по его интеграции в home assistant. Думаю взяться… Надо оно?
Источник