Инструкция для получения доступа к устройству в целях получения и хранения данных с него удобным образом. Зачем? Чтобы в перспективе настроить свой Умный Дом без ограничений приложений, которые предоставляют производители.
Приветствую! Меня зовут Андрей Степанов, я 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 лет назад. Но это не беда: помимо декларативного управления описанных устройств есть управление напрямую.
Реализация
Ставим библиотеку. С помощью команды
npm install miio
.
Пишем маленький сервер
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' ,[{"did":"MYDID","siid":3,"piid":8}]).then(data=> console.log(data))
device.call('get_properties' ,[{"did":"MYDID","siid":3,"piid":7}]).then(data=> console.log(data))
})
.catch(err => console.log(err));
res.end("The server is running!");
}).listen(8080);
Конструкция [{"did":"MYDID","siid":3,"piid":8}]
требует пояснения. С ее помощью задаем, с какого датчика нам нужно получить показания.
Вот как эта конструкция формируется:
Ищем спецификацию на ваше устройство по ссылке вот такого формата:
https://miot-spec.org/miot-spec-v2/instance?type= + ваше устройство (поможет Google).
В моем случае получилось вот так: https://miot-spec.org/miot-spec-v2/instance?type=urn:miot-spec-v2:device:air-purifier:0000A007:zhimi-mb3:1
Спецификация по ссылке отдается в формате json. Далее методом пристального взгляда ищем нужные нам свойства. Мне нужны были температура и влажность.
Эпилог
«Вот так, с помощью нехитрых приспособлений буханку белого (или черного) хлеба можно превратить в троллейбус… Но зачем?» (с)
После вышеописанных манипуляций удается получить доступ к устройству. Можно хранить и выводить информацию с датчиков, как вашей душе угодно. Можно пилить свой Умный Дом с полной автоматикой, блекджеком и Алисой, и все это без ограничений приложений, которые предоставляют производители.
У меня по плану: жду малинку, запущу там Node, добавлю какую-нибудь базу и буду пилить фронт с графиками и прочей живностью...