Pull to refresh

«Алиса, включи свет». Голосовое управление умным домом на базе openHAB. Без программирования и СМС

Reading time 9 min
Views 102K

Ноябрь 2017 года, на календаре отображалось число одиннадцать. Распродажа на Aliexpress шла полным ходом, руки чесались что-нибудь купить. Выбор пал на "Ми-свет RGBW светодиодный лампы AC86-265V удаленного управление Smart освещения". В итоге были приобретены два экземпляра максимальной мощности, на 9 ватт, и хаб-контроллер MiLight WiFi iBox. Доставка из Китая не заставила себя долго ждать, а спустя 4 месяца, 13 марта 2018, открылась платформа Яндекс.Диалоги (платформа, позволяющая сторонним разработчикам добавлять умения голосовому помощнику «Алиса»). Следом Алиса научится управлять освещением (и не только) у вас в квартире, а мы с вами ей в этом поможем, поэтапно и без единой строчки кода.

  1. Настройка умных ламп от Xiaomi
  2. Установка openHAB
  3. Управление светом через openHAB
  4. Внешний доступ к openHAB
  5. IFTTT
  6. Алиса


1. Настройка умных ламп от Xiaomi.


Первое, что необходимо сделать, это настроить управление лампами, хотя бы с помощью приложения от Xiaomi. Если для вас этот этап пройден, смело переходите далее, к настройке сервера умного дома, или еще дальше, непосредственно к интеграции Алисы и openHAB. Но, обо всем по порядку. Сами лампы к вашему домашнему роутеру не подключатся, для этого нужен хаб iBox, который может контролировать до четырех групп источников света. Необходимо подключить его к сети, а затем связать с ним лампы.

  1. Подаем питание на iBox, подключив его по usb, к примеру, к зарядному устройству для телефона.
  2. При первом подключении необходимо сбросить настройки хаба, поэтому нажимаем RST.
  3. Далее устанавливаем на телефон приложение от Xiaomi под iOS или Android. Убеждаемся что телефон подключен к домашней сети Wi-Fi.
  4. Открываем приложение Mi-Light 3.0, нажимаем +. Тут нас интересует вкладка Smart Link.
  5. Вводим названием и пароль домашней Wi-Fi сети, к которой подключен телефон и планируется подключить iBox.
  6. Сейчас у вас iBox должен быть подключен к сети, а индикаторы SYS и LINK должны моргать, медленно и быстро соответственно. Если это не так, нажмите RST еще раз.
  7. Если индикаторы мигают, нажмите в приложении Start Configuration, начнется процесс настройки подключения для хаба.
  8. Через секунд десять мигание прекратится, затем SYS снова начнет медленно моргать, а LINK останется гореть. В приложении отобразится сообщение Configured. Хаб подключен к сети. Если в списке Device List его нет, то просто нажмите Searching for device.

Уже сейчас можно поуправлять цветом и яркостью самого iBox, но нам необходимо подключить лампы. Для этого выполним привязку ламп к одной из четырех зон, доступных хабу для управления.

  1. Открываем в приложении Mi-Light 3.0 из списка хаб Mi-Light. Заходим в раздел Colors.
  2. В верхней части экрана выбираем одну из зон, пусть будет Zone1. И нажимаем на иконку связывания устройств в правом верхнем углу. Откроется экран LINK/UNLINK с инструкцией.
  3. Теперь настраиваем те лампы, которые мы хотим привязать к Zone1, управление ими в дальнейшем будет происходить синхронно. Для управления яркостью и цветом каждой лампы в отдельности, их надо отнести к отдельным зонам. Итак, включаем лампу, и в течение первых трех секунд нажимаем в приложении Link. Если лампа моргнула три раза, то все отлично, синхронизация прошла успешно. Можно управлять лампой.


В принципе, на данном этапе у вас уже есть пульт для удаленного управления светом. Более того, вы можете написать свою систему управления освещением, благо протокол общения с хабом давно известен (когда-то он был доступен по ссылке limitlessled.com/dev). Есть готовые библиотеки на php, javascript, python. Но управление это возможно только из локальной сети, чего для Алисы явно не достаточно. Попробуем решить данную проблему.


2. Установка openHAB


Кратко, что такое openHab. Это сервер для управления умным домом с открытым исходным кодом. Разрабатывается сообществом, поддерживает управление огромным количеством устройств. Есть мобильный клиент, есть возможность управления Алексой от Amazon и ассистентом от Google. Написан на java, на базе фреймворка Eclipse SmartHome. А значит его можно установить хоть на холодильник, главное чтобы на этом холодильнике работала виртуальная машина Java. Инструкции по установке есть для Linux, Windows, Mac OS, Raspberry Pi, для различных сетевых хранилищ Synology и QNAP. Быстро пробежимся по первому варианту.

  1. Добавляем ключи репозитория:

    wget -qO - 'https://bintray.com/user/downloadSubjectPublicKey?username=openhab' | sudo apt-key add -
    sudo apt-get install apt-transport-https
  2. Добавляем сам репозиторий:

    echo 'deb https://dl.bintray.com/openhab/apt-repo2 stable main' | sudo tee /etc/apt/sources.list.d/openhab2.list
  3. Обновляемся и ставим сервер вместе с дополнениями:

    sudo apt-get update
    sudo apt-get install openhab2
    sudo apt-get install openhab2-addons
    sudo apt-get install openhab2-addons-legacy
  4. Настраиваем автоматический запуск сервиса после перезагрузки устройства и запускаем его:

    sudo systemctl start openhab2.service
    sudo systemctl status openhab2.service
    sudo systemctl daemon-reload
    sudo systemctl enable openhab2.service
  5. Теперь ждем в районе 15-20 минут (это не преувеличение, это суровая реальность с шутками про скорость работы Java), пока он загрузится и по адресу http://openhab-device:8080 появится веб интерфейс.
  6. На этой странице нас интересует пункт Paper UI. Именно с этим типом интерфейса будем работать в дальнейшем.




3. Управление светом через openHAB


Итак, у нас есть рабочий сервер умного дома и лампы от Xiaomi с возможностью удаленного управления. Необходимо их соединить. openHAB поддерживает биндинги (инструкции, позволяющие управлять подключенной электроникой) для множества устройств, в том числе и для данных ламп.

  1. Заходим в Add-onBindings.
  2. Устанавливаем Milight Binding.
  3. Для добавления нашего устройства нажимаем на + в разделе ConfigurationThings.
  4. Выбираем Milight Binding, начинается автоматический поиск устройства.
  5. У меня автоматически ничего не нашлось, поэтому я добавлял вручную "Manually add thing".
  6. Выбираем для добавления хаб iBox/iBox2.
  7. На открывшейся странице необходимо заполнить поля IP и Bridge ID (mac адрес подключаемого устройства), их можно узнать, к примеру, в панели управления роутером (у меня хаб регистрируется в сети с именем используемого в нем Wi-Fi модуля HF-LPB100). Добавляем.
  8. Отлично, в списке устройств теперь отображается iBox/iBox2 с надписью "Online".
  9. Снова нажимаем на + и выбираем Milight Binding, чтобы на этот раз добавить непосредственно лампы.
  10. Теперь руками добавлять ничего не нужно, достаточно выбрать группу ламп из списка (в моем случае это пункт Rgbww Color (Zone 1)).
  11. Выбранный пункт должен появиться в списке вещей так же с надписью "Online".

  12. Устройства настроены, теперь необходимо добавить к ним элементы управления. Для этого кликаем по только что добавленному пункту.
  13. Открывается список параметров лампы, которыми мы можем удаленно управлять. Кликаем по синему кругу Brightness.
  14. Далее выбираем элемент управления, с которым хотим связать параметр устройства, т.к. у нас их еще нет, кликаем по Create new item.
  15. Задаем произвольное имя, к примеру Light_Switcher, и, меняем тип с Dimmer на Switch, т.к. у меня нет необходимости регулировать яркость лампы, я хочу ее просто включать и выключать. Меняем категорию просто на Light, чтобы элемент управления отобразился с иконкой в разделе Control. Нажимаем Link.
  16. Переходим в раздел Control и наслаждаемся работой переключателя Brightness у устройства.



4. Внешний доступ к openHAB


По соображениям безопасности, после описанных выше манипуляций, управление сервером умного дома возможно только из локальной сети. Этого для нашей задачи явно не достаточно. Вариантов настройки несколько: настроить VPN для доступа из интернета к локальной сети, сконфигурировать реверсивную прокси или же соединить ваш сервер с сервисом myopenHAB Cloud по адресу myopenHAB.org. Так-как в России число сотрудников Роскомнадзора прямо пропорционально числу пользователей VPN и прокси-серверов, воспользуемся последним вариантом.
Не следует множить сущее без необходимости

  1. Регистрируемся на сайте myopenHAB, авторизуемся и заходим по адресу https://myopenhab.org/account. На данной странице нас интересуют два поля: openHAB UUID и openHAB Secret. Именно они позволяют организовать связь серверов. Давайте разберемся где их взять.
  2. Заходим в панель управления PaperUI openHAB.
  3. Открываем раздел ConfigurationAdd-onsMisc.
  4. Устанавливаем openHAB Cloud Connector.
  5. В ConfigurationServices должен появиться модуль openHAB Cloud с режимом "Notifications & Remote Access".
  6. В ConfigurationSystemAdd-on Management должен быть активирован переключатель "Acceess Remote Repository".
  7. После установки аддона, искомые нами данные окажутся в файлах /var/lib/openhab2/uuid и /var/lib/openhab2/openhabcloud/secret (userdata/uuid и userdata/openhabcloud/secret, если ставили не из пакета). Вводим их в настройках аккаунта на myopenHAB и жмем Update. Если все настроенно корректно, то слева от адреса вашей почты должно появиться слово "Online". Это говорит о том, что доступ к вашему умному дому из сети интернет открыт, но сразу Алиса им воспользоваться не сможет. Для начала надо сделать доступным снаружи настроенное ранее устройство.
  8. Переходим в раздел ConfigurationServicesopenHAB CloudConfigure.
  9. В списке Items to expose to apps such as IFTTT активируем чекбокс для элемента управления яркостью и нажимаем Save.
  10. Через некоторое время проверяем, что выбранный элемент присутствует в списке на странице myopenhab.org/items со статусом "ON".



Теперь управление лампой возможно из интернета, через API openHAB Cloud, которое поддерживает авторизацию по OAuth2. Но, к сожалению, клиенты заранее предопределены, это Alexa, Google Assistant и сервис IFTTT. Алисы в данном списке пока нет. Но это не проблема!


5. IFTTT


Если это тогда то.

Сервис, позволяющий выстроить из нескольких сервисов цепочку действий. Условно отреагировать действием в одном сервисе, если сработал триггер на событие в другом сервисе. IFTTT поддерживает огромное количество сервисов, в том числе и интересующий нас myopenHAB. Но не поддерживает Алису. Вообще, любой желающий может создать там модуль для своего сервиса, в первую очередь для этого надо связаться с отделом продаж и выяснить размер вашего ежегодного платежа в пользу IFTTT. Наша же цель бесплатно воспользоваться сервисом, чтобы иметь возможность перенаправлять запросы от Алисы к openHAB.

  1. Регистрируемся на сайте ifttt.com и заходим в AppletsNew Applet.
  2. После нажатия + this, необходимо выбрать сервис, событие в котором будет являться триггером. Т.к. сервиса Алисы в списке нет, нам надо выбрать что-то, что сможет получать от нее команды. Это сервис Webhooks. Нажимаем Connect.
  3. Далее выбираем из списка с одним пунктом триггер "получение web запроса".
  4. Указываем имя события, к примеру light_on, и жмем Create.
  5. Теперь надо выбрать ответное действие, нажимаем на + that. Наш выбор openHAB, подключаем.
  6. В открывшемся окне, упомянутой ранее OAuth2 авторизации, кликаем по Allow.
  7. Доступна единственная реакция "отправить команду".
  8. Из выпадающего списка выбираем элемент управления лампой (например Light_Switcher), а в качестве команды включения света указываем слово "ON". Создаем.

Для проверки нам необходимо вызвать триггер у сервиса Webhooks. Как это сделать? Отправить POST запрос.

  1. Ищем на сайте IFTTT сервис Webhooks и заходим в связанную с ним документацию.
  2. На открывшейся странице есть команда, которую нам надо выполнить, заменив {event} на light_on.
  3. После нажатия на Test It, ваша лампа должна включиться.

Осталось создать аналогичный рецепт для события light_off, который будет отправлять команду OFF элементу управления светом. А затем научить Алису вызывать эти триггеры по нашему желанию.




6. Алиса


По моему веленью, по моему хотенью Алиса включит свет, если использовать платформу Яндекс.Диалоги. Платформа открылась в марте этого года и позволяет любому желающему добавить Алисе умений, за счет написания соответствующего кода. На данный момент в каталоге уже представлено огромное количество умений. Разработка умения, это тема для отдельной статьи на хабре, а у нас тут "без единой строчки кода". Так что воспользуемся имеющимися наработками.

  1. Устанавливаем бета версию поискового приложения Яндекс, только в нем на данный момент есть поддержка пользовательских умений.
  2. Говорим Алисе "включи волшебные заклинания". Именно умение волшебные заклинания/волшебное заклинание позволит нам выполнять POST запросы к серверам IFTTT.
  3. Нажимаем Добавить и указываем адрес для включения света вида:

    https://maker.ifttt.com/trigger/light_on/with/key/{user_id}
  4. Следующим шагом произносим фразу или слово, на которое Алиса будет реагировать выполнением запроса по указанному адресу (моя Алиса отвечает на «включи свет»).

Если вы теперь нажмете на соответствующую кнопку или озвучите предложение, то запрос от серверов Яндекса поступит на сервер умения, оттуда в IFTTT, следом в myopenHAB, который передаст данные в ваш локальный инстанс, имеющий непосредственный доступ к хабу ламп, и свет включится. Аналогичную команду сразу добавим и для выключения освещения.


Надо понимать, что недостаточно просто включить Алису и произнести "включи свет". Яндекс ничего не знает о наших командах для умного дома, данные о них хранятся в базе умения "волшебные заклинания". Поэтому сначала нужно вызвать умение, произнеся "включи волшебные заклинания", а уже потом включать и выключать свет голосом.

P.S.


Подход с интеграцией Алисы и openHAB через IFTTT ни чем не ограничивает вашу фантазию. Вы можете с помощью умения "волшебные заклинания" голосом управлять любыми вещами в вашем умном доме. К примеру, в openHAB есть биндинг для Samsung SmartTV, который позволяет управлять звуком и каналами телевизора. Взаимодействие Алисы и Webhooks представляет из себя реализацию голосового интерфейса ко всем сервисам IFTTT, "волшебные заклинания" позволяют выполнить команду любого из них. А можете вообще не использовать Алису, и написать свой фронтэнд, к примеру мобильное приложение, которое будет выполнять запросы к IFTTT через все те же Webhooks. Да и IFTTT использовать не обязательно, по аналогии можно настроить "волшебные заклинания" на выполнение запросов к вашему серверу.
Tags:
Hubs:
+27
Comments 27
Comments Comments 27

Articles