В этой статье представлен гайд по настройке совместной работы светильников 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 новые устройства и датчики, а также автоматизировать процесс запуска устройств при входе в квартиру. Если возникнут вопросы или пожелания, пишите в комментах, буду рад помочь и ответить на ваши вопросы.


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

Комментарии (24)


  1. mrpsycho
    12.03.2018 13:53

    крутая статья, спасибо!)
    ждем сие для кондиционера + умных розеток, куда втыкается утюг, например.


    1. GxocT Автор
      12.03.2018 14:37

      Спасибо! Когда появятся другие интересные устройства или получится реализовать интересный функционал, обязательно напишу новый материал.


      1. alexyr
        12.03.2018 21:05

        Спасибо за статью! Сейчас пытаюсь подружить с Siri свою Orvibo S20…
        Напоминает ситуацию с установкой Heroes of Might and Magic после статьи о них :)


        1. GxocT Автор
          12.03.2018 21:56

          Плагин для homebridge есть. Как настроите, напишите, либо если будут вопросы, готов помочь :)


          1. alexyr
            13.03.2018 10:48
            +1

            Плагин установился только с --unsafe-perm…
            Заработало с настройками из config-sample.json, пришлось чуток подождать сначала пока подключит и настроит розетку


            1. GxocT Автор
              13.03.2018 11:42

              Круто! А на каком железе/OS запускали?


              1. alexyr
                13.03.2018 18:25
                +1

                На обычном домашнем компе под управлением Ubuntu Server 16.04.4 kernel 4.13.0-36-generic


  1. JasterOne
    12.03.2018 14:43

    Спасибо. Забавно… походу скоро задумаюсь о подобном… :)


    1. GxocT Автор
      12.03.2018 14:50

      Круто! Если будут вопросы, пишите :)


  1. Mode
    12.03.2018 14:54

    Посмотрел бегло статью, непойму, почему вы не воспользовались плагином от разработчиков Yeelight?
    npm install -g homebridge-yeelight
    Он подхватывает все их лампы автоматом, без настройки конфигов и танцев с бубном.


    1. GxocT Автор
      12.03.2018 15:02

      Первая попытка подключения выполнялась с использованием homebridge-yeelight С WiFi лампой никаких проблем не возникло, но по Bluetooth так и не удалось организовать работу устройства.

      К тому же настройки других плагинов ничем практически не будет отличаться от того, что описано в статье. В любом случае придется устанавливать homebridge и библиотеки для работы со стеком BLE.


      1. Mode
        12.03.2018 15:36
        +1

        Не знаю, чем не угодило подключение через wifi, но ладно :)
        Спасибо за ответ!


        1. GxocT Автор
          12.03.2018 15:40

          У Xiaomi Yeelight Bedside Lamp (первого поколения) отсутствует WiFi-модуль, то есть можно только через BLE подключиться. Второе поколение этой лампы обзавелось поддержкой WiFi :)


          1. Mode
            12.03.2018 16:21

            Теперь понял, вышло недоразумение из-за фотографии Mijia-лампы =)


            1. GxocT Автор
              12.03.2018 16:32

              Не обратил внимание, что фотография от более продвинутой версии, на сайте Yeelight про первое поколение уже забыли :(


  1. xvladimirov
    12.03.2018 15:03

    Настроил похожее у себя, но поставил на raspberry domoticz, а к нему уже homebridge. И все было бы круто, если бы карты памяти в raspberry жили бы дольше двух-трех недель. Вы не сталкивались с такой проблемой?


    1. GxocT Автор
      12.03.2018 15:11

      В статье я написал о том, что первая карта у меня вышла из строя примерно через 2 недели. Я предположил, что карта бракованная.
      Вторая карточка работает в устройстве 3 недели и пока, что все хорошо, если и она перестанет функционировать в ближайшее время, нужно будет смотреть уже в сторону Raspberry Pi.

      Как вам domoticz?


      1. xvladimirov
        12.03.2018 15:17

        Да, проглядел это место в статье.
        Domoticz вполне себе норм. Он позволил использовать одновременно два хаба — xiaomi и broadlink, а главное — гибко настраивать всякие сяомовские контролы, вроде magic cube и кнопки.
        Опережая вопрос о том, зачем мне два хаба: у broadlink гораздо качественнее выглядят розетки + софтина для управления ir-девайсами не на китайском, в отличие от xiaomi.


        1. GxocT Автор
          12.03.2018 15:31

          А напрямую, без использования хабов, не ко всем устройствам получается цепляться?


          1. xvladimirov
            12.03.2018 15:37

            Неа, не ко всем. Но точно не помню уже к каким можно, к каким нет.


  1. Goodkat
    12.03.2018 19:35

    А Сири как-то понимает контекст, в какой комнате она/айфон/говорящий находится? Т.е. можно ли просто сказать «выключи свет», чтобы свет выключился именно в текущей комнате, а не по всей квартире, и не приходилось уточнять, в какой именно комнате? Маяки там какие-нибудь повесить в каждой комнате...


    1. GxocT Автор
      12.03.2018 19:46

      У HomePod есть привязка к помещению, возможно, он сможет распознать о каком помещении идет речь, но для этого нужно по HomePod'у в каждой комнате. Не факт, что это будет работать, по крайней мере с текущей версией прошивки. (попробую с одним устройством, отпишусь о результатах)

      Биконы определяют нахождение в комнате по наличию устройства (телефона), то есть для такого сценария, вам нужно постоянно носить с собой iPhone. Насколько я помню такого сценария у приложения Home — нет.


    1. GxocT Автор
      12.03.2018 22:01



      Вот в такой конфигурации заработало. Если я прошу Siri выключить свет, то выключаются лампы только в «Кабинете».
      Насколько этот вариант является жизнеспособным, сказать трудно. Даже если у вас в каждой комнате стоит по отдельному HomePod'у, то какой именно решит отозваться на вашу команду!?


      1. Goodkat
        14.03.2018 22:49

        Тот, который слышит меня громче, и должен отозваться.
        У меня практически всегда с собой телефон и/или часы. Нужно их как-нибудь локализовать.