Использование Yandex Cloud Functions для управления кнопкой с помощью модуля на базе ESP8266 на примере Wemos D1 Lite.

Есть несколько способов достигнуть результата управления кнопкой:

  • Blynk - сервис украинского разработчика;

  • IOpp.io - сервис для управления ESP-устройствами, умным домом;

  • навык Домовенок Кузя;

  • Home Assistant;

  • купить брендированную(Tuya, Yandex, Сбер и т.п.) кнопку;

  • Node-RED - построение действий через кубики - no code решение;

  • ESPHome - для программирования контроллеров;

  • Tasmota - относительно простое решение на MQTT.

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

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

Для решения этой задачи было выбрано облако Яндекса.

Потребуется

  • аккаунт Yandex Cloud

  • vscode + PlatformIO для написания прошивки устройства

  • ESP8266 Wemos D1 Lite(или аналогичная плата на этом чипе) для управления кнопкой(для простоты)

  • аккаунт github для хранения разрабатываемой функции и записи ее в облако

  • PyTorch или другая среда разработки для написания кода функции

  • банковская карта, чтобы привязать её к аккаунту Yandex Cloud

Расходы

Само по себе использование функций для Алисы бесплатно, но хранение секретов требует платы в размере примерно 90 копеек в день. Эти секреты можно переиспользовать между устройствами.

Скрин расходов

Настройки на стороне Яндекса Облака

Потребуется создать и настроить

  • платежный аккаунт для возможности создавать ресурсы

  • сервисный аккаунт для создания функции

  • федеративный аккаунт для CI/CD с гитхаба

  • сервисный аккаунт для использования внутри функции

  • хранилище секретов

  • реестр устройств и сами устройства

Ниже приложу скиншоты из панели управления Яндекс Облака

Реестр для устройств

Устройства в реестре

Первое устройство непосредственно выполняет действие. Второе устройство выступает в качестве тестовой платформы, так как имеет подпаянные контакты.

Команда для создания сертификатов устройства

openssl req -x509 \
  -newkey rsa:4096 \
  -keyout private-key.pem \
  -out cert.pem \
  -nodes \
  -days 365 \
  -subj '/CN=localhost'

Секреты

Секреты для функций поддерживают только текстовые поля. Файлы не поддерживаются. Инструкция по секретам для функций. Если хотите использовать бинарные данные в секретах, то сначала их нужно закодировать в base64. В интернете пишут, что сделать это можно способами ниже.

MacOS

base64 -i file.txt | tr -d '\n' > output.b64

Linux

base64 file.txt > output.b64

Windows

certutil -encode inputfile output.b64

Секреты внутри, с подключенным шифрованием

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

Окно добавление версий в секреты

Вкладка сервисных аккаунтов

Здесь особое внимание стоит уделить ролям, присвоенным аккаунтам.

Роли для github аккаунта - github-functions-admin-sa-user-first:

  • functions.admin - создание/обновление функции

  • iam.serviceAccounts.user - добавление сервисного аккаунта в функцию

  • logging.editor - управление логированием внутри функции

  • vpc.user - управление сетью внутри функции

Роли для сервисного аккаунта внутри функции - service-account-functions-admin-first:

  • iot.devices.writer - чтение/запись в топики устройств

  • lockbox.payloadViewer - доступ к пейлоаду секретов

  • kms.keys.encrypterDecrypter - доступ к шифрованию/расшифровке с использованием ключей

  • iot.registries.writer - чтение/запись в топики реестров

Service account federation для GitHub аккаунта

Первая строчка для сборки при ПР - workflow ci.yml и ct.yml. Вторая строчка предназначена для сборки при коммите в main - workflow cd.yml

repo:fresh-fx59/yc-function-smart-home-for-yandex-dialogs:environment:preprod
repo:fresh-fx59/yc-function-smart-home-for-yandex-dialogs:ref:refs/heads/main

fresh-fx59/yc-function-smart-home-for-yandex-dialogs замените на адрес своего репозитория

Федеративный аккаунт

Issuer value https://token.actions.githubusercontent.com
Acceptable Audience values (AUD) https://github.com/fresh-fx59
JWKS address https://token.actions.githubusercontent.com/.well-known/jwks

fresh-fx59 замените на имя своего github аккаунта

Overview функции

Яндекс диалоги

Яндекс Диалоги

  • войти/зарегистрироваться

  • создать новый диалог

  • настроить диалог

Настройки, часть 1

Настройки, часть 2

Настройки нужно заполнить, как показано на скриншотах, указав свои данные и функцию.

Account linking tab

Для получения необходимых данных создадим приложение в Яндекс ID [2]

Вкладка Testing

На вкладке testing отображаются реальные запросы, которые отправляет и получает умный дом от вашего устройства.

Donations tab

Если планируете делать свой навык публичным, то добавьте номер кошелька в ЮМани, чтобы получать пожертвования.

Access Tab

На вкладке Access Tab создайте ссылку на ваш навык, чтобы поделится. Актуально для приватных скилов.

Функция в Яндекс Облаке и GitHub

Для того, чтобы код функции можно было удобно разрабатывать в привычном окружении, я настроил CI/CD процесс автоматизированной публикации кода функции в Яндекс Облако[1].

Передача секретов устроена так:

  • секрет добавляется в Lockbox в Яндекс Облаке

  • секрет прописывается в секретах GitHub Actions

  • секрет добавляется в функцию в процессе CI/CD

Отображение секрета в Яндекс Функции

Секреты передаваемые GitHub Actions на стадии CI/CD

Обращение к переменным окружения в коде функции

Значение переменной SECRETS может быть таким

<наименование переменной окружения>=<id секрета в lockbox>/<id версии секрета в lockbox>/<наименование секрета>
REGISTRY_PASSWORD=e6fff8777775ovuklj/e6qtttt5555555oc/registry-password-55u1

В моей реализации это многострочное поле.

Вкладка Actions GitHub

На вкладке Actions GitHub отображаются доступные воркфлоу и статус их работы. Workflow описанный в файле cd.yml запускается автоматически при пуше в ветку main. Он подставляет значения из секретов и загружает функцию в Яндекс Облако. Его можно запустить вручную, например, если мы изменили переменные окружения и хотим перезалить функцию.

Разработка функции велась в IDE PyTorch.

Разбор кода функции

Код Python-функции https://github.com/fresh-fx59/yc-function-smart-home-for-yandex-dialogs

В этом примере мы будем отправлять сигнал на пин D1 контроллера. Таким образом можно подать питание через резистор на светодиод, нажать кнопку на блоке питания или замкнуть любую цепь через оптопару. При этом цепи питания не будут зависеть друг от друга(гальванически развязаны).

Файлы функции для умного дома Яндекса

Функция отвечает на запросы:

  • список устройств - какими устройствами можно управлять

  • состояния устройств - какое состояние каждого устройства

  • выполнения действия - изменение состояние устройства

Список устройств передается жестко зашитым в код JSON.

Для получения состояния устройств отправляется POST запрос на отправку сообщения для устройств и происходит подписка на темы ответа. Если за отведенный интервал ответ не приходит, то устройство считается недоступным. Иначе передается его состояние.

Для управления устройством используется примерно та же техника. С той лишь разницей, что вначале мы отправляем запрос на перевод в состояния X и ждем результата его выполнения. Если не дожидаемся, то считаем, что устройство недоступно. Отправляем соответствующий ответ.

Прошивка контроллера

Прошивка контроллера написана на C++. Для разработки использовал VSCode и PlatformIO плагин.

GitHub iot-mqtt-yc-blinker

Схема подключения контроллера

Полезные ссылки

[1] - Настройка CI/CD GitHub Actions - https://yandex.cloud/ru/docs/tutorials/serverless/ci-cd-github-functions

[2] - получение секрета и id приложения для авторизации - https://oauth.yandex.ru/

Код функции на GitHub: https://github.com/fresh-fx59/yc-function-smart-home-for-yandex-dialogs

Передача секретов функции: https://yandex.cloud/en/docs/lockbox/operations/serverless/functions

API умного дома Yandex: https://yandex.ru/dev/dialogs/smart-home/doc/ru/

Описание API взаимодействия устройства и Яндекс Функции: https://yandex.ru/dev/dialogs/smart-home/doc/ru/reference/get-devices-jrpc

Статья о подключении самодельного устройства к умному дому Яндекса с Алисой: https://habr.com/ru/articles/882370/

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


  1. FlyingDutchman
    20.11.2025 08:33

    На самом деле, почти все перечисленные вами имплементации - вполне себе рабочие и надёжные решения. Напишите уж честно - что повыёживаться захотелось.

    Поставил плюсик за упорный (пусть и бесполезный, имхо) труд и подробное описание разработки.


    1. fresh_fx59 Автор
      20.11.2025 08:33

      Спасибо за комментарий и плюсик.

      Честно написал причину выбора именно этой реализации во вступлении.

      Про упорный труд: у Яндекса очень много подробных и четких инструкций. Чтобы совместить их пришлось действительно упорно поработать. В процессе реализации выявлялись не очевидные для меня моменты. Например с перечнем ролей, которые нужно присвоить сервисным аккаунтам.


  1. peacemakerv
    20.11.2025 08:33

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


    1. fresh_fx59 Автор
      20.11.2025 08:33

      Спасибо, поправил. Если все же что-то упустил - напишите в личку.

      Когда я только начинал этот проект, то думал, что будет легче, быстрее и проще. Ожидания разбились о реальность. Но отступать было уже поздно)

      Зато сейчас доволен, как слон. Подключил еще одно устройство и не задумываюсь над безопасностью или выбором решения. Оно просто работает.


  1. ritorichesky_echpochmak
    20.11.2025 08:33

    Безопасный IoT с Алисой в одном предложении... ммм... они даже в одной стране не пересекаются. Зато Алиса отлично пересекается с глухими муднями, которые потом орут ей через всю квартиру, на весь дом и выкручивают ей точно так же громкость. В любое время дня и ночи. Но, главное, конечно, кошелёк привязать, остальное не важно...