Как подключить технику Xiaomi к локальному серверу на Node.js: первый шаг к настройке своего Умного дома
Инструкция для получения доступа к устройству в целях получения и хранения данных с него удобным образом. Зачем? Чтобы в перспективе настроить свой Умный Дом без ограничений приложений, которые предоставляют производители.
Приветствую! Меня зовут Андрей Степанов, я CTO во fuse8. Для этой статьи мы с фронтенд-разработчиком Дмитрием Симоновым обсудили его опыт настройки техники Xiaomi. Вот, что он рассказал.
Предыстория
Купил очиститель воздуха Xiaomi Mi Air Purifier 3H и занялся настройкой. Оказалось, что у устройств Xiaomi есть привязка к региону продажи или экспорта. Это значит, что нельзя просто так взять и подключить любое устройство к одному приложению miHome. Например у меня получилось так, что робот-пылесос был привязан к Китаю, а очиститель воздуха – к Сингапуру, и запускать их в одном miHome не получается. Причем эта привязка реализована вроде как в самом miHome, но это не точно.
Погуглив, выяснил, что есть 2 популярных решения. Первое – поставить какое-то приложение от отечественных умельцев, которые вырезали это ограничение на подключение к приложению. Это решение я не пробовал, поэтому рекомендовать не буду. Второе решение – сделать клонирование приложения с теми же логином и паролем, но с другим регионом. Им я и воспользовался. Реализуется в 2 клика: вот подробная инструкция для xiaomi.
Каково было мое удивление, когда я узнал, что приложение не отображает динамику. В нем просто дублировалась информация с устройства, например: сейчас 27 градусов и 43% влажности. Еще были доступны кнопки управления устройством: включить, выключить и изменить скорость. А ведь хотелось следить за тем, как меняется влажность в зависимости от температуры, просматривать динамику влажности по дням, ну хоть что-то такое…
Я подумал, что было бы здорово получать информацию с устройства на компьютер сейчас и на raspberry pi в перспективе. На локальной машине уже можно хранить данные, обрабатывать и выводить их по своему желанию. И да, я видел, что есть готовые решения типа home-assistant, но я хочу свой велосипед.
Решение
Мой Mi Air Purifier 3H использует miIO протокол для передачи данных по wi-fi. Чтобы реализовать наблюдение на локальной машине, нужен инструмент, который будет парсить отправляемые устройством пакеты и декодировать их.
Скажу сразу – на питоне сделать это было бы быстрее, так как библиотека python-miio обновляется чаще. Но я просто фронт, а значит все будет javascript 🙂
Для node.js тоже есть решение. Это miIO Device Library, но последнее обновление было сделано 6 лет назад. Но это не беда: помимо декларативного управления описанных устройств есть управление напрямую.
Реализация
let http = require('http'); http.createServer(function (req, res) < res.end("The server is running!"); >).listen(8080);
Теперь перейдем к библиотеке. В общих чертах управление будет выглядеть так: вызываем метод device, в качестве параметра передаем объект с полями: address — ip адрес Mi Air Purifier 3H в локальной сети и token — токен авторизации. Здесь можно посмотреть, как получить токен.
Метод device возвращает объект устройства (промис, если точнее). У него есть метод call , который принимает уже непосредственно команды.
const miio = require('miio'); const token = 'e3b07da6d4bbf7f7e1322db0c26e1bbe' let http = require('http'); http.createServer(function (req, res) < miio.device(< address: '192.168.0.102', token >) .then(device => < device.call('get_properties' ,[]).then(data=> console.log(data)) device.call('get_properties' ,[]).then(data=> console.log(data)) >) .catch(err => console.log(err)); res.end("The server is running!"); >).listen(8080);
Конструкция [] требует пояснения. С ее помощью задаем, с какого датчика нам нужно получить показания.
Вот как эта конструкция формируется:
- Ищем спецификацию на ваше устройство по ссылке вот такого формата:
https://miot-spec.org/miot-spec-v2/instance?type= + ваше устройство (поможет Google).
- Спецификация по ссылке отдается в формате json. Далее методом пристального взгляда ищем нужные нам свойства. Мне нужны были температура и влажность.
Эпилог
«Вот так, с помощью нехитрых приспособлений буханку белого (или черного) хлеба можно превратить в троллейбус… Но зачем?» (с)
После вышеописанных манипуляций удается получить доступ к устройству. Можно хранить и выводить информацию с датчиков, как вашей душе угодно. Можно пилить свой Умный Дом с полной автоматикой, блекджеком и Алисой, и все это без ограничений приложений, которые предоставляют производители.
У меня по плану: жду малинку, запущу там Node, добавлю какую-нибудь базу и буду пилить фронт с графиками и прочей живностью.
Как настраивать Xiaomi smart home — сценарии, часть 1
С каждым днем, все больше и больше различных устройств, которые относятся к категории Умный дом, появляется в нашем обиходе. Одной из самых распространенных экосистем таких устройств выпускаются компанией Xiaomi.
А для того что-бы умный дом стал по настоящему умным, нужно не просто окружать себя умными гаджетами, но и уметь «строить отношения» между ними, проще — создавать сценарии взаимодействия различных устройств как друг с другом, так и автоматизировать работу каждого по отдельности.
И этот обзор я хочу посвятить теме — как настраивать xiaomi smart home — и пошагово приведу пример создания сценария управления свечением Xiaomi Gateway.
Возможно чисто прикладное применение именно этого сценария не особо ценное, но, по моему мнению, практическая задачка по созданию такого сценария будет полезна для понимания принципов функционирования умного дома.
Как уже все догадались, подопытным кроликом будет шлюз для умного дома -Xiaomi Mi Multi-functional Gateway.
Где купить?
Таблица (обновляется) по экосистеме Xiaomi
Автоматизации подлежит задача —
1. Включение по расписанию светодиодной подсветки шлюза
2. Изменение цвета свечения через заданный интервал
3. Выключение подсветки.
Так как задачка у нас больше теоретическая, интервал работы подсветки возьмем 5 минут, изменение цвета свечения — раз в минуту.
Я использую официальную версию приложения Умный дом и плагин управления шлюзом, взятые из Play Маркет
Начнем.
Запускаем плагин управления шлюзом, и переходим во вкладу Сценарии (Scene). На данной вкладке имеется список всех возможностей устройства, какими мы можем управлять.
Arm — режим управления сигнализацией
Automatic Gateway Light — режим подсветки включаемый автоматически по срабатыванию внешних датчиков и выключаемой через заданный промежуток времени. Например как подсветка в ночное время.
Gateway Light Timer — управление подсветкой в заданный промежуток времени, то что и будет рассмотрено далее
Wake & act clock — это режим будильника / напоминалки. Звуковые сигналы в заданное время
Doorbell — дверной звонок. Заданный звуковой сигнал по нажатию на внешнюю кнопку.
А так же можно добавить свой собственный вариант.
Мы же переходим в раздел Gateway Light Timer
Нажимаем внизу добавить таймер и попадаем в меню настройки таймера. Здесь можно настроить повторы сценария — единоразово, каждый день, только в будние дни и т.д. Далее — время включения и выключения подсветки.
Важно
В этом меню указывается китайское время — в моем случае +6 часов. Мое локальное время видно в верхнем левом углу — 12:31, время сценария — 18:35 — 18:40, в реальности он сработает через 4 минуты.
Далее выбирается цвет подсветки.
После нажатия Yes — возвращаемся в предыдущее меню, где появится наш таймер.
Понятно что нашу задачу можно решить и в этом меню, создав нужное количество сценариев, но — во первых это неинтересно, а во вторых цвет подсветки всегда будет меняться в одном и том же порядке. Поэтому возвращаемся в основное меню Scene
Нажимаем внизу на кнопку добавить сценарий Add scene и попадаем в меню его создания. Добавляем условие сработки — нажимаем Add conditon, и попадаем в меню всех доступных нам вариантов начальных условий. В моем случае это —
Timer — то что нам нужно, сработка в заданное время
When receiving call on Mi Phone — срабатывать при получении звонка на смартфон
When receiving messages on Mi Phone — срабатывать при получении сообщения на смартфон
И далее перечень устройств, которые так же могут служить как индикаторы начала сценария, например превышение температуры, зафиксированное температурным датчиком.
Мы выбираем Timer — и в меню его настройки выбираем — повторы по дням, и время сработки.
Важно
В этом меню указывается локальное время. Закономерности я не определил пока, поэтому рекомендую экспериментировать — какое время указывать для какого сценария, может быть и локальное и китайское.
Определив условие для сработки сценария, переходим в меню инструкций — что делать при соблюдении начального условия. В этом меню нам доступны следующие возможности —
Run a scene — выполнить какой-либо сохраненный сценарий, это удобно в том случае когда у вас есть какой-то сложный сценарий, например отключающий освещение во всем доме. Такой сценарий лучше создать отдельно и просто ссылаться на него при соблюдении нужных условий, тогда, при внесении изменений в него, вам достаточно будет сделать это один раз.
Turn on/off a scene — включает или выключает какой-то сценарий. Пример — у вас работает сценарий включающий и выключающий обогреватель при падении температуры ниже заданной. Но когда вы открываете окно — обогреватель вам не нужен — поэтому по срабатывании датчика открытия окна — вы задаете отключение обогревателя (если он работает в этот момент) и отключение сценария его срабатывания, чтобы датчик температуры не включил его снова. А по закрытию окна — включить сценарий обратно.
Send notification on device — просто пришлет уведомление на смартфон/планшет о том, что соблюдено начальное условие.
TimeLaps — задержка перед выполнением следующей инструкции сценария. Пригодится когда действие нужно выполнять не сразу.
Далее — доступный перечень устройств, которые могут участвовать в сценарии. В нашем случае — это шлюз. Шлюз дает следующие возможности —
Contol arming — управление сигнализацией
Control Gateway Light — управление подсветкой, то что мы и будем использовать
Control radio — управление онлайн радио
Play designated ringtone — воспроизвести заданный рингтон
В меню Control Gateway Light имеются следующие возможности —
Turn on/off gateway light — включить подсветку если она выключена и выключить если включена
Turn on gateway light — включить подсветку
Turn off gateway light — выключить подсветку
Adjust gateway light brightness — регулировка яркости подсветки, но замочек напротив этой опции говорит что в данном сценарии эта регулировка недоступна.
Switch gateway light color — переключение цвета подсветки шлюза. Цвет выбрать нельзя, как я понял переключение рандомно. То что нам нужно.
Сценарий готов, осталось его сохранить и задать ему имя. Повторяем действия для каждого, нужного нам переключения.
Сценарий готов — сначала в 12:35 включится подсветка с заданным нами начальным цветом, далее каждую минут будет отрабатываться сценарий Switch gateway light color и в 12:40 по начальному сценарию подсветка отключится.
Ниже — видео версия моего обзора, в котором так же есть демонстрация работы описанного сценария.