Подключение самодельных устройств к умному дому Яндекса с Алисой. API.. API. arduino.. API. arduino. DIY.. API. arduino. DIY. DIY или Сделай сам.. API. arduino. DIY. DIY или Сделай сам. python.. API. arduino. DIY. DIY или Сделай сам. python. алиса.. API. arduino. DIY. DIY или Сделай сам. python. алиса. диалоги.. API. arduino. DIY. DIY или Сделай сам. python. алиса. диалоги. Интернет вещей.. API. arduino. DIY. DIY или Сделай сам. python. алиса. диалоги. Интернет вещей. Программирование микроконтроллеров.. API. arduino. DIY. DIY или Сделай сам. python. алиса. диалоги. Интернет вещей. Программирование микроконтроллеров. Разработка под Arduino.. API. arduino. DIY. DIY или Сделай сам. python. алиса. диалоги. Интернет вещей. Программирование микроконтроллеров. Разработка под Arduino. Умный дом.. API. arduino. DIY. DIY или Сделай сам. python. алиса. диалоги. Интернет вещей. Программирование микроконтроллеров. Разработка под Arduino. Умный дом. яндекс.
Подключение самодельных устройств к умному дому Яндекса с Алисой - 1

В этой статье мы разберёмся, как подключать самодельные устройства к умному дому Яндекс с Алисой (далее – УДЯ). В качестве такого самодельного устройства у нас выступит Wi-Fi-метеостанция на ESP8266, обладающая следующими возможностями:

  • вывод уровня углекислого газа, температуры и влажности с датчика Sensirion SCD-30

  • передача данных этих данных в УДЯ через наше облако по Wi-Fi

  • вывод курсов криптовалют на встроенный экран

Содержание статьи:

  1. Разработка аппаратной части устройства на ESP8266 / ESP32

  2. Написание прошивки устройства в среде Ардуино

  3. Создание сервиса в облаке на Python и Django для подключения устройства к УДЯ и хранения данных, выгрузки статистики

  4. Подключение нашего проекта к УДЯ через Яндекс.Диалоги, учим Алису Яндекса работать с нашим устройством

  5. Обсудим варианты доработок, подключение устройства к Home Assistant и т.д.

Вот что мы получим в результате:

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

Разработка аппаратной части устройства

Приступим к разработке самого устройства. Можно самому вытравить плату, припаять компоненты, распечатать на 3d-принтере корпус, но зачем, когда можно сильно сэкономить время и силы, взяв дешёвые готовые изделия, и “допилить” их под свои нужды? Именно таким решением в нашем случае и станут компактные Wi-Fi-метеостанции, которые можно купить на всем известном киитайском сайте и наших маркетплейсах по цене менее чем в тысячу рублей за штуку:

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

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

Есть две модификации этого устройства:

  1. SmallTV, на основе микроконтроллера ESP-12F и экрана диагональю 1.54″ и разрешением 240х240 (увы, не сенсорного) с контроллером ST7789V – она как раз и стоит менее чем тысячу рублей:

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

2. SmallTV-Pro с отображением курсов криптовалют, на основе микроконтроллера ESP32-wroom-32 с сенсорной кнопкой для переключения режимов отображения (экран такой же, на ST7789V) – стоит в два раза дороже:

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

Есть ещё Ultra версия на ESP8266, но там ничего интересного, рассматривать не будем.

Разработчиком предусмотрительно выведены контакты, которые понадобятся нам для заливки своей прошивки, вот распиновка:

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

Заодно приведу и распиновку экрана:

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

Выводы GND, 3V3, TXD0 и RXD0 подключаем к выводам usb-uart конвертера, например ch340. Для перевода esp8266 в режим программирования нужно подтянуть GPIO0 к земле, далее, не отпуская, подтянуть кратковременно RST к земле, далее GPIO0 можно отпустить. Чтобы микроконтроллер вышел из режима программирования, снова кратковременно притягиваем RST к земле, при этом не трогая GPIO0.

Можно не мучиться так каждый раз при заливки прошивки, а взять, к примеру, программатор CG-Programmer (на ch340g) – он умеет автоматически переводить esp8266/esp32 в режим программирования.

Ещё упрощает жизнь вот такой зажим с Алиэкспресса:

Подключение самодельных устройств к умному дому Яндекса с Алисой - 8
  • не нужно каждый раз вынимать плату из корпуса, нацеплять штырьки для подключения к конвертеру – просто зацепил зажим за плату, и можно перепрошивать. Очень удобно :) Но у меня он приехал с Алиэкспресса уже после того, как начал дорабатывать метеостанцию, поэтому мне пришлось запаять на плату контактную гребёнку.

Ещё иногда попадаются версии SmallTV, в которых нет штырьков для прошивки:

Подключение самодельных устройств к умному дому Яндекса с Алисой - 9
  • в таких версиях на плате уже распаян CH340, что даёт возможность программировать модуль через встроенный usb-c разъём, без необходимости подключения внешнего usb/uart-конвертера

В прошлом году в продаже также появилась версия устройства с ESP32-S3 N16R8 и ch340 на борту и открытым исходным кодом (правда, по весьма невкусной цене):

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

Подключение датчика углекислого газа, температуры и влажности Sensirion SCD-30

Отлично, с выбором аппаратной платформы разобрались, теперь встаёт вопрос – какие данные мы будем передавать на устройства Яндекса с Алисой? Метеостанция не оборудована датчиками, она просто получает данные с погодного сайта (а также загруженные в память устройства пользователем) и выводит на экран. Непорядок, поэтому установим свой датчик для передачи данных в УДЯ. :) Таким датчиком станет датчик углекислого газа Sensirion SCD-30:

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

Sensirion SCD-30 – это двухлучевой NDIR CO2-датчик, принцип работы которого очень прост – молекулы углекислого газа непрозрачны для ИК с длиной волны 4.26 микрон, в то время как остальная часть газов проходит через него без препятствий. Для компенсации самонагрева измерительной камеры на плату датчика запаян датчик SHT31, и благодаря нему мы с SCD30 помимо CO2 можем считывать ещё и температуру с влажностью.

Чем полезен такой датчик? Каждый человек выделает углекислый газ, и в замкнутом помещении его может скапливаться очень много. Вы можете не понимать причину снижения трудоспособности, почему болит голова и причину сонливости, а причина – как раз в CO2 и необходимости проветрить помещение.

Концентрация CO2 измеряется в ppm (“parts per million” – “частей на миллион”). Это значение показывает, сколько частей CO2 находится в 1 миллионе частей воздуха.  Вот таблица влияния CO2 на человека:

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

Датчик поддерживает целых три способа подключения – I2C, Modbus и PWM. Мы выберем для использования первый – I2C. На свободных пинах метеостанции I2C у меня не завёлся даже с внешними подтягивающими резисторами, поэтому пришлось использовать стандартные для I2C GPIO4 и GPIO5. А поскольку на GPIO5 “сидела” подсветка экрана, то пришлось сдуть оттуда резистор и припаять его к GPIO16.

Вот схема подключения Sensirion SCD30 к плате устройства:

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

Все отлично помещается в корпус метеостанции, SCD30 располагается вплотную к вентиляционным отверстиям в корпусе:

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

Далее остаётся только подключить usb/uart-конвертер для заливки нашей прошивки, которую мы напишем в следующем разделе нашей статьи. Если на борту платы уже имеется впаянный ch340 – задача упрощается, ничего подключать не нужно.

Подключаем для загрузки прошивки наше устройство к ПК на примере usb/uart-конвертера CH340G:

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

Как переводить ESP в режим программирования – я писал в начале статьи.

Подключение к CG-Programmer (переводит автоматически ESP в режим программирования):

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

Вот схема того, что получилось:

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

Написание прошивки для Ардуино для работы с Sensirion SCD30 и УДЯ, выводом курсов криптовалют на экран

С аппаратной частью разобрались, теперь напишем прошивку в среде Ардуино, реализующую следующую функциональность:

  • Получение уровня углекислого газа, температуры и влажности с датчика Sensirion SCD30

  • Получение курсов криптовалют на примере биткоина с coinbase.com

  • Получение данных о погоде с openweathermap.org

  • Синхронизация времени с pool.ntp.org

  • Отправки данных в УДЯ (умный дом Яндекса с Алисой) через наше облако

  • Отрисовка на экране данных с датчика и курса с использованием Adafruit ST7789

Скетч для загрузки в наше устройство можно скачать с моего гитхаба: https://github.com/tzirulnicov/smalltv_yandex Разберём его вкратце:

#define TFT_BL 16

#define TFT_DC 0

#define TFT_RST 2

#define TFT_CS -1

#define DISABLE_BACKLIGHT 1

#define ENABLE_BACKLIGHT 0

Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);

  • настраиваем библиотеку Adafruit ST7789, указывая, к каким контактам подключён экран, и определяем константы для включения/выключения экрана

const char* ssid = "WIFI_SSID";

const char* password = "WIFI_PASSWORD";

  • прописываем название Wi-Fi-сети, к которой подключаться, и пароль.Тут стоит помнить, что ESP работает с Wi-Fi только на 2.4ГГц. Если роутер раздает интернет на 5ГГц, то работать не будет. Если все равно не удается подключиться к роутеру – стоит поменять тип шифрования в его настройках.

static const char* ntpServerName = "pool.ntp.org";

const int timeZone = 3;

  • прописываем NTP-сервер для синхронизации времени и задаём часовой пояс. Для Москвы это UTC+3.

String api_key = "OPENWEATHER_API_KEY";

String latitude =  "55.785377";

String longitude = "37.475994";

String units = "metric";

String language = "ru";

OW_Weather ow;

Как и в оригинальной прошивке для метеостанций SmallTV, мы получаем текущую погоду с сервера openweathermap.org. Для использования его API нам необходимо зарегистрироваться на этом ресурсе и получить API-ключ, с которым наше устройство будет общаться с погодным сервисом. Бесплатный тарифный план предусматривает ограничения на количество запросов, с которыми можно ознакомиться здесь: https://openweathermap.org/price

Далее в переменных latitude и longitude мы задаём координаты места, для которого хотим получить погоду. В нашем случае это – Москва. Температуру мы хотим получать в цельсиях, поэтому указываем метрическую систему (units=”metric”). Погоду хотим получить на русском языке, поэтому переменной language присваиваем значение “ru”.

const char *bitcoinApiUrl = "https://api.coinbase.com/v2/prices/BTC-RUB/sell";

  • Наше устройство умеет отображать курсы криптовалют, используя API сервиса coinbase.com. Для примера на экран выводится курс продажи биткоина в рублях.

String serverName = "https://nonexistentdomain.ru/yandex_smarthome/sensors_data";

  • здесь мы указываем URL нашего сервиса, который мы напишем в следующем разделе нашей статьи. Поэтому адресу будут отправляться данные с датчика SCD30 и далее отправляться в УДЯ.

tft.setFont(&TimesNRCyr10pt8b);

  • наше устройство выводит всё на русском языке, что по умолчанию не поддерживается используемой нами графической библиотекой Adafruit GFX. Для решения этой проблемы взяты русские шрифты отсюда: https://github.com/immortalserg/AdafruitGFXRusFonts

Загрузка скетча в нашу метеостанцию

Для заливки скетча в устройство нам вначале необходимо скачать среду Ардуино с https://www.arduino.cc/en/software , установить драйвер используемого usb/uart-конвертера (если автоматом не подтянулся).

Запускаем Ардуино, открываем через Файл-Параметры окно параметров, в поле “Дополнительные ссылки для Менеджера плат” указываем “http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://dl.espressif.com/dl/package_esp32_index.json“.

Далее выбираем в Инструменты-Плата:

  • esp8266 -> Generic ESP8266 Module (в случае метеостанции с esp-12f)

  • esp32 -> ESP32 Dev Module (в случае метеостанции с esp32)

Далее выбираем Инструменты-Порт-порт, в которому подключена метеостанция

Устанавливаем необходимые библиотеки через Инструменты-Управление библиотеками: NTPClient, Adafruit_ST7789, ArduinoJson, OpenWeather, Sensirion I2C SCD30, Adafruit GFX Library, Time, ArduinoHTTPClient, ArduinoBearSSL.

Скачиваем с гитхаба https://github.com/tzirulnicov/smalltv_yandex скетч и открываем его, выбираем Скетч-Загрузить на плату – начнётся сборка прошивки и загрузка её на плату. После перезагрузки устройства получаем результат:

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

Подключение нашего устройства к УДЯ

Какие существуют способы подключения устройств к УДЯ? Их три:

  • своё облако (устройство общается с УДЯ через него)

  • ZigBee

  • Wi-Fi Matter

ZigBee и Wi-Fi Matter хороши тем, что при пропадании подключения к Интернет устройства Яндекса не теряют связь с подключенными к ним устройствами. Wi-Fi Matter требует наличие роутера, плюс ZigBee же – энергоэффективность, устройства с данной технологией могут работать несколько лет, питаясь от одной батарейки.

Мы же в этой статье рассмотрим первый вариант – с облаком – наше устройство будет скидывать данные на сайт в облаке (на основе фреймворка Django), а оттуда уже они будут раскатываться на устройства Яндекса. Наш web-сервис в дальнейшем можно будет доработать, отображая статистику изменения данных с устройства за заданный период (в УДЯ статистика отображается лишь за короткий период).

Написание web-сервиса для хранения данных в облаке

Теперь напишем web-сервис, который будет получать данные с нашего устройства и далее отправлять их в УДЯ. Писать будем на Питоне с использованием фреймворка Django, хранить данные – в MySQL.

Качаем проект с гитхаба: https://github.com/tzirulnicov/smalltv_yandex/django_web_service

Создаём в MySQL таблицу для хранения данных с датчика SCD30 (СО2, температура, влажность):

CREATE TABLE sensors (
id int unsigned NOT NULL AUTO_INCREMENT,
date datetime DEFAULT CURRENT_TIMESTAMP,
scd30_temp double(3,1) DEFAULT NULL,
scd30_co2 smallint unsigned DEFAULT NULL,
scd30_h smallint DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB

Прописываем настройки в settings.py:

ALLOWED_HOSTS = ['nonexistentdomain.ru']

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysql_db_name',
'USER':'mysql_user',
'PASSWORD':'mysql_password',
'HOST':'
localhost',
'PORT':'3306'
}
}

nonexistentdomain.ru заменяем на свой домен, прописываем настройки подключения к своей БД.

yandex_smarthome/urls.py:

urlpatterns = [
path('sensors_data', views.sensors_data),
path('oauth/login', views.oauth_login),
path('token', views.oauth_token),
path('v1.0/user/devices', views.user_devices),
path('v1.0/user/devices/query', views.user_devices_query),
path('refresh', views.refresh)
]

  • в файле роутинга приложения yandex_smarthome прописаны адреса для получения данных с нашей метеостанции ( /yandex_smarthome/sensors_data ) и отправки данных в УДЯ (авторизация через OAuth, выдача данных датчика). Код в views.py максимально упрощён, поэтому используются константы вроде “1234”. Выкатывать такое в продакшн точно не стоит, но для ознакомления с работой с УДЯ сгодится. :)

Подключение нашего проекта к УДЯ

Наконец-то у нас всё готово для подключения нашего проекта к умному дому Яндекса, пора научить Алису работе с нашим устройством. Для подключения будем использовать платформу Яндекс.Диалогов. Как это сделать – описано в документации: https://yandex.ru/dev/dialogs/smart-home/doc/ru/

Основные этапы:

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

Открываем https://dialogs.yandex.ru/developer/ , выбираем “Создать диалог”, далее “Умный дом”, после чего откроется страница “Новый умный дом”. В разделе “Настройки” открывшейся страницы вводим:

Подключение самодельных устройств к умному дому Яндекса с Алисой - 20
  • не забываем поменять nonexistent.ru на свой домен, куда будет “стучаться” УДЯ. Перед сохранением понадобится подтвердить права на этот домен через Яндекс.Вебмастер любым из удобных способов – размещение html-файла, метатега на главной странице, либо записью в DNS.

После сохранения введённых настроек переходим во вкладку “Связка аккаунтов” и задаём настройки уже там:

Подключение самодельных устройств к умному дому Яндекса с Алисой - 21
  • по этим адресам УДЯ будет взаимодействовать с нашим web-сервисом для получения данных с датчика метеостанции. Есть ограничения – наш сервис должен отвечать не дольше 3 секунд. длина ответа – до 5000 символов (oauth и refresh-токенов – до 2048 символов), подробнее здесь.

Здесь требуется указать идентификатор приложения и его секрет. Чтобы их получить, заходим на https://oauth.yandex.ru/ , нажимаем “Создать приложение”, вводим произвольное название, ставим галку “Веб-сервисы”, Redirect URI – свой домен. Далее заходим в “Мои приложения” и Client ID c Client secret оттуда копируем в “Идентификатор приложения” и “Секрет приложения” платформы Диалогов (см. скриншот выше).

Далее открываем вкладку “Тестирование”, где мы можем протестировать созданную связку с УДЯ:

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

Отправлять навык на модерацию и публиковать его нет необходимости – после тестирования он станет доступен в приложении УДЯ, приложениях Яндекса с Алисой (Яндекс.Навигаторе и т.д.), с ним начнут работать привязанные к аккаунту Яндекс.Станции, телевизоры и другие устройства Яндекса с Алисой (см. видеоролик и скриншоты в начале статьи).

Можно настроить сценарии автоматизации в приложении “Дом с Алисой” – например, при каких значениях с нашей метеостанции включать/выключать кондиционер в квартире.

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

  • нарисовать красивый интерфейс для вывода на экран устройства с использованием библиотеки LVGL в Eez Studio / SquareLine Studio (пример работы с LVGL выложен по ссылкам ниже)

  • для переключения экранных режимов подключить сенсорную кнопку на TP223 в случае ESP8266 (в случае ESP32 – у микроконтроллера имеется встроенный сенсорный интерфейс, металлический пятак припаивается сразу к ножке микроконтроллера)

  • Подключить датчик качества воздуха Sensirion SGP30 (шина I2C), датчик присутствия LD2410C и т.д. – размеры корпуса это позволяют

  • Доработать web-сервис для отображения статистики изменения данных с устройства, которые у нас сохраняются в таблице sensors (для чего мы уже сохраняем время их отправки).

Все ограничено лишь вашей фантазией и желаниями. :)

Ссылки на материалы по теме

Исходники проекта этой статьи: https://github.com/tzirulnicov/smalltv_yandex

Использование метеостанций SmallTV для установки ESPHome и подключения к Home Assistant

Исходный код проекта метеостанции HoloCubic – думаю, разработчик устройств SmallTV взял за основу именно этот проект

Исходный код проекта GeekMagic S3 – для метеостанций с ESP32-S3 N16R8

Пример с LVGL для ESP-IDF для метеостанций SmallTV

Работа с датчиком Sensirion SCD-30

Русские шрифты для библиотеки Adafruit GFX

Документация по использованию API УДЯ

Платформа Яндекс.Диалоги

Автор: tzirulnicov

Источник