Простое подключение ESP8266 к Яндекс Алисе
В данной статье мы попробуем разобраться как интегрировать ваше устройство на базе ESP8266 в систему умного дома и управлять им с помощью Яндекс Алисы.
Простое подключение ESP8266 к Яндекс Алисе
21.11.2024 в 16:34   15153 0
Версия для печати

Простое подключение ESP8266 к Яндекс Алисе

logo

В данной статье мы попробуем разобраться как интегрировать ваше устройство на базе ESP8266 в систему умного дома и управлять им с помощью Яндекс Алисы.

Введение

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

Чтобы создать такую продвинутую экосистему умных устройств, совсем не обязательно штурмовать магазины электроники. Яндекс предоставляет API для интеграции ваших собственных решений через платформу навыков. Один из таких навыков Домовёнок Кузя мы и будем использовать для интеграции нашего устройства в систему умного дома и управления им с помощью Алисы.

Сборка тестового стенда и описание программы. 

Для демонстрации работы нам понадобится лишь отладочная плата на базе ESP8266 и USB кабель для прошивки. Я буду использовать Wemos D1 Mini, хотя никто не запрещает воспользоваться NodeMCU или ESP12E. Просто берите то что есть в наличии. 
Итак, что же будет делать программа? Да в общем ничего особенного. Подключится к вашей сети WiFi, далее соединится с указанным MQTT брокером, после чего создаст на брокере тему "outTopic" и отправит в него сообщение "hello world'. Далее подпишется на тему "inTopic" и будет ожидать сообщений в ней. Если в данной теме появится сообщение "0", то ESP8266 погасит встроенный в отладочную плату светодиод, если "1", то включит снова.

Код программы


Копируем в ArduinoIDE приведенный ниже код программы и прошиваем отладочную плату

 

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// Update these with values suitable for your network.

const char* ssid = "ssid";
const char* password = "pass";
const char* mqtt_server = "192.168.1.1"; //ip или http адрес
int mqtt_port = 1883; //порт
const char* mqtt_login="login"; //логин
const char* mqtt_pass="pass"; //пароль

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;

void setup_wifi() {

 delay(10);
 // We start by connecting to a WiFi network
 Serial.println();
 Serial.print("Connecting to ");
 Serial.println(ssid);

 WiFi.mode(WIFI_STA);
 WiFi.begin(ssid, password);

 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }

 randomSeed(micros());

 Serial.println("");
 Serial.println("WiFi connected");
 Serial.println("IP address: ");
 Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
 Serial.print("Message arrived [");
 Serial.print(topic);
 Serial.print("] ");
 for (int i = 0; i < length; i++) {
 Serial.print((char)payload[i]);
 }
 Serial.println();

 // Switch on the LED if an 1 was received as first character
 if ((char)payload[0] == '1') {
 digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level
 // but actually the LED is on; this is because
 // it is active low on the ESP-01)
 } else {
 digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH
 }

}

void reconnect() {
 // Loop until we're reconnected
 while (!client.connected()) {
 Serial.print("Attempting MQTT connection...");
 // Create a random client ID
 String clientId = "ESP8266Client-";
 clientId += String(random(0xffff), HEX);
 // Attempt to connect
 if (client.connect(clientId.c_str(),mqtt_login,mqtt_pass)) {
 Serial.println("connected");
 // Once connected, publish an announcement...
 client.publish("outTopic", "hello world");
 // ... and resubscribe
 client.subscribe("inTopic");
 } else {
 Serial.print("failed, rc=");
 Serial.print(client.state());
 Serial.println(" try again in 5 seconds");
 // Wait 5 seconds before retrying
 delay(5000);
 }
 }
}

void setup() {
 pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
 Serial.begin(115200);
 setup_wifi();
 client.setServer(mqtt_server, mqtt_port);
 client.setCallback(callback);
}

void loop() {

 if (!client.connected()) {
 reconnect();
 }
 client.loop();
}
 

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

 

Как работает код

 

Сначала подключаем необходимые библиотеки

>#include <ESP8266WiFi.h>
#include <PubSubClient.h>
 

Далее в следующих строках вводим свои учетные данные для подключения к WiFi/

>const char* ssid = "ssid";
const char* password = "pass";

"ssid" - меняем на имя своей точки доступа, "pass" - пишем пароль к ней

Далее вводим учетные данные для подключения к mqtt серверу

const char* mqtt_server = "192.168.1.1"; //ip или http адрес
int mqtt_port = 1883; //порт
const char* mqtt_login="login"; //логин
const char* mqtt_pass="pass"; //пароль
 

Здесь остановимся несколько подробнее. В данном примере я подключаюсь к mqtt брокеру mosquitto развернутом на моем домашнем сервере. Если у вас такой возможности нет, то можете использовать один из бесплатных публичных брокеров

.

Далее идет инициализация Wif и Mqtt клиентов, настройка размера буфера для сообщений и прочее

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;
 

Далее идет код функции подключения к сети WiFi

void setup_wifi() {

 delay(10);
 // We start by connecting to a WiFi network
 Serial.println();
 Serial.print("Connecting to ");
 Serial.println(ssid);

 WiFi.mode(WIFI_STA);
 WiFi.begin(ssid, password);

 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }

 randomSeed(micros());

 Serial.println("");
 Serial.println("WiFi connected");
 Serial.println("IP address: ");
 Serial.println(WiFi.localIP());
}

На следующей функции стоит остановиться более подробно. Она отвечает за то, что конкретно должен делать ESP8266 при получении сообщения в теме на которую он подписан

void callback(char* topic, byte* payload, unsigned int length) {
 Serial.print("Message arrived [");
 Serial.print(topic);
 Serial.print("] ");
 for (int i = 0; i < length; i++) {
 Serial.print((char)payload[i]);
 }
 Serial.println();

 // Switch on the LED if an 1 was received as first character
 if ((char)payload[0] == '1') {
 digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level
 // but actually the LED is on; this is because
 // it is active low on the ESP-01)
 } else {
 digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH
 }

}

Здесь мы считываем в цикле побуквенно полученное сообщение из темы на которую ESP8266 подписан (В данном скетче это тема "inTopic") и если полученное значение равно 1, то включаем светодиод на плате, иначе выключаем. Следует упомянуть, что на ESP8266 горящий светодиод имеет низкий уровень LOW, то есть чтобы его выключить надо изменить значение на HIGH

Далее идет функция reconnect ответственная за повторное подключение к MQTT брокеру при потери с ним связи


void reconnect() {
 // Loop until we're reconnected
 while (!client.connected()) {
 Serial.print("Attempting MQTT connection...");
 // Create a random client ID
 String clientId = "ESP8266Client-";
 clientId += String(random(0xffff), HEX);
 // Attempt to connect
 if (client.connect(clientId.c_str(),mqtt_login,mqtt_pass)) {
 Serial.println("connected");
 // Once connected, publish an announcement...
 client.publish("outTopic", "hello world");
 // ... and resubscribe
 client.subscribe("inTopic");
 } else {
 Serial.print("failed, rc=");
 Serial.print(client.state());
 Serial.println(" try again in 5 seconds");
 // Wait 5 seconds before retrying
 delay(5000);
 }
 }
}
 

Обратите внимание на строку client.subscribe("inTopic"); Здесь мы указываем тему на брокере, через которую будем управлять устройством

Переходим к блоку setup()

void setup() {
 pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
 Serial.begin(115200);
 setup_wifi();
 client.setServer(mqtt_server, mqtt_port);
 client.setCallback(callback);
}

Здесь мы указываем, что пином встроенного светодиода будем управлять програмно, запускаем серийный порт на скорости 115200 Бод, вызываем функцию подключения к WiFI, инициализируем MQTT клиент и указываем для него обработчик сообщений в темах на которые он подписан client.setCallback(callback);

И наконец, переходим к основному циклу программы

void loop() {

 if (!client.connected()) {
 reconnect();
 }
 client.loop();
}
Здесь проверяем установлена ли связь с MQTT брокером. Если нет то подключаемся снова. Далее с помощью client.loop(); мониторим изменения в темах на которые устройство подписано. С программной частью все. Теперь переходим непосредственно к интеграции с Яндекс Алисой.

Интеграция с Яндекс Алисой.

Для этого потребуется навык Домовёнок Кузя. Через него можно  интегрировать виртуальные устройства напрямую в Яндекс.Алису. Это значит, что вам не придётся постоянно открывать навык, чтобы просто выключить светодиод. С микроконтроллером навык будет связываться через MQTT брокер.

Настройка навыка Домовенок Кузя

Перейдите на сайт навыка и авторизуйтесь там через Яндекс. 

кузя логин

Далее нажмите Добавить правило MQTT и перед вами откроется форма настройки правила

Правило MQTT

Активационная фраза — название запроса, которое будет отображаться в списке (например «Включи светодиод»). Если вы не планируете контролировать умный дом конкретно изнутри навыка, то больше фраза нигде не понадобится. Поле Ответ Кузи тоже оставляйте пустым. В поле MQTT-брокер нажмите Добавить новый, если его настройка раньше не проводилась, либо выберите из списка уже настроенный. Его настройки разберем чуть позже. В поле Topic пишем название темы которую читает ESP8266 указанную нами ранее в скетче. RETAIN установите на  НЕТ. В поле Payload укажите значение в теме при котором устройство изменит свое состояние. Напомню в скетче выше чтобы включить светодиод прочитанное значение из MQTT темы должно было быть равно 1.
Чтобы выключить - любым другим.

Остальные параметры можно не изменять. После этого нужно сделать идентичное правило на выключение светодиода.

Настройка параметров MQTT сервера

Чтобы управлять устройством извне через протокол MQTT Домовенок Кузя и ESP8266 должны быть подключены к одному и тому же MQTT брокеру. Если вы используете бесплатный MQTT брокер, то пропишите в данном окне те же самые настройки, что вы писали в скетче программы

настройки брокера

Затем нажмите кнопку Протестировать. Если во всплывающем окне появится сообщение, что все прошло успешно, нажимайте кнопку Сохранить и переходите к следующему шагу. Если же вы как и я используете локальный MQTT брокер на домашнем сервере, то вам кроме все прочего необходимо еще и озаботиться наличием "белого IP", своего домена с SSL сертификатом, не забыть открыть порт на роутере для доступа из интернета, ну и напоследок создать соответствующие DNS записи еа вашем домене для отображения нормального имени. В общем довольно сложный вариант и гораздо проще воспользоваться бесплатным MQTT брокером из списка.

Добавление виртуального устройства

Далее нужно перейти во вкладку виртуальных устройств и добавить устройство «Лампа». Тут нужно дать название устройству, по которому его будет идентифицировать Алиса. Например: светодиод, лампа, подсветка, лампа и т.п. Место расположения — комната, в которой будет установлено устройство. Это нужно на тот случай, если в нескольких комнатах будут одинаковые по названию элементы. К тому же, одной голосовой командой можно включать и выключать все устройства в определённой комнате.

В Правило на включение/выключение из списка выбираете соответствующие запросы.

виртуальное устройство
На этом настройка навыка Домовенок Кузя закончена

Настройка Алисы

В приложении Умный дом с Алисой Нажмите на кнопку «Добавить»→«Устройство умного дома».

добавление устройства

В открывшемся списке найдите навык «Домовёнок Кузя».

список

Авторизуйтесь в нём. Возможно, нужно будет ввести код объединения устройств, указанный в панели управления умным домом. Потом нажмите на Обновить список устройств.

домовенок кузя

На этом этом этапе вы уже создали умный дом своими руками. Теперь система полностью готова к голосовому контролю. К ней имеет доступ лишь ваш аккаунт. В настройках виртуальных устройств можно расширить доступ на другие аккаунты.

Тест работы устройства

И напоследок небольшой тест работы устройства

Материал также доступен на моем канале: Яндекс Дзен и в группе ВК
Категория: Программирование | Добавил: :, (14.01.2023)
Просмотров: 15153 | Теги: MQTT, Arduino IDE, Яндекс Алиса, умный дом, ESP8266 | Рейтинг: 5.0/1
Поделиться:
Всего комментариев: 0
avatar