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


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

    e-Legion
    108,00
    Лидер мобильной разработки в России
    Поделиться публикацией

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

      0
      крутая статья, спасибо!)
      ждем сие для кондиционера + умных розеток, куда втыкается утюг, например.
        0
        Спасибо! Когда появятся другие интересные устройства или получится реализовать интересный функционал, обязательно напишу новый материал.
          0
          Спасибо за статью! Сейчас пытаюсь подружить с Siri свою Orvibo S20…
          Напоминает ситуацию с установкой Heroes of Might and Magic после статьи о них :)
            0
            Плагин для homebridge есть. Как настроите, напишите, либо если будут вопросы, готов помочь :)
              +1
              Плагин установился только с --unsafe-perm…
              Заработало с настройками из config-sample.json, пришлось чуток подождать сначала пока подключит и настроит розетку
                0
                Круто! А на каком железе/OS запускали?
                  +1
                  На обычном домашнем компе под управлением Ubuntu Server 16.04.4 kernel 4.13.0-36-generic
        0
        Спасибо. Забавно… походу скоро задумаюсь о подобном… :)
          0
          Круто! Если будут вопросы, пишите :)
          0
          Посмотрел бегло статью, непойму, почему вы не воспользовались плагином от разработчиков Yeelight?
          npm install -g homebridge-yeelight
          Он подхватывает все их лампы автоматом, без настройки конфигов и танцев с бубном.
            0
            Первая попытка подключения выполнялась с использованием homebridge-yeelight С WiFi лампой никаких проблем не возникло, но по Bluetooth так и не удалось организовать работу устройства.

            К тому же настройки других плагинов ничем практически не будет отличаться от того, что описано в статье. В любом случае придется устанавливать homebridge и библиотеки для работы со стеком BLE.
              +1
              Не знаю, чем не угодило подключение через wifi, но ладно :)
              Спасибо за ответ!
                0
                У Xiaomi Yeelight Bedside Lamp (первого поколения) отсутствует WiFi-модуль, то есть можно только через BLE подключиться. Второе поколение этой лампы обзавелось поддержкой WiFi :)
                  0
                  Теперь понял, вышло недоразумение из-за фотографии Mijia-лампы =)
                    0
                    Не обратил внимание, что фотография от более продвинутой версии, на сайте Yeelight про первое поколение уже забыли :(
            0
            Настроил похожее у себя, но поставил на raspberry domoticz, а к нему уже homebridge. И все было бы круто, если бы карты памяти в raspberry жили бы дольше двух-трех недель. Вы не сталкивались с такой проблемой?
              0
              В статье я написал о том, что первая карта у меня вышла из строя примерно через 2 недели. Я предположил, что карта бракованная.
              Вторая карточка работает в устройстве 3 недели и пока, что все хорошо, если и она перестанет функционировать в ближайшее время, нужно будет смотреть уже в сторону Raspberry Pi.

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

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

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

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


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

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое