Портирование python-miio и js-miio на php

Task owner: skysilver, Киров - Россия
Current state: Support

Портирую проекты python-miio и js-miio на php для дальнейшей нативной поддержки в MajorDoMo.

Пруф оф концепт уже есть - https://github.com/skysilver-lab/php-miio

miIO - проприетарный шифрованный сетевой протокол xiaomi, по которому взаимодействуют между собой устройства из экосистемы xiaomi. Транспорт UDP, порт 54321.

Реализация этого проекта позволит добавить в MajorDoMo поддержку тех устройств, которые не имеют открытого api (режима разработчика).
Например, Xiaomi Mi Robot Vacuum, Xiaomi Mi Smart WiFi Socket, Xiaomi Philips LED Ceiling Lamp и др.

Тема на форуме http://majordomo.smartliving.ru/forum/viewtopic.php?f=8&t=4677

Исходная информация:
https://github.com/OpenMiHome/mihome-binary-protocol
https://github.com/aholstenson/miio
https://github.com/rytilahti/python-miio
https://github.com/marcelrv/XiaomiRobotVacuumProtocol

Tags: xiaomi,miio,aqara,mijia,mihome

09.12.2017

Перевод в статус "Поддержка"

(skysilver)

В связи с выходом модуля Xiaomi miIO, который успешной функционирует на данной библиотеке, текущий проект переводится в статус "Поддержка".

Discuss (0)

07.11.2017

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

(skysilver)

На форуме добавлен пример использования библиотеки php-miio в MajorDoMo на примере лампочек Philips Light Bulb.

Ссылка на пост:
http://majordomo.smartliving.ru/forum/viewtopic.php?f=8&t=4677&start=80#p63257

Discuss (0)

01.11.2017

Обновление ядра библиотеки (версия 0.2.6)

(skysilver)
  • В функцию отправки команды устройствам добавлен аргумент для задания уникального идентификатора сообщения.
  • Добавлена функция getMsgID($ip) для формирования и хранения в файле идентификаторов команд для устройств.
  • Добавлены варианты использования автоматического и ручного формирования идентификатора сообщения.
  • Добавлена проверка на валидность json-ответов от устройств.
  • Добавлен класс с базовыми функциями и пример работы с пылесосом Xiaomi Mi Robot Vacuum.
  • Добавлен класс с базовыми функциями для настольных ламп Xiaomi Philips Eyecare Smart Lamp 2.

Актуальная версия https://github.com/skysilver-lab/php-miio/releases/tag/v.0.2.6/

Discuss (0)

29.10.2017

Обновления ядра библиотеки

(skysilver)

В функцию отправки команды устройствам добавлен аргумент для задания уникального идентификатора сообщения.
Добавлена функция getMsgID($ip) для формирования и хранения в файле идентификаторов команд для устройств.
Добавлены варианты использования автоматического и ручного формирования идентификатора сообщения.

Discuss (0)

27.10.2017

Обновления ядра библиотеки

(skysilver)

Добавлена коррекция разницы времени между сервером и устройством.
Оптимизирован вызов функций работы с сокетами.
Добавлена функция fastDiscover() для отправки широковещательного hello-пакета без ожидания ответа от miIO-устройств.
Улучшен вывод отладочных сообщений.

Discuss (0)

23.10.2017

Токен miIO-устройства

(skysilver)

На форуме добавил сведения о токенах miIO-устройств - описание, способы получения и др.

Ссылка на пост http://majordomo.smartliving.ru/forum/viewtopic.php?f=8&t=4677&p=61208#p61208

Discuss (0)

17.10.2017

Описание протокола miIO

(skysilver)

Разработка библиотеки php-miio практически завершена. Остается немного задокументировать основные моменты.

В связи с этим в теме на форуме добавил описание протокола miIO - типы и структуру пакетов, построение сессии, шифрование и др.

Ссылка на пост http://majordomo.smartliving.ru/forum/viewtopic.php?f=8&t=4677&p=61207#p61207

Discuss (6)

12.10.2017

Класс с api-функциями и пример его применения для управления лампочками Philips Light Bulb

(skysilver)

Написал класс с 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, версии прошивок, модель, точка доступа, уровень сигнала, свободная память).
Discuss (0)

10.10.2017

Процедура инициализации новых miIO-устройств

(skysilver)

Поразбирался на примере лампочки 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, узнать и записать этот токен.

Discuss (0)

08.10.2017

Опция расшифровки пакетов в консоли

(skysilver)

Добавлена опция расшифровки пакета --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"}

Discuss (0)

06.10.2017

Улучшение работы с сокетами и тестирование библиотеки

(skysilver)

Улучшена работа с сокетами, расширены обработка ошибок, вывод отладочной информации.

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

Проведено тестирование на трех разных платформах - ARM (cubitruck), x86-x64 (неттоп с Windows) и виртуальная машина (Debian).

  1. Кубик Debian 7, PHP 5.4, один eth-порт, маршрут по умолчанию в целевую сеть.
  2. Виртуалка Debian 9, PHP 7.0, три eth-порта (два бриджа в реальные сети хостовой машины - eth и wifi, и один nat), маршрут по умолчанию в подсеть отличную от целевой подсети, где находятся сяоми девайсы.
  3. Неттоп Windows 7 x64 Pro, PHP 7.0, три сетевых интерфейса (eth, wifi, вирт. eth для VirtualBox), маршрут по умолчанию аналогично в подсеть отличную от целевой подсети.

Во всех трех случаях поиск устройств как по ip, так и по броадкасту работает штатно.

php miio-cli.php --discover all --debug --bindip 192.168.1.36
Поиск всех
Режим широковещательного поиска устройств
Статус отладки [1]

Поиск доступных устройств в локальной сети (handshake discovery)
Сокет успешно создан
Параметр SO_RCVTIMEO сокета успешно задан
Параметр SO_BROADCAST сокета успешно задан
Сокет успешно привязан к адресу 192.168.1.36
Отправляем hello-пакет на 255.255.255.255 с таймаутом 15
Отправлено в сокет 32 байт
1 Получен ответ от IP 192.168.1.47 с порта 54321
Прочитано 32 байта из сокета
magic: 2131
length: 0020 --> 32 байт
unknown1: 00000000
devicetype: 035a
serial: fe8e
ts: 000704ad --> 459949 секунд
checksum: b31c928032e6a4afc898c5c8768a518f <-- may be token
2 Получен ответ от IP 192.168.1.45 с порта 54321
Прочитано 32 байта из сокета
magic: 2131
length: 0020 --> 32 байт
unknown1: 00000000
devicetype: 035f
serial: 8589
ts: 00162352 --> 1450834 секунд
checksum: c3d059d8e949382cef2c2f31c7f27799 <-- may be token
Поиск выполнен.
Найдено 2 устройств.
IP 192.168.1.47 DevType 035a Serial fe8e Token b31c928032e6a4afc898c5c8768a518f
IP 192.168.1.45 DevType 035f Serial 8589 Token c3d059d8e949382cef2c2f31c7f27799

Discuss (0)

05.10.2017

Классы miPacket и miIO. Пример работы с функциями класса miIO. Интерфейс командной строки.

(skysilver)

Продолжаю развитие проекта.

Функционал разделен и описан классами.

miio.class.php - класс для сетевого взаимодействия по протоколу miIO:

  • прием udp-пакетов из сокета
  • отправка udp-пакетов в сокет
  • процедура рукопожатия (handshake)
  • отправка сообщений устройству
  • прием ответов от устройства
  • поиск устройств (handshake-discovery)

mipacket.class.php - класс для работы с сетевыми udp-пакетами по протоколу miIO:

  • генерация ключа и вектора инициализации из токена
  • расшифровка
  • шифрование
  • парсинг udp-пакета
  • сборка udp-пакета

В качестве примера взаимодействия с устройствами написан скрипт для командной строки miio-cli.php.
Принимаемые параметры:

  • --discover all поиск устройств в локальной сети и вывод информации о них
  • --discover IP проверка доступности конкретного устройства и вывод информации о нем
  • --info получить информацию об устройстве (аналог --discover IP)
  • --sendcmd отправить команду (д.б. заключена в одинарные кавычки
  • --ip IP-адрес устройства
  • --token токен устройства (не обязательно)
  • --debug включает вывод отладочной информации
  • --help справка по командам
    Примеры:
  • php miio-cli.php --discover all
  • php miio-cli.php --discover 192.168.1.45 --debug
  • php miio-cli.php --ip 192.168.1.45 --info
  • php miio-cli.php --ip 192.168.1.45 --sendcmd '{"method":"toggle",,"params":[],"id":1}'
  • php miio-cli.php --ip 192.168.1.47 --sendcmd '{"id":1,"method":"get_prop","params":["power"]}'

Актуальные исходники здесь https://github.com/skysilver-lab/php-miio

Discuss (0)

 
Subscribe to updates (6)
 

Recent supporters

skysilver 50.00 SM
Anonymous booka 100.00 SM
SergeJey На благое дело :) 100.00 SM

Other tasks by the author

Модуль Xiaomi miIO Devices