Безопасный IoT с Алисой на ESP8266

в 5:23, , рубрики: c++, devops, home assistant, IoT, mqtt, python, Tuya, Yandex.Cloud, Интернет вещей, умный дом с алисой

Использование 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 копеек в день. Эти секреты можно переиспользовать между устройствами.

Безопасный IoT с Алисой на ESP8266 - 1

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

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

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

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

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

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

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

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

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

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

Безопасный IoT с Алисой на ESP8266 - 2

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

Безопасный IoT с Алисой на ESP8266 - 3

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

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

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

openssl req -x509 
  -newkey rsa:4096 
  -keyout private-key.pem 
  -out cert.pem 
  -nodes 
  -days 365 
  -subj '/CN=localhost'
Безопасный IoT с Алисой на ESP8266 - 4

Секреты

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

MacOS

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

Linux

base64 file.txt > output.b64

Windows

certutil -encode inputfile output.b64
Безопасный IoT с Алисой на ESP8266 - 5

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

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

Безопасный IoT с Алисой на ESP8266 - 6

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

Безопасный IoT с Алисой на ESP8266 - 7

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

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

Роли для 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 - чтение/запись в топики реестров

Безопасный IoT с Алисой на ESP8266 - 8

Sevice 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 замените на адрес своего репозитория

Безопасный IoT с Алисой на ESP8266 - 9

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

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 аккаунта

Безопасный IoT с Алисой на ESP8266 - 10

Overview функции

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

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

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

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

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

Безопасный IoT с Алисой на ESP8266 - 11

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

Безопасный IoT с Алисой на ESP8266 - 12

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

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

Безопасный IoT с Алисой на ESP8266 - 13

Account linking tab

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

Безопасный IoT с Алисой на ESP8266 - 14

Вкладка Testing

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

Безопасный IoT с Алисой на ESP8266 - 15

Donations tab

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

Безопасный IoT с Алисой на ESP8266 - 16

Access Tab

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

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

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

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

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

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

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

Безопасный IoT с Алисой на ESP8266 - 17

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

Безопасный IoT с Алисой на ESP8266 - 18

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

Безопасный IoT с Алисой на ESP8266 - 19

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

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

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

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

Безопасный IoT с Алисой на ESP8266 - 20

Вкладка Actions GitHub

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

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

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

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

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

Безопасный IoT с Алисой на ESP8266 - 21

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

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

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

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

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

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

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

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

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

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

GitHub iot-mqtt-yc-blinker

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

Безопасный IoT с Алисой на ESP8266 - 22

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

Передача секретов фукции

[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

API умного дома Yandex

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

Подключение самодельного устройства к умному дому Яндекса с Алисой - Habr

Автор: fresh_fx59

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js