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

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

Модератор: immortal

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

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

Сообщение skysilver » Пт окт 06, 2017 9:26 am

alekszander писал(а):коллеги успешно отработал поиск шлюза, но почему то токен одни нули. Это нормально?

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

IP 192.168.1.80 DevType 02d3 Serial 292c Token 00000000000000000000000000000000
Можно увидеть полностью выхлоп команды?

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

php miio-cli.php --discover 192.168.1.80 --debug
В целом это нормально, устройство не всегда шлет свой токен в ответ на hello-пакет. Обычно это зависит от прошивки (ее версии). В таких случаях, чтобы организовать взаимодействие, токены нужно выяснять другими способами, более трудоемкими. Например, вытаскивать из базы данных приложения Mihome, либо сниффить трафик между приложением и устройством на предмет команд получения токена.
За это сообщение автора skysilver поблагодарил:
Петр (Ср ноя 15, 2017 6:52 pm)
Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
alekszander
Сообщения: 178
Зарегистрирован: Вс янв 05, 2014 5:37 am
Благодарил (а): 10 раз
Поблагодарили: 17 раз

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

Сообщение alekszander » Пт окт 06, 2017 9:29 am

На данный момент на шлюзе стоит последняя прошивка. Я так думаю проблема именно в этом. И ещё параллельный вопрос. Светодиодной лентой можно будет управлять. На сколько я понял любой девайс от сяоми можно прикрутить. Если поснифить трафик.


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

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

Сообщение skysilver » Пт окт 06, 2017 9:42 am

alekszander писал(а):Светодиодной лентой можно будет управлять. На сколько я понял любой девайс от сяоми можно прикрутить. Если поснифить трафик.
Думаю, да. Есть шанс поуправлять любым wifi-устройством. Для расшифровки сырых пакетов планирую добавить опцию в cli-интерфейс.
За это сообщение автора skysilver поблагодарил:
Петр (Ср ноя 15, 2017 6:52 pm)
Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
alekszander
Сообщения: 178
Зарегистрирован: Вс янв 05, 2014 5:37 am
Благодарил (а): 10 раз
Поблагодарили: 17 раз

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

Сообщение alekszander » Пт окт 06, 2017 1:10 pm

skysilver писал(а):
alekszander писал(а):коллеги успешно отработал поиск шлюза, но почему то токен одни нули. Это нормально?

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

IP 192.168.1.80 DevType 02d3 Serial 292c Token 00000000000000000000000000000000
Можно увидеть полностью выхлоп команды?

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

php miio-cli.php --discover 192.168.1.80 --debug
В целом это нормально, устройство не всегда шлет свой токен в ответ на hello-пакет. Обычно это зависит от прошивки (ее версии). В таких случаях, чтобы организовать взаимодействие, токены нужно выяснять другими способами, более трудоемкими. Например, вытаскивать из базы данных приложения Mihome, либо сниффить трафик между приложением и устройством на предмет команд получения токена.

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

pi@raspberrypi:~/php-miio-master $ php miio-cli.php --discover 192.168.1.80 --debug
Поиск 192.168.1.80
Поиск выполнен.
Устройство найдено и отвечает. 
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

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

Сообщение skysilver » Пт окт 06, 2017 1:17 pm

alekszander писал(а):pi@raspberrypi:~/php-miio-master $ php miio-cli.php --discover 192.168.1.80 --debug
Поиск 192.168.1.80
Поиск выполнен.
Устройство найдено и отвечает.
Как-то маловато. )) Ключ --debug похоже не срабатывает. Вот так должно быть по идее:

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

skysilver@ihome:~/php-miio-master$ php miio-cli.php --discover 192.168.1.45 --debug
Поиск 192.168.1.45
Соединение с устройством IP 192.168.1.45
Статус отладки [1]

Проверяем доступность устройства 192.168.1.45
Сокет успешно создан
Параметр SO_RCVTIMEO сокета успешно задан
Отправляем hello-пакет на 192.168.1.45 с таймаутом 15
Отправлено в сокет 32 байт
Получен ответ от IP 192.168.1.45 с порта 54321
Прочитано 32 байта из сокета
magic: 2131
length: 0020 --> 32 байт
unknown1: 00000000
devicetype: 035f
serial: 8589
ts: 0016c156 --> 1491286 секунд
checksum: c3d059d8e949382cef2c2f31c7f27799  <-- may be token
Поиск выполнен.
Устройство найдено и отвечает.
За это сообщение автора skysilver поблагодарил:
Петр (Ср ноя 15, 2017 6:52 pm)
Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
alekszander
Сообщения: 178
Зарегистрирован: Вс янв 05, 2014 5:37 am
Благодарил (а): 10 раз
Поблагодарили: 17 раз

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

Сообщение alekszander » Пт окт 06, 2017 1:22 pm

Ладно. Будем разбираться.


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

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

Сообщение skysilver » Вс окт 08, 2017 1:06 am

Добавлена опция расшифровки пакета --decode.

Для расшифровки требуется обязательно указать токен через параметр --token.

Примеры:

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

php miio-cli.php --token b31c928032e6a4afc898c5c8768a518f --decode 2131004000000000035afe8e0015866408eba3ebad7d9172ddc455d80da59372378c0735ee553f7a4116d050711867e047a0852862801fe8cc7dff5b99bea030
Расшифрованные данные: {"result":["ok"],"id":2}

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

php miio-cli.php --token b31c928032e6a4afc898c5c8768a518f --decode 2131006000000000035afe8e00158664308bc9afd0c2f446837a99bb303b4050bd7f4a7087ef07ca58a35f88626fb84a66044e10f3478ebde2bcd2bf1ed537aab5d20606507ef573a5c8463c5865cb86dd31336b231fc3f139131d79b5ebc8d0
Расшифрованные данные: {"id": 2, "params": ["off"], "method": "set_power"}
За это сообщение автора skysilver поблагодарил:
Петр (Ср ноя 15, 2017 6:52 pm)
Рейтинг: 1.16%
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 » Вт окт 10, 2017 2:21 am

Поразбирался на примере лампочки Philips с привязыванием к wifi и Mihome.

В целом алгоритм поиска и добавления нового wifi-устройства в Mihome выглядит так:
1. Включаем новое устройство в сеть. Оно создает свою точку доступа.
2. Приложение Mihome производит поиск новых wifi-сеток, и если находит, то предлагает добавить устройство.
3. При добавлении телефон подключается к точке доступа устройства. Mihome спрашивает имя целевой wifi-сети и пароль от нее.
4. Далее эти данные отправляются на устройство по протоколу miIO.
5. Устройство перезагружается и цепляется к целевой wifi-сетке. Телефон также переключается обратно на основную точку доступа.
6. Mihome и устройство обмениваются пакетами по протоколу miIO. Профит.

Данную процедуру можно выполнить и без Mihome с помощью метода miIO.config_router, который принимает следующие параметры:
ssid - имя wifi-сети
passwd - пароль
uid - id профиля в Mihome, к нему и будет привязан новое устройство.
Если не указывать uid, то устройство только подключится к точке доступа и не будет добавлено в Mihome, но им можно будет полноценно управлять. Т.о. можно вообще отказаться от приложения Mihome, если нет необходимости обновлять прошивки. uid можно узнать в Mihome в свойствах профиля на вкладке Personal info.

Пример команды в консоли:

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

php miio-cli.php --ip 192.168.4.1 --debug --sendcmd {"id":1,"method":"miIO.config_router","params":{"ssid":"wifipointname","passwd":"wifipassword","uid":1549521xxx}}
Важно! Любое wifi-устройство в заводском состоянии шлет в ответах свой токен. Поэтому будет логично прежде, чем привязывать устройство к Mihome, узнать и записать этот токен.
За это сообщение автора skysilver поблагодарили (всего 4):
Amarok (Вт окт 10, 2017 7:00 am) • Gelezako (Вс окт 15, 2017 8:57 pm) • Петр (Ср ноя 15, 2017 6:52 pm) • lostar-igor (Ср июн 12, 2019 4:29 pm)
Рейтинг: 4.65%
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 » Чт окт 12, 2017 2:40 am

Написал класс с api-функциями (philipsbulb.class.php) и пример его применения (philipsbulb-sample.php) для управления лампочками Philips Light Bulb.

Возможности:
  • powerOn() - включение;
  • powerOff() - выключение;
  • setBrightness($level) - установка яркости (от 1 до 100);
  • setColorTemperature($level) - установка цветовой температуры (от 1 до 100);
  • setScene($num) - переключение сцен (ярко, ТВ, тепло, полночь);
  • setDelayOff($seconds) - установка таймера на авто выключение (в секундах, максимум 6 часов);
  • getStatus() - получение текущего статуса и параметров;
  • getInfo() - расширенные сведения (время работы, mac, ip, версии прошивок, модель, точка доступа, уровень сигнала, свободная память).
Исходник примера:
СпойлерПоказать

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

require('philipsbulb.class.php');

error_reporting(-1);
ini_set('display_errors', 1);

$ip = '192.168.1.48';
$token = 'b35f0af9064e6434d3f571ec05e5acc6';
$bind_ip = null;
$debug = false;

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

echo PHP_EOL . date('H:m:s', time());
if($bulb->getStatus()) echo ' Статус получен.' . PHP_EOL;
echo 'Питание: ' . $bulb->status['power'] . PHP_EOL;
echo 'Яркость: ' . $bulb->status['bright'] . PHP_EOL;
echo 'Цветовая температура: ' . $bulb->status['cct'] . PHP_EOL;
echo 'Сцена: ' . $bulb->status['snm'] . PHP_EOL;
echo 'Таймер выключения: ' . $bulb->status['dv'] . PHP_EOL;

sleep(2);

echo PHP_EOL . date('H:m:s', time()) . PHP_EOL;
echo $bulb->getInfo() . PHP_EOL;

sleep(2);

echo PHP_EOL . date('H:m:s', time());
if($bulb->powerOn()) echo ' Лампа включена.' . PHP_EOL;
 else echo "Лампа не включена. Ошибка: $bulb->error" . PHP_EOL;

sleep(2);

echo PHP_EOL . date('H:m:s', time());
if($bulb->powerOff()) echo ' Лампа выключена.' . PHP_EOL;
 else echo "Лампа не выключена. Ошибка: $bulb->error" . PHP_EOL;

sleep(2);

for ($i = 1; $i < 5; $i++) {
    echo PHP_EOL . date('H:m:s', time());
    if($bulb->setScene($i)) echo " Включена сцена $i." . PHP_EOL;
    sleep(2);
}
Результат выполнения:
СпойлерПоказать

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

skysilver@ihome:~$ php philipsbulb-sample.php

02:10:13 Статус получен.
Питание: on
Яркость: 10
Цветовая температура: 1
Сцена: 4
Таймер выключения: 0

02:10:17
{"result":{"life":7544,"token":"b35f0af9064e6434d3f571ec05e5acc6","mac":"34:CE:00:9B:05:BB","fw_ver":"1.3.0_0032","hw_ver":"ESP8266","model":"philips.light.bulb","wifi_fw_ver":"1.5.0-dev(7f7a714)","ap":{"rssi":-55,"ssid":"wifipoint","bssid":"EC:43:F6:04:48:10"},"netif":{"localIp":"192.168.1.48","mask":"255.255.255.0","gw":"192.168.1.1"},"mmfree":5648},"id":1}

02:10:19 Лампа включена.

02:10:21 Лампа выключена.

02:10:23 Включена сцена 1.

02:10:25 Включена сцена 2.

02:10:27 Включена сцена 3.

02:10:29 Включена сцена 4.
За это сообщение автора skysilver поблагодарил:
Петр (Ср ноя 15, 2017 6:52 pm)
Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

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

Сообщение Gelezako » Вс окт 15, 2017 8:53 pm

skysilver писал(а):
Gelezako писал(а):Устройством XIAOMI IR Mi Remote 360 с помощью вашего модуля можно будет управлять? У него тоже со сих пор нет режима разработчика и наверно не будет.
Модуля пока нет. ))
В питоновской библиотеке есть базовая поддержка Xiaomi Universal IR Remote Controller (Chuangmi IR), если это то же самое, то можно будет реализовать. В каком объеме получится - тут уж надо исследовать вопрос. Лично у меня из wifi-девайсов сяоми только шлюз и лампочки yeelight, philips.
Xiaomi Universal IR Remote Controller - это оно, но вот Chuangmi IR - это ИП камера, не понимаю почему она указано в скобочках, в моём понимании это два разных устройства.

Спасибо за ваш код, начал тестировать. Но вот столкнулся в главной проблемой, вы выводите в консоль кирилицу, а под виндой из-за разности в кодировке выводятся не читаемые символы. Пробовал в notepad++ пересохранять файл в разных кодировках, но это не помогает. Может подскажите решение? А то не охота выводимый текст на латиницу переписывать :)

Решение найдено, если у вас win 7 то открываете скрипт в notepad++, выставляете кодировку "кирилица" - "ОЕМ 8866"

Ещё вопрос, как думаете можно ли вашу логику прикрутить в основной Ксиоми модуль? https://github.com/sergejey/majordomo-xiaomihome
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Ответить