Инструкция для получения доступа к устройству в целях получения и хранения данных с него удобным образом. Зачем? Чтобы в перспективе настроить свой Умный Дом без ограничений приложений, которые предоставляют производители. 

Приветствую! Меня зовут Андрей Степанов, я 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 лет назад. Но это не беда: помимо декларативного управления описанных устройств есть управление напрямую.

Реализация

  1. Ставим библиотеку. С помощью команды npm install miio.

  1. Пишем маленький сервер

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}] требует пояснения. С ее помощью задаем, с какого датчика нам нужно  получить показания.

Вот как эта конструкция формируется:

  1. Ищем спецификацию на ваше устройство по ссылке вот такого формата:
    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

  1. Спецификация по ссылке отдается  в формате json. Далее методом пристального взгляда ищем нужные нам свойства. Мне нужны были температура и влажность.

Эпилог

«Вот так, с помощью нехитрых приспособлений буханку белого (или черного) хлеба можно превратить в троллейбус… Но зачем?» (с)

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

У меня по плану: жду малинку, запущу там Node, добавлю какую-нибудь базу и буду пилить фронт с графиками и прочей живностью...

Комментарии (3)