Как сделать умный дом своими руками на Arduino и Яндекс.Алиса — пошаговая инструкция
Уже больше года Яндекс развивает систему управления умным домом через Алису. Благодаря ей вы сможете включать свет, переключать каналы телевизора, заваривать кофе, изменять цвет подсветки, будить умные пылесосы и контролировать температуру в помещении.
Чтобы создать такую продвинутую экосистему умных устройств, совсем не обязательно штурмовать магазины электроники. Яндекс предоставляет API для интеграции ваших собственных решений через платформу навыков.
В этой статье расскажем, как с помощью микроконтроллера и обычного реле сделать умную лампочку и управлять ей с помощью Алисы.
Как работает такой умный дом?
Чтобы создать умный дом своими руками, потребуется навык Домовёнок Кузя. Через него можно не только контролировать умный дом, но и интегрировать виртуальные устройства напрямую в Яндекс.Алису. Это значит, что вам не придётся постоянно открывать навык, чтобы просто выключить лампочку. С микроконтроллером навык будет связываться через веб-хуки.
Для веб-хуков отлично подходит платформа Blynk — панель управления устройствами на Arduino и Raspberry Pi. Там вы сможете без труда создать графический интерфейс, через который можно будет управлять устройством по Wi-Fi (а ещё по Ethernet, USB, GSM и Bluetooth).
Какие устройства можно интегрировать в умный дом?
Через навык можно взаимодействовать с обширным количеством устройств: лампочки, розетки, шторы, замки, роботы-пылесосы, термостаты, очистители воздуха, кондиционеры и чайники. Кроме этого, можно переключать каналы на телевизоре (через универсальный пульт) и менять цвета RGB-ламп.
Все устройства имеют базовую пару функций: включение и выключение (открытие и закрытие для штор и замков). Некоторые из устройств могут работать с диапазоном значений (яркость лампы, температура поддержки тепла для чайника).
Аппаратная и программная часть
Для того, чтобы собрать умный дом своими руками, мы будет использовать Wi-Fi модуль ESP8266. Процесс разработки на нём почти не отличается от традиционной разработки на Arduino.
Для начала нужно скачать приложение Blynk из GooglePlay или AppStore и зарегистрироваться в нём. После этого нужно создать новый проект и выбрать соответствующий микроконтроллер. Перед вами появится пустая панель, на которой можно размещать элементы управления. Это могут быть кнопки, иконки, слайдеры, индикаторы, выпадающие списки и многое другое.
После создания проекта на вашу почту придёт токен доступа. Его нужно будет указать в скетче и веб-хуках.
К элементам управления можно подвязать физический пин микроконтроллера или же виртуальный порт. При взаимодействии с каким-либо элементом, его новое значение будет сразу отправляться на микроконтроллер.
Примечание Виртуальные порты в Blynk можно представить как переменные, которые синхронизируются между устройством и сервером.
На этом сайте можно найти много примеров кода для Blynk под разные платформы микроконтроллеров. Ниже приведён скетч, который будет управлять пином. Тот, в свою очередь, будет управлять реле, к которому будет подключена лампа:
Для этого скетча в панели управления Blynk нужно добавить элемент «Button». В его настройках OUTPUT выставить V0, а режим работы переключить в Switch.
Теперь к указанному порту можно подключать реле. Если всё правильно, то при нажатии на кнопку в панели управления реле будет открываться и закрываться.
Голосовое управление светом не мешает управлению им аппаратно. К микроконтроллеру можно подключить физическую кнопку или выключатель, которые тоже будут включать и выключать свет. Если это необходимо, то изменять состояние виртуального порта можно методом Blynk.virtualWrite(port, value) . Тогда изменения будут отображаться и на панели управления.
Примечание При работе с механическими кнопками и выключателями не забывайте про дребезг контактов.
Всё работает? Тогда можете переходить к следующему этапу.
Получение веб-хуков
От Blynk вам потребуется не панель управления, а контроль виртуальных портов через GET-запросы. Вот так выглядит веб-хук на изменение состояния порта:
Чтобы включить виртуальный порт, нужно указать как 1, чтобы выключить — как 0.
Помимо этого, значение с порта можно получить таким запросом:
Настройка навыка «Домовёнок Кузя»
Перейдите на сайт навыка и авторизуйтесь там через Яндекс. Далее жмите на Добавить правило HTTP (GET). Перед вами откроется форма настройки правила.
Активационная фраза — название запроса, которое будет отображаться в списке (например «свет на кухне, включение»). Если вы не планируете контролировать умный дом конкретно изнутри навыка, то больше фраза нигде не понадобится. Поле Ответ Кузи тоже оставляйте пустым. В поле URL вставляете соответствующий веб-хук на включение света (виртуального порта). Остальные параметры можно не изменять. После этого нужно сделать идентичное правило на выключение света.
Пример настройки правила на включение света
Дальше нужно перейти во вкладку виртуальных устройств и добавить устройство «Лампа». Тут нужно дать название устройству, по которому его будет идентифицировать Алиса. Например: свет, бра, подсветка, лампа или торшер. Место расположения — комната, в которой будет установлено устройство. Это нужно на тот случай, если в нескольких комнатах будут одинаковые по названию элементы. К тому же, одной голосовой командой можно включать и выключать все устройства в определённой комнате.
В Правило на включение/выключение из списка выбираете соответствующие запросы. В лампе имеется возможность управления яркостью. Для этого нужно создать ещё одно правило, но значение параметра value установить как
Пример настройки виртуального устройства
Примечание Если вы планируете изменять яркость, то параметр value в веб-хуке на включение нужно изменить с 1 на 100.
EcoWatch: telegram + esp8266 = навык для Алисы
В связке метеостанции и telegram нет ничего нового, всё таки этот способ легко покрывает нужды переброски данных в сеть для быстрого к ним доступа. Моё же творение было вдохновлено идеей быстрого создания устройства, привязанного к Яндекс колонке, но под конец вылилась в минималистичные настольные часы-метеостанцию и относительно универсальный способ подключения к Алисе DIY IOT устройств без баз данных, только на контроллере и telegram API.
Перед началом необходимо упомянуть, что этот способ не подходит для устройств, релевантные данные с которых нужно получать с задержкой 0.5 секунды или меньше, для этого более подходящим решением будет использование Blynk или хостингом на внешнем сервере (например так), в общем данную статью стоит рассматривать как экспериментальный опыт разработки навыков Алисы для электронных самоделок.
Имеется: Яндекс.Станция Мини, ESP8266, датчик PM2.5 и PM10 sds011, датчик CO2 MH-Z19B (или MH-Z14A, тестировалось с обеими моделями) и модуль BME280.
Желаемый результат: метеостанция, данные которой можно получить через telegram и запросить их через Алису.
Архитектура решения
Всю архитектуру решения можно разделить на 2 раздела: решение на железе и навык Алисы.
Создание устройства
В качестве подопытного мной был разработан мини-проект EcoWatch — настольные часы-метеостанция. Управление и вывод данных производятся при помощи одной сенсорной кнопки и сегментного дисплея на чипе TM1637.
Корпус был спроектирован в Autodesk Inventor и состоит из 3 частей: основа (нижняя часть + стенки), перегородка и крышка. Датчик PM2.5 и PM10 занимает дно корпуса, к нему же ставится BME280 (для уменьшения влияния нагрева от ESP), далее вставляется перегородка, на которой закрепляются уже ESP и датчик CO2.
Кнопка находится в углублении на внутренней стороне стенки, а дисплей прямо над ней.
Файлы для печати можно найти тут.
Для удобства подключения ESP была взята уже на готовом модуле NodeMCU, питание организовано от контакта VIN на контроллере (5V с USB, прошедшее через диод шоттки), но это было сделано ввиду невысокого уровня потребления модулей, правильнее будет подключать к пину VU.
Если использовать другие датчики, то нужно смотреть, что ESP сможет запуститься с ними — некоторые пины требуют определённого уровня сигнала на старте.
Код был написан в VS Code, используя фреймворк Platformio: ссылка на GitHub.
Для заполнения пропусков под себя потребуется сначала создать бота https://tlgrm.ru/docs/bots#botfather
Теперь необходимо создать группу, в которую будет входить наш бот и любой из ботов, позволяющий узнать chat_id группы. Лично мой выбор пал на @myidbot, которому нужно адресовать команду /getgroupid@myidbot, но перед выполнением команды необходимо назначить нашего созданного бота администратором группы.
Для того, чтобы не видеть периодические уведомления от группы можно переместить его в архив, предварительно выключив уведомления и скрыть сам архив из списка чатов.
Через бота @username_to_id_bot узнаём id всех людей, кому будет предоставлен доступ к боту и не забываем узнать свой собственный id.
Все необходимые данные собраны, надо подставлять их в код:
Код рассчитан на 3х пользователей, но их количество не ограничено, главное не забыть добавить соответствующие ячейки массива к обработчику сообщений
В качестве последнего аргумента функции bot.setChatTitle() вставляем id группы, в которую мы включили бота
Итого: имеем функционирующую метеостанцию-часы и бота, через которого можно узнать данные с неё.
Настройка сервисов Яндекса
Для более глубокого понимания процесса можно изучить доки и статьи, посвящённые данному процессу в общих чертах. Ну а если не вдаваться в подробности, то настройка производится в 3 шага: создание скрипта в облаке, создание своего навыка для Алисы и прописывание сценариев для своих устройств (в данном случае умной колонки).
Шаг 1:
Заходим на платформу https://console.cloud.yandex.ru и регистрируемся там (вносим платёжные данные (хост функций, которые будут использоваться для навыков Алисы, бесплатен)), заходим во вкладку cloud functions
Жмём Создать функцию, задаём ей имя и выбираем опции как на скриншоте
В корне функции создаём дополнительный файл requirements.txt, в который записываем: pytelegrambotapi == 4.6.0
А код в py файле меняем на такой:
Не забывая записать токен бота и вставить id группы(где сидит бот) в функцию bot.get_chat(xxxxxxxxxxx).title
Для проверки, что всё работает можно перейти во вкладку навыка Тестирование:
После запуска теста в разделе результата можно будет увидеть что-то подобное:
В случае возникновения ошибок
2 основных сценария возникновения ошибок:
Бот на устройстве не был запущен правильно. Значит и название чата не пришло в вид, что программа ожидает на вход. Решается, соответственно проверкой, что само устройство работает и название чата меняется соответственно с показаниями датчиков
Код метеостанции (ответственный за отправку данных)/состав датчиков был изменён. В таком случае нужно убедиться, что строка, которая собирается на esp в аргументе функции bot.setChatTitle() не будет вызывать ошибок при разбивании её на части функцией в облаке. Крайне рекомендую в данном случае тестировать код функции без обработки строки, то есть оставить только text = bot.get_chat(xxxxxxxxxxx).title , а остальные действия закомментировать/удалить.
В случае, если это проблемы не решило, то следует отталкиваться от того факта, что написанный код обработки и отправки данных на обеих сторонах не является гибким и нуждается в перепроверке перед запуском.
Шаг 2:
Перейдите на платформу Яндекс.Диалоги и создайте новый диалог
Тип диалога — Навык в Алисе:
Заполняем все обязательные поля навыка, выбирая тип доступа Приватный в целях безопасности:
В разделе Backend выбираем пункт Функция в Яндекс.Облаке и в списке находим нашу функцию:
Жмём снизу большую кнопку Сохранить и затем публикуем навык. Публикация занимает некоторое время. Когда статус меняется на «Диалог опубликован» — можно дополнительно протестировать работу навыка (вкладка Тестирование):
Шаг 3:
Осталось только разработать сценарии для Алисы — здесь уже можно кастомизировать по полной, так что дальнейшее описание можно расценивать как базовый пример функционала.
Заходим на сервис Устройства через мобильный браузер Яндекса и создаём навык (для начала — общий запрос, где мы получаем все данные за раз):
Структура запроса состоит из 2 частей: вызов навыка и команда навыку:
Скажи «название навыка» «команда»
В случае, использования кода без изменения, команд всего 6:
«3» — данные с датчика CO2;
«4» — Данные с датчика частиц;
Любой другой запрос — все данные.
Например, запрос для получения влажности будет выглядеть как: Скажи Eco get 1.
Итого: получаем апгрейд функционала умной колонки, опыт интеграции устройств в экосистему умного дома Яндекса и метеостанцию-часы, которые неплохо вписались бы в фильмы серии Звёздных войн.
Демонстрация работы:
Бот в telegram и прямое обращение к навыку через Алису:
Демонстрация работы устройства в сборке:
Заключение
Данный проект был моим первым опытом как в создании tg ботов, использования платформы Yandex.Cloud, так и в принципе работы с ESP8266, выполняющим функцию контроллера, так что я полностью открыт к предложениям относительно проекта и конструктивной критике решения.
После завершения ещё нескольких проектов с большой вероятностью возьмусь за полноценное решение для умного дома в качестве пет проекта, а также добавлю сюда автоматическое выполнение большинства действий по первоначальной настройке telegram и сервисов Яндекса, так что скорее всего данная тема в будущем продолжится в моих статьях и будет содержать изобретение новых моделей велосипедов, которые едут только за счёт костылей, так что не переключайтесь.