Как подружить Siri и Xiaomi

В этой статье представлен гайд по настройке совместной работы светильников Xiaomi, работающих по Wi-Fi и Bluetooth, с Siri при помощи Homebridge. А также описаны грабли, на которые я успел наступить.

Зима. Холод. Темнота. Подниматься с утра тяжело.

Сказали, что освещение, имитирующее рассвет может помочь проснуться.

Ну что же? Взял ночник от Xiaomi, а точнее Yeelight. Поигрался немного, расстроился от криво работающего софта. Но яркое и красочное освещение прибавило позитива, рабочее место преобразилось, стало уютнее.

Полистал каталог, нашёл светодиодную ленту с возможностью подключения по Wi-Fi. Сравнил с аналогами, оказалась ярче и дешевле. Беру!

И снова проблемы с ПО. Отваливается устройство, приходится переподключаться при входе в программу. Объединение в группу также не всегда корректно работало, да и тянуться до телефона для настройки и включения — занятие не самое благодарное. Искать и покупать дополнительные хабы не стал, отложил всё до лучших времён.

На день рождения коллеги подарили «малинку», в просторечии — Raspberry Pi 3 Model B. Важно, что у устройства есть и Wi-Fi, и Bluetooth модуль. Так как софт для работы с HomeKit-устройствами я уже писал и изучил много материалов, то вспомнил, что можно включить в эту инфраструктуру неподдерживаемые устройства через homebridge — сервер, написанный на NodeJS, который эмулирует HomeKit API.

Шаг 1. Установка ОС

Начинаем с установки ОС. Я выбрал Raspbian в качестве дистрибутива.

  • Берём карту памяти на 8 Гб или больше (мне попалась на 16 Гб от компании %#&@).
  • Форматируем и копируем инсталятор

На этом этапе возникли первые проблемы. Файлы по какой-то причине не копировались на карту корректно, хотя форматирование с помощью фирменной утилиты SD Memory Card Formatter проходило успешно. Собрался сдавать карту в магазин и брать другую, но решил попробовать перед этим внешний кард-ридер. И, о чудо — всё заработало!

Оказалось, что проблема была в Mac mini, который не поддерживал карты формата SDHC.

  • Вставляем карту в «малинку», подключаем клавиатуру, мышь и монитор через HDMI и включаем питание.

Инсталлятор очень простой, а загрузка проходит достаточно быстро. Если возникнут проблемы, загляните в официальную документацию.

Шаг 2. Начальная настройка ОС

  • Меняем пароли и настраиваем учетки.

Для удаленной работы с Rasperry Pi

  • Включаем доступ по SSH и VNC. Можно через графический интерфейс.

Изначально «малинка» питалась от USB-порта, но при этом на экране появлется индикация о том, что питания категорически не хватает. Зарядник от iPhone + micro USB-шнурок решили эту проблему.

Все манипуляции проводились в офисе из-за отсутствия монитора для первоначальной настройки дома.

К выходным «малинка» добралась до квартиры, а руки уже чесались поскорее заняться подключением умных лампочек.

Запустил Raspberry…

Попытка подключения по VNС… Чёрный экран.

Попытка подключения по SSH… Никакой реакции.

Жду понедельника и возвращаюсь на работу. Подключаю клавиатуру, мышь и монитор.
Система не старует. Возможно, проблема возникла из-за повреждений SD-карты или божественного вмешательства.

Переустановил систему. Вспомнил старую цитату: «Люди делятся на две категории:
те, кто еще не делает бэкапы, и те кто их уже делает»
, и принял волевое решение.

Шаг 0. Делаем бэкап

Способов много. Я выбрал самый, на мой взгялд, простой. Полное копирование образа SD карты на флешку.

Создаем образ

  • Находим SD-карту в списке:
    diskutil list

  • Сохраняем образ на диск:
    sudo dd if=/dev/disk2 of=~/Desktop/raspberrypi.dmg

Восстанавливаем образ

  • Находим SD-карту в списке:

    diskutil list

  • Размонтируем SD-карту:

    diskutil unmountDisk /dev/disk2

  • Форматируем карту. Можно через утилиту, можно через Terminal:

    sudo newfs_msdos -F 16 /dev/disk2

  • Восстанавливаем ранее сохранённый образ:
    sudo dd if=~/Desktop/raspberrypi.dmg of=/dev/disk2

Недостаток — долгое время восстановление образа. Зависит от объёма карты, её скорости и характеристик кард-ридера. У меня процесс занял около 4-х часов.
Преимущество — простота и надёжность.

Кстати, можно попытаться ускорить этот процесс. Подробная инструкция на
StackExchange.

Через пару дней пришлось снова выполнять восстановление из бэкапа. При выполнении любой операции возникала ошибка «segmentation fault». Скорее всего, проблема была из-за неисправной карты памяти. Приобрёл новую, на этот раз от Transcend, пока что полёт нормальный.

Шаг 3. Установка компонентов

Начинаем с компонентов, которые понадобятся для запуска сервера:

Как всегда начинаем с обновления системы:

sudo apt-get update sudo apt-get upgrade

После обновления проверяем версию g++:

g++ -v

У меня оказалась gcc version 6.3.0, для установки homebridge нужна версия 4.9+.

Далее устанавливаем NodeJS. Я поставил 9 версию:

curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash - sudo apt-get install -y nodejs

Следующий шаг — установка Avahi, библиотеки для работы с сервисами Apple Bonjour:

sudo apt-get install libavahi-compat-libdnssd-dev

На этом этап предварительной подготовки завершён.

Шаг 4. Установка homebridge

Теперь можно следовать основной инструкции в репозитории проекта.
С помощью команды npm install -g homebridge установку произвести не удалось, поэтому следуем указаниям автора проекта и запускаем инсталлятор с sudo и флагом -g —unsafe-perm homebridge:

sudo npm install -g --unsafe-perm homebridge

Homebridge установлен. Если у вас возникли проблемы, можете почитать
wiki.

Переходим к настройке и подключению устройств:

  • Xiaomi Yeelight Smart Light Strip
  • Xiaomi Yeelight Bedside Lamp

Шаг 5. Yeelight Smart Light Strip

Light Strip подключается по WiFi, его настройка проще. Начинаем с установки плагина:

sudo npm install -g homebridge-re-yeelight sudo npm install -g miio@0.14.1

Версию miio ограничиваем 0.14.1, с более новой плагин работать на данный момент не будет.

Теперь выполняем поиск устройств в локальной сети. Перед этим, естественно, нужно подключить Yeelight Smart Light Strip по WiFi:

miio --discover

Получаем примерно такой вывод в консоль:

INFO  Discovering devices. Press Ctrl+C to stop.  Device ID: xxxxxxxx Model info: yeelink.light.strip1 Address: 192.168.1.xxx Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx via auto-token Support: At least basic

Записываем на листочке и переходим к настройке файла конфигурации.

Шаг 6. Создание config.json

Создаём файл конфигурации. Переходим в каталог ~/.homebridge:

touch config.json nano config.json

Добавляем хаб и устройства, которыми хотим управлять, в файл конфигурации. Обычно конфигурации для конкретных устройств указаны на странице с проектом плагина, в файле config.json.

В конфиг добавляем следующую информацию о homebridge и устройстве, которое мы получили на предыдущем шаге.

{     "bridge": {         "name": "Yeebridge",         "username": "18:00:27:40:BC:1B",         "port": 51825,         "pin": "031-45-154"     },     "platforms": [         {             "platform": "ReYeelightPlatform",             "deviceCfgs": [{                 "type": "ColorLEDStrip",                 "ip": "192.168.1.253",                 "token": "5d0b94f872b4372164b6e61d472d424b",                 "Name": "LED Strip",                 "updatetimer": true,                 "interval": 5             }]         }     ] }

  • name — имя под которым хаб отображается в приложении Home (Дом).
  • pin — пин-код, понадобится для подключения homebridge к приложению Home.
    Далее идет описание подключенных платформ и аксессуаров.
    В качестве платформы для WiFi-устройств от Yeelight мы используем ReYeelightPlatform.

Конфигурация устройств для этой платформы:

  • type — обычно на странице проекта указываются типы для каждого поддерживаемого устройства.
  • ip и token — получили на предыдущем шаге.
  • name — имя для отображения в приложении Home.

Шаг 7. Подключение Xiaomi Yeelight Bedside Lamp

Устройство подключается через BLE. То есть понадобится установленный Bluetooth-модуль с поддержкой BLE. Для работы с подобными устройствами нужна другая платформа — ReYeelightBLEPlatform

Устанавливаем библиотеки для работы со стеком Bluetooth:

sudo apt-get install libbluetooth-dev libudev-dev

Находим папку с установленными node модулями:

npm -g root

У меня она оказалась по адресу /usr/lib/node_modules. Устанавливаем необходимые права и выполняем установку.

Если не установить права, а выполнить установку под sudo, в дальнейшем могут возникнуть проблемы:

sudo chown -R $(whoami) /usr/lib/node_modules/  npm install noble  sudo apt-get install libcap2-bin  sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)  sudo hciconfig hci0 up

Теперь устанавливаем плагин HomeBridge для поддержки Xiaomi Yeelight Bedside Lamp:

sudo npm install -g homebridge-re-yeelight-ble

Будьте внимательны при установке других модулей, управляющих устройствами через Bluetooth, могут возникнуть проблемы совместимости. Например, я долго не мог разобраться, почему у меня постоянно происходило отключение лампы. Оказалось, что проблема в установленном homebridge-yeelight. После его удаления нормальная работа была восстановлена. Возможно, вам тоже пригодится эта команда:

sudo npm uninstall -g homebridge-yeelight

Адрес устройства ищем с помощью:

sudo hcitool -i hci0 lescan

Вывод может выглядеть примерно так:

LE Scan ... 8C:26:A6:3D:67:40 (unknown) 8C:26:A6:3D:67:40 (unknown) FF:B6:36:78:96:A6 RK-M171S F6:24:41:E8:6B:14 XMCTD_ F6:24:41:E8:6B:14 XMCTD_ 76:79:01:46:86:5A (unknown) 76:79:01:46:86:5A (unknown) D6:64:11:49:E6:8D RK-G200S F6:BC:36:68:96:A3 (unknown) D6:66:11:49:E6:8D (unknown)

Нужное устройство помечено, как XMCTD_.

В моём случае F6:24:41:E8:6B:14 XMCTD_
Добавляем в config.json новую платформу ReYeelightBLEPlatform и необходимое устройство с указанным адресом.

Итоговый config.json будет выглядеть примерно так:

{     "bridge": {         "name": "Yeebridge",         "username": "18:00:27:40:BC:1B",         "port": 51825,         "pin": "031-45-154"     },     "platforms": [         {             "platform": "ReYeelightBLEPlatform",             "defaultValue": {                 "F6:24:41:E8:6B:14": "Bedside Lamp"             }         },         {             "platform": "ReYeelightPlatform",             "deviceCfgs": [{                 "type": "ColorLEDStrip",                 "ip": "192.168.1.253",                 "token": "560696f676b4672164b6e61d472d424b",                 "Name": "LED Strip",                 "updatetimer": true,                 "interval": 5             }]         }     ] }

Шаг 8. Запуск homebridge

Запускаем Homebridge для проверки с помощью команды homebridge в консоле.

На экране появляется QR-код для добавления хаба в приложение Home (Дом). А чуть ниже — PIN-код из файла config.json, он используется для ручного подключения.

Если видим заветную строку [ReYeelight][BLE]Timer Started, то скорее всего вы настроили BLE-устройство правильно.

Ваша лампа Xiaomi Yeelight Bedside Lamp начнёт мигать, соединение установлено. Необходимо подтвердить его с помощью нажатия кнопки MODE на лампе.

На этом этапе у нас имеется настроенный хаб и 2 подключенных к нему устройства.

  • Запускаем приложение Home.
  • Жмём добавить аксессуар.
  • Сканируем QR код и соглашаемся на подключение несертифицированного устройства.
    home
    Для каждого из подключаемых устройств можно выбрать имя, по которому к нему можно обращаться через Siri, и комнату, в которой устройство располагается.

При настройке/перенастройке устройств может возникнуть проблема с повторным добавлением homebridge в приложение Home. Для её устранения выполняем следующие операции в папке с настройками homebridge.

  • Останавливаем работу homebridge.
  • Удаляем каталоги accessories и persist:

rm -r accessories rm -r persist

Запускаем homebridge и снова добавляем хаб в приложение Home.

Более подробно о настройке аксессуаров, помещений и сценариев читайте на сайте Apple.

Шаг 9. Запускаем Homebridge при загрузке Raspberry Pi

После перезагрузки устройства необходимо автоматически возобнолять работу Homebridge. Для этого выполним запуск в качестве сервиса.

Загружаем два файла, homebridge и homebridge.service по ссылке. Файл homebridge размещаем в /etc/default. Файл homebridge.service помещаем в /etc/systemd/system.

В файл homebridge.service вносим изменения. Путь ExecStart=/usr/local/bin/homebridge $HOMEBRIDGE_OPTS меняем на ExecStart=/usr/bin/homebridge $HOMEBRIDGE_OPTS.

Добавляем пользователя, под которым будет запускаться сервис:

sudo useradd --system homebridge

Создаем папку для хранения конфигурации homebridge, копируем конфиги и устанавливаем права:

sudo mkdir /var/homebridge sudo cp ~/.homebridge/config.json /var/homebridge/ sudo cp -r ~/.homebridge/persist /var/homebridge sudo cp -r ~/.homebridge/accessories /var/homebridge

Запускаем сервис:

sudo systemctl daemon-reload sudo systemctl enable homebridge sudo systemctl start homebridge

Проверяем его статус:

systemctl status homebridge

Шаг 10. Siri. Трудности перевода

Siri — не самая лёгкая в общении девушка.
Например, светодиодную ленту не стоит называть «Подсветка стола». Siri пытается выполнить «Под светку стало», при этом отвечает, что она не может закрыть программу.

Также не следует называть осветительный прибор «Настольной лампой». Если сказать «Включи настольную лампу», включается весь свет в помещении. При выполнении команды «Выключи настольную лампу» выключается только настольная лампа. Скорее всего, это название для группы, но отсутствие вменяемой документации по Siri в этом разобраться никак не помогает.

Поменять цвет освещения — тоже задача нетривиальная. Например, по-английски команда звучит и произносится очень просто: «Change light color to green». На русском получаем: «Установи цвет света на зелёный».
Поменяй или измени, вместо установи не сработает. Вместо «цвет света» Siri постоянно распознаёт команду, как «свет света», либо «цвет цвета». Пора к логопеду. Проще в этой фразе поменять слова местами, тогда у Siri реже будут возникать промашки. В результате, «стоп-фраза» звучит как «Установи Света цвет на синий». Да, Света в запросе будет с заглавной буквы!

Небольшая шпаргалка для работы с Siri:

Привет, Siri, включи свет. Привет, Siri, выключи свет. Привет, Siri, установи яркость света в спальне на 50%. Привет, Siri, установи цвет света на красный.

Небольшое демо напоследок.

Заключение

Уже 2 недели сервер стабильно работает и радует возможностью простого управления устройствами через приложение Home. Немного расстраивает, что работа над плагинами забрасывается разработчиками, но исходники есть на github, а у Homebridge присутствует документация, в которой описан процесс создания собственного плагина. В дальнейшем планирую добавлять в Home новые устройства и датчики, а также автоматизировать процесс запуска устройств при входе в квартиру. Если возникнут вопросы или пожелания, пишите в комментах, буду рад помочь и ответить на ваши вопросы.

Всем добра и тёплой весны! ^_^

FavoriteLoadingДобавить в избранное
Posted in Без рубрики

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *