Портирование 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.ph...

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

Tags: xiaomi,miio,aqara,mijia,mihome

09.12.2017

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

(skysilver)

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

Discuss (0) (1)

07.11.2017

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

(skysilver)

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

Ссылка на пост:
http://majordomo.smartliving.ru/forum/viewtopic.ph...

Discuss (0) (1)

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...

Discuss (0) (0)

29.10.2017

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

(skysilver)

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

Discuss (0) (0)

27.10.2017

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

(skysilver)

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

Discuss (0) (0)

23.10.2017

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

(skysilver)

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

Ссылка на пост http://majordomo.smartliving.ru/forum/viewtopic.ph...

Discuss (0) (0)

17.10.2017

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

(skysilver)

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

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

Ссылка на пост http://majordomo.smartliving.ru/forum/viewtopic.ph...

Discuss (6) (0)

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) (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) (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) (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) (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) (0)

 
(3)
 
Subscribe to updates (10)
 

Recent supporters

skysilver 50.00 RUB
Anonymous

booka

100.00 RUB
SergeJey

На благое дело :)

100.00 RUB

Task ideas

You can help with project improvement by sharing your ideas or by voting for ideas already added.

Other tasks by the author

Модуль LG WebOS TV
Модуль Xiaomi miIO Devices
Интеграция дешовой китайской техники марки SONOFF