В предыдущем статья в серии про Kincony KC868-A4 мы рассмотрели «атомарное» программирование компонентов этого контроллера; в этой статье мы разберем более продвинутый пример работы с КС868-А4 — управление вашей (IoT) системой через Интернет.
Существует множество способов управления контроллером через Интернет; сегодня мы поговорим об управлении с помощью популярного мессенджера Telegram. Если у вас на смартфоне установлен Telegram, то вы можете очень удобно получать информационные сообщения от вашей системы и подавать ей команды управления, где бы вы ни находились.
И, конечно же, когда вы добавите к основному функционалу вашего контроллера дистанционное управление, возможности вашей системы выйдут на совершенно другой, более высокий уровень.
▍ Как работает управление через Telegram
Для непосвященного человека такое понятие, как «управление контроллером через Telegram», выглядит чем-то не совсем понятным, сродни магии.Более того, управление контроллером Arduino через Telegram — что и как там работает, на первый взгляд, совершенно непонятно.
На самом деле все довольно просто — смартфон и контроллер обмениваются информацией, а Telegram в этой схеме выступает посредником между ними.
Конечно, на практике все реализуется немного сложнее и в этой схеме есть различные нюансы, но в целом она работает именно так, а о нюансах мы поговорим подробно позже.
Telegram, как система, имеет множество особенностей, одна из которых — так называемые «боты».
Бот — это программный робот, который может взаимодействовать с пользователями через интерфейс Telegram, и в данном случае мы будем использовать такого бота для управления контроллером Kincony KC868-A4.
Условно приведенную выше схему можно представить следующим образом:
Все взаимодействие Telegram с контроллером (Kincony KC868-A4) скрыто от пользователя; на экране своего смартфона он видит только реакцию бота на свои действия.
Есть важный момент, который нужно хорошо понимать: интерфейс бота предоставляет Telegram, но конкретную реакцию «контроллера» (действия, связанные с контроллером) обеспечивает сам контроллер (в нашем случае Kincony KC868-A4).
.
Примечание.
Кстати, в более привычных случаях различных (публичных) ботов в Telegram, где на схеме у нас есть контроллер, существуют различные «взрослые» компьютерные системы, обеспечивающие функционал этих ботов.
Если вы внимательно прочитали все вышесказанное, то вам должно стать в целом понятно, как работает такое управление через мессенджер Telegram (или любой другой).
Теперь перейдем к разбору различных нюансов работы этой схемы.
▍ Безопасность
Взаимодействие сервиса Telegram и вашего смартфона по умолчанию безопасно – об этом разработчики позаботились в первую очередь, так как мессенджер с незащищенным соединением никому не нужен.А вот что касается соединения Telegram-Контроллер, то тут не всё так просто — это взаимодействие (через незащищённый интернет) нужно как-то защитить.
И здесь возникают два аспекта проблемы:
1. Вам необходимо защитить само соединение.
Поскольку мы используем микроконтроллер, по умолчанию используются незащищенные соединения.
Для решения этой проблемы необходимо использовать специальную защищенную версию клиента (библиотеку).
2. Нам нужно идентифицировать нашего контролера , чтобы никто, кроме нашего контроллера, не мог управлять ботом.
Эта проблема решается получением токена (специального уникального кода) в Telegram для доступа к нашему боту.
Далее мы более подробно остановимся на тонкостях обеспечения безопасности нашего Telegram-бота, а теперь переходим от теории к практическим действиям и начнем с создания Telegram-бота, который будет управлять нашим контроллером.
▍ Создайте бота для Telegram
Чтобы создать бота для управления нашим контроллером, нам необходимо воспользоваться услугами «отца» всех ботов в Telegram (BotFather).Для этого введите в строке поиска «бот», найдите BotFather и выберите его.
При запуске BotFather предлагает небольшую помощь и ссылки на подробную документацию и описания функций.
Сейчас нас эти детали не очень интересуют и мы просто вводим первую команду «/start», на которую BotFather отвечает списком управляющих команд.
Затем, используя приглашение BotFather, введите команду для создания нового бота «/newbot».
Затем на вопрос указать имя нового бота вводим имя тестового бота для управления нашим контроллером КС868-А4 — «a4testbot».
И последний шаг — введите логин бота и получите уникальный токен для управления им (на скриншоте сам токен по понятным причинам скрыт).
Собственно, все, бот для управления контроллером Kincony KC868-A4 мы создали, теперь осталось только получить ваш идентификатор пользователя Telegram, чтобы управлять вашим контроллером могли только вы (и никто другой).
▍ Получите идентификатор пользователя
Для того, чтобы получить идентификатор пользователя Telegram, нам нужно использовать другого бота — IDBot. Находим его так же, как описано выше для BotFather и получаем следующее приветствие.
Введите команду «/start» и получите свой идентификатор пользователя для дальнейшего использования при программировании бота.
Вот и все, и можно переходить непосредственно к программированию нашего бота для управления контроллером Kincony KC868-A4.
▍ Программирование
Это уже 3-я статья из серии о контроллере Kincony KC868-A4 и в предыдущих статьях мы подробно рассмотрели настройку среды программирования (Arduino) и рассмотрели примеры «атомарного» программирования различных компонентов KC868-A4, так что прежде Для дальнейшего чтения рекомендуем вам прочитать предыдущие статьи этой серии.Часть 1 , Часть 2 (если вы с ними еще не знакомы).
Для работы с Telegram API мы будем использовать специализированную библиотеку.
Универсальный-Arduino-Telegram-Bot , который возьмет на себя львиную долю трудозатрат на обеспечение взаимодействия нашего кода с сервисом Telegram и значительно облегчит и упростит задачу программирования нашего бота для управления контроллером Kincony KC868-A4. Нам также понадобится вспомогательная библиотека Ардуино Json , который содержит необходимые функции для работы с данными в формате Json. На этом вводную часть по программированию можно завершить и далее переходим непосредственно к составлению и анализу работы скетча нашего Telegram-бота.
▍ Скетч Telegram-бота
В качестве тестового примера управления контроллером Kincony KC868-A4 с помощью Telegram-бота реализуем самый простой и наглядный сценарий работы — включение и выключение одного из реле контроллера с помощью команд в интерфейсе Telegram и запрос текущего состояния этого реле (ВКЛ/ВЫКЛ).Ниже приведен полный код нашего Telegram-бота, в котором вы должны поменять пустые данные на свои настоящие пароли, токены, названия точек доступа Wi-Fi и т.д., чтобы все работало.
Сначала вы должны ввести в скетч свой SSID и пароль Wi-Fi.
Затем токен для управления ботом, о котором мы говорили выше.const char* ssid = "ssid"; const char* password = "password";
#define BOTtoken "0000000000:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
И ваш Telegram ID, о котором мы также говорили ранее.
#define CHAT_ID "0000000000"
Нам также необходимо сделать некоторые дополнительные настройки в эскизе.
Задаем номер контакта одного из четырех реле Kincony KC868-A4 (схему и распиновку контроллера см.
в предыдущих статьях).
const int ledPin = 2;
И код самого нашего Telegram-бота: Полный код тестового примера управления контроллером Kincony KC868-A4
/*
Kincony KC868-A4
Telegram example
*/
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/telegram-control-esp32-esp8266-nodemcu-outputs/
Project created using Brian Lough's Universal Telegram Bot Library: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot
Example based on the Universal Arduino Telegram Bot Library: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot/blob/master/examples/ESP8266/FlashLED/FlashLED.ino
*/
#ifdef ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h> // Universal Telegram Bot Library written by Brian Lough: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot
#include <ArduinoJson.h>
// Replace with your network credentials
const char* ssid = "ssid";
const char* password = "password";
// Initialize Telegram BOT
#define BOTtoken "0000000000:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" // your Bot Token (Get from Botfather)
// Use @myidbot to find out the chat ID of an individual or a group
// Also note that you need to click "start" on a bot before it can
// message you
#define CHAT_ID "0000000000"
#ifdef ESP8266
X509List cert(TELEGRAM_CERTIFICATE_ROOT);
#endif
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
// Checks for new messages every 1 second.
int botRequestDelay = 1000;
unsigned long lastTimeBotRan;
const int ledPin = 2;
bool ledState = LOW;
// Handle what happens when you receive new messages
void handleNewMessages(int numNewMessages) {
Serial.println("handleNewMessages");
Serial.println(String(numNewMessages));
for (int i=0; i<numNewMessages; i++) {
// Chat id of the requester
String chat_id = String(bot.messages[i].
chat_id); if (chat_id != CHAT_ID){ bot.sendMessage(chat_id, "Unauthorized user", ""); continue; } // Print the received message String text = bot.messages[i].
text; Serial.println(text); String from_name = bot.messages[i].
from_name; if (text == "/start") { String welcome = "Welcome, " + from_name + ".
\n";
welcome += "Use the following commands to control your outputs.\n\n";
welcome += "/led_on to turn GPIO ON \n";
welcome += "/led_off to turn GPIO OFF \n";
welcome += "/state to request current GPIO state \n";
bot.sendMessage(chat_id, welcome, "");
}
if (text == "/led_on") {
bot.sendMessage(chat_id, "LED state set to ON", "");
ledState = HIGH;
digitalWrite(ledPin, ledState);
}
if (text == "/led_off") {
bot.sendMessage(chat_id, "LED state set to OFF", "");
ledState = LOW;
digitalWrite(ledPin, ledState);
}
if (text == "/state") {
if (digitalRead(ledPin)){
bot.sendMessage(chat_id, "LED is ON", "");
}
else{
bot.sendMessage(chat_id, "LED is OFF", "");
}
}
}
}
void setup() {
Serial.begin(115200);
#ifdef ESP8266
configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP
client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
#endif
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState);
// Connect to Wi-Fi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
#ifdef ESP32
client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org
#endif
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi.");
}
// Print ESP32 Local IP Address
Serial.println(WiFi.localIP());
}
void loop() {
if (millis() > lastTimeBotRan + botRequestDelay) {
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
while(numNewMessages) {
Serial.println("got response");
handleNewMessages(numNewMessages);
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}
lastTimeBotRan = millis();
}
}
Теперь давайте кратко рассмотрим основные части этого эскиза.
На функциях setup() и lolo() останавливаться не будем — там все стандартно и тривиально — функция setup() инициализируется и подключается к сети Wi-Fi, а функция цикла() постоянно отслеживает поступление новых сообщений.
из сервиса Telegram (от вас как пользователя).
Основной функционал бота реализован в функции handleNewMessages(int numNewMessages), где входящие сообщения обрабатываются в цикле.
for (int i=0; i<numNewMessages; i++) {
Проверяется легитимность вашего подключения, а неавторизованные пользователи (с другими идентификаторами) игнорируются.
// Chat id of the requester
String chat_id = String(bot.messages[i].
chat_id);
if (chat_id != CHAT_ID){
bot.sendMessage(chat_id, "Unauthorized user", "");
continue;
}
Далее отображается приветственное сообщение и подсказка о доступных командах нашего бота.
String from_name = bot.messages[i].
from_name; if (text == "/start") { String welcome = "Welcome, " + from_name + ".
\n";
welcome += "Use the following commands to control your outputs.\n\n";
welcome += "/led_on to turn GPIO ON \n";
welcome += "/led_off to turn GPIO OFF \n";
welcome += "/state to request current GPIO state \n";
bot.sendMessage(chat_id, welcome, "");
}
Затем задается реакция на команды включения/выключения реле.
if (text == "/led_on") {
bot.sendMessage(chat_id, "LED state set to ON", "");
ledState = HIGH;
digitalWrite(ledPin, ledState);
}
if (text == "/led_off") {
bot.sendMessage(chat_id, "LED state set to OFF", "");
ledState = LOW;
digitalWrite(ledPin, ledState);
}
И ответ на запрос текущего состояния реле.
if (text == "/state") {
if (digitalRead(ledPin)){
bot.sendMessage(chat_id, "LED is ON", "");
}
else{
bot.sendMessage(chat_id, "LED is OFF", "");
}
}
Также стоит отметить, что для связи с сервисом Telegram используется защищенная версия Wi-Fi-клиента, обеспечивающая безопасность управления ботом и контроллером.
#include <WiFiClientSecure.h>
Ну а вот наглядный результат работы нашего Telegram-бота в виде скриншота.
Обратите внимание на последнюю команду «/state», которая не оказала никакого эффекта — это происходит, когда контроллер Arduino выключен (или недоступен по какой-либо причине) — бот просто перестает отвечать на ваши команды в интерфейсе Telegram.
Как видите, благодаря библиотеке Universal-Arduino-Telegram-Bot создание ботов Arduino для управления вашими IoT-системами через Telegram становится невероятно простым и доступным занятием — код предельно прост и прозрачен.
Из этого следует еще один весьма положительный вывод: для того, чтобы расширить базовый функционал нашего тестового бота, не нужно каких-либо специальных знаний в области программирования — это под силу даже начинающему программисту и энтузиасту микроконтроллеров.
▍ Заключение
В этой статье мы рассмотрели продвинутый пример управления контроллером Kincony KC868-A4 через Интернет с помощью Telegram-бота и выяснили, что это совсем не сложно и доступно даже начинающим энтузиастам Arduino. В следующей статье мы наконец доберемся до «тяжелой артиллерии» и познакомимся с примерами Kincony KC868-A4 под управлением сложных прошивок ESP32 вроде Tasmota, ESPhome или специализированной версии AMS. P.S. У Кинкони есть YouTube канал со множеством интересных примеров программирования и использования своих продуктов, в одном из видеороликов на этом канале описывается (правда, на английском языке и немного сумбурно) создание Telegram-бота.
Теги: #Программирование микроконтроллеров #микроконтроллеры #iot #Сделай сам или Сделай сам #программирование #Интернет вещей #Telegram #автоматизация #arduino #Разработка для Arduino #ruvds_articles #ruvds_articles #умный дом #Kincony #KC868
-
Соединять. Успешно
19 Oct, 24