miIO - протокол для Xiaomi (Mi Home) устройств

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение skysilver » Чт ноя 02, 2017 10:41 pm

Использование библиотеки php-miio в MajorDoMo на примере Philips Light Bulb

1. Подготовительный этап.
1.1. Скачиваем и распаковываем архив с гитхаба https://github.com/skysilver-lab/php-mi ... master.zip.
1.2. На сервере MajorDoMo в каталоге modules создаем каталог miio и копируем в него файлы:
- miio.class.php
- mipacket.class.php
- philipsbulb.class.php
При необходимости mirobot.class.php и philipseyecare2.class.php копируем сюда же.
1.3. Для вновь созданных папки и файлов назначаем владельца (обычно www-data) и права (0644). Если ОС Windows, то пропускаем этот шаг.

2. Объект, свойства и методы.
Для управления лампой я воспользовался стандартным классом Relays.
2.1. В классе Relays создаем объект PhilipsLamp.
2.2. На уровне объекта создаем свойства ip, token и bright. Заполняем свойства ip и token корректными значениями.
2.3. На уровне класса создаем метод getStatus и setBright. На уровне объекта редактируем эти методы, вписывая следующий код:
Метод getStatus
СпойлерПоказать

Код: Выделить всё

include_once(DIR_MODULES.'miio/philipsbulb.class.php');

$ip = $this->getProperty('ip');
$token = $this->getProperty('token');
$bind_ip = null;
$debug = false;

$bulb = new philipsBulb($ip, $bind_ip, $token, $debug);

if ($bulb->getStatus()) {
    
     if (isset($bulb->status['power']) && $bulb->status['power'] != '') {
         if ($bulb->status['power'] == 'off') { $this->setProperty('status', 0); $this->setProperty('statusText', 'Выключено'); }
         if ($bulb->status['power'] == 'on')  { $this->setProperty('status', 1); $this->setProperty('statusText', 'Включено'); }
    }
     
     if (isset($bulb->status['bright']) && $bulb->status['bright'] != '') $this->setProperty('bright', $bulb->status['bright']);
    if (isset($bulb->status['cct']) && $bulb->status['cct'] != '') $this->setProperty('cct', $bulb->status['cct']);

} else say("Статус настольной лампы не получен. Ошибка: $bulb->error", 0);
Метод setBright
СпойлерПоказать

Код: Выделить всё

include_once(DIR_MODULES.'miio/philipsbulb.class.php');

$ip = $this->getProperty('ip');
$token = $this->getProperty('token');
$bind_ip = null;
$debug = true;

$bulb = new philipsBulb($ip, $bind_ip, $token, $debug);

if ($bulb->setBrightness($this->getProperty('bright'))) {
     say('Задана яркость настольной лампы ' . $this->getProperty('bright'), 0);
} else say("Яркость настольной лампы не задана. Ошибка: $bulb->error", 0);
2.4 На уровне объекта редактируем методы turnOn и turnOff, вписывая следующий код:
Метод turnOn
СпойлерПоказать

Код: Выделить всё

include_once(DIR_MODULES.'miio/philipsbulb.class.php');

$ip = $this->getProperty('ip');
$token = $this->getProperty('token');
$bind_ip = null;
$debug = false;

$bulb = new philipsBulb($ip, $bind_ip, $token, $debug);

if ($bulb->powerOn()) {
     $this->setProperty('status', 1);
     $this->setProperty('statusText', 'Включено');
     say('Настольная лампа включена', 0);
} else say("Настольная лампа не включена. Ошибка: $bulb->error", 0);
Метод turnOff
СпойлерПоказать

Код: Выделить всё

include_once(DIR_MODULES.'miio/philipsbulb.class.php');

$ip = $this->getProperty('ip');
$token = $this->getProperty('token');
$bind_ip = null;
$debug = false;

$bulb = new philipsBulb($ip, $bind_ip, $token, $debug);

if ($bulb->powerOff()) {
     $this->setProperty('status', 0);
     $this->setProperty('statusText', 'Выключено');
     say('Настольная лампа выключена', 0);
} else say("Настольная лампа не выключена. Ошибка: $bulb->error", 0);
2.5 Проверяем работу методов, запуская их вручную.
2.6 Важно! miIO-устройства никак не оповещают локальный сервер об изменении своего статуса. Предположительно, такой функционал есть для облака Xiaomi, но нам это ничем не поможет, т.к. протокол работы с облаком на данный момент не расшифрован. Поэтому, если включить лампу через Mihome на смартфоне, то MajorDoMo никак не узнает, что лампа включена. Для этого нужно делать периодический опрос состояния устройства, например, добавив ежеминутный вызов метода getStatus в таймер onNewMinute:

Код: Выделить всё

cm('PhilipsLamp.getStatus'); 
3. Элементы меню.
Тут даже расписывать нечего, все просто. Создаем элемент switch, привязываем к нему метод switch нашего объекта PhilipsLamp для включения и выключения лампы, и свойство status для контроля состояния лампы (включена или выключена). Для управления яркостью создаем элемент sliderbox, привязываем к нему свойство bright объекта PhilipsLamp, а в поле код пишем вызов метода setBright:

Код: Выделить всё

cm('PhilipsLamp.setBright'); 
property_lamp.png
property_lamp.png (48.69 КБ) 7046 просмотров
menu_lamp.png
menu_lamp.png (23.06 КБ) 7046 просмотров
По такому же принципу уже сегодня можно интегрировать пылесос и настольную лампу (Eyecare Smart Lamp 2), т.к. для них описаны базовые API-функции в классах (файлы mirobot.class.php и philipseyecare2.class.php). Для остальных устройств требуется написать свои классы по аналогии с вышеуказанными.
За это сообщение автора skysilver поблагодарили (всего 5):
ysanjok (Пт ноя 03, 2017 2:51 am) • Gelezako (Пт ноя 03, 2017 2:55 pm) • antpino (Пн ноя 20, 2017 12:37 pm) • woow (Чт дек 07, 2017 11:00 am) • Divan (Пн авг 26, 2019 10:49 pm)
Рейтинг: 5.81%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение skysilver » Чт ноя 02, 2017 10:51 pm

AnT писал(а):Готов быть подопытным владельцем: Philips/Yeelight bulb, Power Strip2, Vacuum, камера кубик
Philips bulb и Vacuum можно тестировать уже сейчас (см. пример выше). Для Yeelight и Power Strip2 сначала нужно api-функции в класс сводить. Камеры - это отдельная песня, насколько знаю, они по этому протоколу не управляются и работают только через облако.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
ysanjok
Сообщения: 15
Зарегистрирован: Сб авг 12, 2017 7:16 pm
Благодарил (а): 11 раз
Поблагодарили: 7 раз

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение ysanjok » Пт ноя 03, 2017 6:58 am

skysilver писал(а):Использование библиотеки php-miio в MajorDoMo на примере Philips Light Bulb
Отчёт о тестировании: вкратце - всё работает.
Подробнее:
Немного расширил способ, так сказать на будущее.
Создал класс MiioDevices на основе Relays
В нём подкласс PhilipsBulb, а уже в нём Объект PhilipsLamp, ибо таких ламп имею несколько - упростил:
2.4 На уровне объекта редактируем методы turnOn и turnOff, вписывая следующий код
, переписав эти методы в подклассе.
Ладно, долго рассказывать не могу, поступим так:
Под спойлером всё в картинках, думаю будет ясно.Показать
Screenshot-2017-11-3 classes (Панель управления).png
Screenshot-2017-11-3 classes (Панель управления).png (14.4 КБ) 7024 просмотра
Screenshot-2017-11-3 MiioDevices.png
Screenshot-2017-11-3 MiioDevices.png (25.57 КБ) 7024 просмотра
Screenshot-2017-11-3 PhilipsBulb.png
Screenshot-2017-11-3 PhilipsBulb.png (19.95 КБ) 7024 просмотра
Screenshot-2017-11-3 PhilipsBulb(1).png
Screenshot-2017-11-3 PhilipsBulb(1).png (44.85 КБ) 7024 просмотра
Screenshot-2017-11-3 PhilipsBulb(2).png
Screenshot-2017-11-3 PhilipsBulb(2).png (46.35 КБ) 7024 просмотра
Screenshot-2017-11-3 PhilipsBulb(3).png
Screenshot-2017-11-3 PhilipsBulb(3).png (18.06 КБ) 7024 просмотра
Screenshot-2017-11-3 PhilipsLamp.png
Screenshot-2017-11-3 PhilipsLamp.png (25.05 КБ) 7024 просмотра
Screenshot-2017-11-3 PhilipsLamp(1).png
Screenshot-2017-11-3 PhilipsLamp(1).png (61.35 КБ) 7024 просмотра
Screenshot-2017-11-3 PhilipsLamp(2).png
Screenshot-2017-11-3 PhilipsLamp(2).png (42.27 КБ) 7024 просмотра
К посту прилагаю свой результат в виде файла MiioDevices.txt
MiioDevices.txt
(9.55 КБ) 746 скачиваний
, который можно импортировать в панели управления - Объекты - (внизу) Инструменты - Импортировать...
К сожалению, в процессе экспорта/импорта не сохраняется иерархия классов (вложенность), потому сразу после импорта стоит зайти в класс PhilipsBulb и указать для него родительский класс MiioDevices.
Screenshot-2017-11-3 PhilipsBulb(4).png
Screenshot-2017-11-3 PhilipsBulb(4).png (18.36 КБ) 7024 просмотра
В устройствах есть тестовая лампочка - там нужно установить значения свойств token и ip.
Спасибо :roll:
За это сообщение автора ysanjok поблагодарили (всего 3):
skysilver (Пт ноя 03, 2017 9:48 am) • Gelezako (Пт ноя 03, 2017 2:55 pm) • antpino (Пн ноя 20, 2017 12:41 pm)
Рейтинг: 3.49%
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение sergejey » Пт ноя 03, 2017 1:14 pm

Очень интересная разработка, но может это стандартным модулем оформить? Чтобы не создават вручную объекты и прочее. Нужна в этом помощь или оно в процессе ещё?
За это сообщение автора sergejey поблагодарил:
ErmolenkoM (Вс ноя 12, 2017 9:13 pm)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение skysilver » Пт ноя 03, 2017 1:40 pm

sergejey писал(а):Очень интересная разработка, но может это стандартным модулем оформить? Чтобы не создават вручную объекты и прочее. Нужна в этом помощь или оно в процессе ещё?
Модуль однозначно есть в планах, но непосредственно к разработке пока не приступал - дефицит времени и навыков написания модулей. Буду благодарен, если подготовишь некий прототип. А я бы его уже дальше допиливал и поддерживал.
В модуле явно придется свой цикл использовать, чтобы организовать периодический опрос устройств.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение nick7zmail » Пт ноя 03, 2017 2:52 pm

А может попробовать добавить в основной модуль хиаоми? (или заменить его?) Мне кажется wifi-gate тоже будет работать по этому же протоколу...только без включенного режима разработчика...
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение Gelezako » Пт ноя 03, 2017 2:54 pm

skysilver писал(а):Для Yeelight и Power Strip2 сначала нужно api-функции в класс сводить.
подскажите пожалуйста что значит "нужно api-функции в класс сводить", есть некоторый опыт программирования на пхп, подскажите хотя бы план действий что нужно делать, куда копать? Есть ли смысл по инструкции добавлять филипс лампу, а потом пытаться переделать под Yeelight? В чём будет принципиальная разница управления этой лампой от филипс?
nick7zmail писал(а): А может попробовать добавить в основной модуль хиаоми? (или заменить его?) Мне кажется wifi-gate тоже будет работать по этому же протоколу...только без включенного режима разработчика...
+1
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение skysilver » Пт ноя 03, 2017 3:07 pm

nick7zmail писал(а):А может попробовать добавить в основной модуль хиаоми? (или заменить его?) Мне кажется wifi-gate тоже будет работать по этому же протоколу...только без включенного режима разработчика...
Нее, не надо.

Во-первых, в случае режима разработчика шлюз сам шлет данные на сервер (и в облако по шифрованному протоколу) по событиям от датчиков. Это идеальный вариант, нет необходимости поллить его запросами каждую секунду на предмет нажал ли кто кнопку и т.п.

Во-вторых, по протоколу miIO в локальной сети шлюз поддерживает весьма ограниченный набор функций, особо не разбежишься. Вся движуха там в протоколе, которые с облаком связывает шлюз (на базе https), а его пока не расшифровали.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение skysilver » Пт ноя 03, 2017 3:16 pm

Gelezako писал(а):подскажите пожалуйста что значит "нужно api-функции в класс сводить", есть некоторый опыт программирования на пхп, подскажите хотя бы план действий что нужно делать, куда копать? Есть ли смысл по инструкции добавлять филипс лампу, а потом пытаться переделать под Yeelight? В чём будет принципиальная разница управления этой лампой от филипс?
Это значит, что нужно написать класс, в котором будут функции, отправляющие нужные команды на устройство и принимающие и обрабатывающие ответы от него.

Для каждого устройства требуется предварительно выяснить, какие команды оно поддерживает и что шлет в ответ на них. Чтобы не изобретать велосипед, я сначала ищу эти команды на гитхабе в аналогичных библиотеках на питоне, nodejs или других системах умного дома, где уже есть поддержка нужного устройства. В большинстве случаев этого будет достаточно, и нужная информация по командам найдется. Если нет, то можно перехватить трафик между устройством и смартфоном с Mihome, расшифровать его и узнать все нужные команды и ответы на них.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение skysilver » Пт ноя 03, 2017 3:40 pm

Gelezako писал(а):Есть ли смысл по инструкции добавлять филипс лампу, а потом пытаться переделать под Yeelight? В чём будет принципиальная разница управления этой лампой от филипс?
В инструкции речь про объекты и классы в МЖД. Их можно заводить, обзывать, переделывать как угодно. Вся фишка в файлах классов philipsbulb.class.php. Под каждый тип устройства нужно свой файл делать.

Если речь про обычную белую yeelight, то включение, выключение и яркость будет работать без всяких переделок с тем же philipsbulb.class.php. Нужно только ip и токен указать от лампочки. А вот запрос статуса, включение сцен, таймер отключения и др. в полном объеме не заработают, т.к. там уже специфичные команды - у филипс одни, у елайт другие.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Ответить