Ребятушки всем Привет. На днях обратился ко мне один из подписчиков с просьбой, написать Telegram бота, который бы следил за температурой отопительного котла фирмы TIS GROUP и отправлял сообщения о необходимости «подкинуть дровишек». Реализовать нужно было на всем известной ESP8266. У котла TIS, есть своя автоматика управления и датчики температуры. Но мы сошлись на том, что лезть в отлаженную систему не стоит. Поэтому датчик контроля температуры будет отдельным.

Что нам понадобиться для того чтобы собрать наш проект:

  • ESP8266 NODE MCU (вообщем-то какой будет ESP не очень важно, просто у меня под рукой была такая. http://ali.pub/48xj0l);
  • Датчик температуры DS18B20. Брал тут http://ali.pub/48xjee
  • Резистор на 4.7 КОм (можно найти в любом магазине радиодеталей, но лучше купить набор резисторов разных номиналов. Пригодиться для будущих проектов); Вот такой http://ali.pub/48xjnj
  • Плата прототипирования; http://ali.pub/48xk6s
  • Набор перемычек; http://ali.pub/48xkx1

Arduino IDE и ESP8266

Разработку будем вести в среде Arduino IDE. Скачиваем и накатываем если еще этого не сделали. Далее добавляем ESP менеджер в  среду Arduino IDE. Те кто уже работали с ESP и знают с чем его едят – переходим к следующему пункту.

Прежде чем мы перейдем к написанию кода, мы должны подготовить среду  IDE Arduino с библиотеками, а также ядром для платформы разработки Node MCU. Чтобы установить Node MCU c ядром модуля ESP8266, необходимо:

  • Скопируйте и вставьте эту строку в URL-адреса менеджера дополнительных плат:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Откройте вкладку Файл – Настройка , в строке Дополнительный менеджер плат добавить ссылку как показано на скриншоте.

Откройте вкладку Файл – Настройки , в строке Дополнительные ссылки для Менеджера плат добавить ссылку как показано на скриншоте.

Теперь заходим в Инструменты – вкладка Платы – Менеджер плат… => Прописываем в строке поиска ESP8266. Важно. Выбираем  версию 2.4.2 Жмем установить. С другими версиями работоспособность не гарантируется. Инструменты – вкладка Платы – Менеджер плат… => Прописываем в строке поиска ESP8266. Там будет указана текущая версия. Выбираем 2.4.2 и Жмем установить.

Если у вас установлена более поздняя версия, тогда делаем по сути тоже самое.  

После подключения платы к компьютеру устанавливаем драйвера для платы ch340. Выбираем в менеджере план Node MCU V1.0 => COM порт и скорость соединения.

 

Telegram Bot

Итак, для того, чтобы создать своего первого бота, тебе потребуются:

  • Компьютер (ну а как же без него?) на macOS, Linux или Windows;
  • Telegram, желательно также на компьютере, можно воспользоваться веб-версией, если лень скачивать;

Если всё готово, есть хотя бы компьютер и Telegram, то можем начинать.

Теперь нам нужно зарегистрировать нашего бота в Telegram. Для этого открываем приложение Telegram (либо веб-версию) и переходим к боту @BotFather. Запускаем бота и отправляем ему команду /newbot.

Первым делом нас спросят о названии бота, именно об имени, то, что будет отображаться в списке диалогов рядом с аватаркой. Назовём нашего бота Ботаник, отправим это сообщение @BotFather. Теперь нужно придумать уникальный логин бота, который должен оканчиваться на bot. Пусть будет BotanikRobot. Помни: логин бота в дальнейшем изменить нельзя.

Если логин никем не занят, то @BotFather отправит нам сообщение об успешном создании нового бота. Всё, что нам нужно узнать из полученного сообщения — длинную строку, TOKEN бота. Это ключ, с помощью которого мы сможем управлять нашим ботом и отправлять сообщения с ESP8266. Но об этом немного позже.

В моём примере ключ: 520178827:AAHCjHvMAkBvDogQMP3VUNmi86-B6vtQRFM. Можешь не пытаться его использовать, он уже обновлён ?

Ну когда же мы начнем писать код

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

Общие команды.

  • /newbot — Создать нового бота.
  • /mybots — Редактирование ваших ботов.

Редактирование параметров бота.

  • /setname — Изменить имя робота.
  • /setdescription — Изменить описание бота, представляющее собой короткий текст с описанием бота. Пользователи увидят его в самом начале, под заголовком «Что умеет этот робот?».
  • /setabouttext — Изменить информацию о боте, ещё более короткий текст, отображающийся в профиле бота. Ещё, если кто-то поделится вашим ботом, то вместе со ссылкой на него отправится этот текст.
  • /setuserpic — Изменить аватарку бота. Картинки — всегда хорошо.
  • /setcommands — Изменить список команд бота. Каждая команда состоит из собственно командного слова, начинающегося с символа косой черты («/») и короткого описания. Пользователи увидят список команд при вводе символа «/».
  • /deletebot — Удалить бота и его имя пользователя.
  • /setjoingroups — Определяет, можно ли добавлять вашего бота в группы.
  • /setprivacy — Определяет, все ли сообщения видит ваш бот в группах. В выключенном состоянии боту будут отправляться все сообщения.

И так изучив все команды, я предлагаю для начала заполнить описание нашего бота. У бот-аккаунта есть два поля с описанием. Первое это About Info которое видно на карточке с информацией о боте. Второе это Description Info, текст отображающийся при первом открытии чата с ботом.

Первым делом заполним About Info для этого введем команду /setabouttext Следуя инструкциям @BotFather введем следующее описание бота. «На примере этого бота мы с пользователями QSY.BY изучаем написание бота для Telegram.»

Далее заполним Description Info для этого в @BotFather введем команду /setdescription и напишем следующий текст. «Этот бот пока что умеет очень мало, но обучен базовому этикету свойственному для ботов этого типа :-)»

И на десерт используем команду /setuserpic чтобы установить аватар для нашего бота.

 

 

Поздравляю ты только что создал своего первого бота в Telegram. Посмотреть результат ты можешь по ссылке @BotanikRobot Правда он еще пока ничего не умеет, совсем как маленький ребенок. Поэтому ты должен научить его выполнять команды. Для этого в @BotFather есть команда /setcommands.

Становись. Равняйсь. Смирно. Команды в Telegram Bot.

Команды представляют собой более гибкий способ общения с ботом. Рекомендуется следующий синтаксис:

Команда должна начинаться с символа косой черты «/» и не может быть длиннее 32 символов. Команды могут состоять из букв латинского алфавита, цифр и подчёркивания. Несколько примеров:

Сообщения, начинающиеся с косой черты, будут всегда доставляться боту (точно также, как и при ответе на его сообщения и на @упоминания бота в чате). Приложения Telegram будут:

  • предлагать список поддерживаемых команд с их описанием, когда пользователь введёт символ косой черты «/» (чтобы этот пункт работал, необходимо задать описание команд у @BotFather). Нажатие на описание приведёт к отправке этой команды.
  • показывать кнопку (/) в поле ввода текста во всех чатах с ботами. Нажатие на эту кнопку отобразит список доступных команд.
  • подсвечивать /команды в сообщениях. При нажатии на такую подсвеченную команду, она будет сразу же отправлена боту.

Глобальные команды

Чтобы пользователям было проще работать с ботами, создатели Telegram просят всех разработчиков реализовывать поддержку нескольких простых команд. В интерфейсе приложений Telegram будут ярлыки (быстрые ссылки) для этих команд.

  • /start -начинает общение с пользователем (например, отправляет приветственное сообщение). В эту команду также можно передавать дополнительные аргументы.
  • /help — отображает сообщение с помощью по командам. Оно может представлять собой короткое сообщение о вашем боте и список доступных команд.
  • /settings — (по возможности) возвращает список возможных настроек и команды для их изменения.

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

В результате в @BotFather после ввода команды  /setcommands водим следующие команды:

 

 

start — Начать чат с Ботаником

help — Получить список команд

settings — Настройки бота

 

 

Если ты начнешь выполнять команды — ничего не произойдет, т.к бот не знает, что ответить на входящее сообщение, потому что мы его этому не научили. Для того что бы начать программировать ответы бота нам нужно получать сообщения отправляемые ему. Для этого есть два основных метода setWebhook и getUpdates. О них и о всех доступных методах написано в Bot API.

WebHook или GetUpdates

Если использовать метод setWebhook Telegram сам будет пересылать для обработки все сообщения адресованные боту. Используя метод getUpdates мы должны каждый раз запрашивать у Telegram обновление. Очевидно что метод setWebhook намного проще, но для его реализации нужен сервер и подписанный сертификат SSL для организации защищенного https соединения, наличие которого обязательно требует Telegram. Получить его не сложно, но на начальном этапе это не так важно. Поэтому мы будем использовать метод getUpdates, который от нас ничего не требует.

Попробуем получить данные из чата с нашим ботом. имеют стандартный вид. Все запросы к Telegram Bot API должны осуществляться через HTTPS и имеют стандартный вид:

https://api.telegram.org/bot<token>/НАЗВАНИЕ_МЕТОДА. Например:

https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe

Как видно имея token бота можно полностью и управлять, поэтому рекомендую его не где не светить. Т.к все взаимодействия с ботом это http запросы, мы можем общаться с ботом прямо из браузера.

https://api.telegram.org/520178827:AAGmMkeDcNSrYS6OkO0dtDizN-HT4jkNNOk/getUpdates

В результате выполнения запроса поле результата пустое. Попробуем что-нибудь отправить нашему боту, например «Hello World»и просто просто обновим запрос в браузере.

В результате получим большой набор данных. Давай разберемся, что это все означает.

update_id :216473175 — уникальный id запроса.

«is_bot»:false,»first_name»:»Pavel»,»last_name»:»Hladkikh»,»username»:»EU4DGC»,»language_code»:»ru»},»chat»:{«id»:216473175,»first_name»:»Pavel»,»last_name»:»Hladkikh»,»username»:»EU4DGC»,»type»:»private»},»date»:1520180410,»text»:»Hello World»}}]}

В этой строке видны ID, Имя и Username отправителя,  дата, и текст сообщения. Отлично теперь имея id отправителя написавшего в чате боту, мы можем ему ответить. Для этого воспользуемся методом sendMessage. Кстати полный список методов для взаимодействия с пользователем можно найти все в том же Telegram Bot API.

У метода sendMessage есть два обязательных поля это chat_id (id чата с ботом) и text (собственно сам текст сообщения). Chat_id можно узнать из предыдущего запроса, при этом в приватном чате chat_id и id пользователя совпадают. В результате получаем запрос следующего вида.

https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/sendmessage?chat_id=216473175&text=Test

В результате выполнения запроса получаем сообщение от сервера Telegram о валидном выполнении запроса. При этом в Web версии мессенджера мигает оповещение о новом событии.  

Как видно из окна чата. Мы получили сообщение от бота. Надеюсь вы поняли как происходит механизм взаимодействия с ботами в Telegram. Чаще всего ответ на отправленные команды, это текст, но не всегда. Подводя итог. При помощи Telegram Bot API  можно получать / отсылать сообщения, фотографии, музыку, файлы и местоположение.  Уже сейчас можно научить нашего бота отвечать на входящие сообщения, но это будет не автоматизированный процесс. Мы же не будем отвечать и обновлять бота вручную. Именно для автоматизации мы должны написать скрипт, который будет управлять ответами нашего бота.

Подключаем датчик DS18B20

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

Пишем код

Первым делом переходим по ссылке и качаем все необходимые файлы и библиотеки из моего репозитория на GITHUB.

Важно. Используем именно те файлы и библиотеки. Все проверено на работоспособность и совместимость.

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <ESP8266TelegramBOT.h>
#include <OneWire.h>
#include <DallasTemperature.h>

Вот эти библиотеки должны быть в обязательном порядке. Думаю из их названия все понятно. Кстати они все есть в репозитория на GITHUB. Заполняем данные о WiFi сети к которой подключаемся.

Далее инициализируем бота. Прописываем его учетные данные полученные при регистрации.

#define BOTtoken "520178827:AAHPaUTwk5Vfgb38L257Wg_dgfddk_MQ4" //Токен бота полученного от @BotFather
#define BOTname "Ботаник" // Имя бота
#define BOTusername "BotanikRobot" // Логин бота
TelegramBOT bot(BOTtoken, BOTname, BOTusername);

Теперь немного о получении температуры.

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = {0x28, 0x42, 0x2B, 0x6C, 0x06, 0x00, 0x00, 0xDE}; // ONE WIRE адрес датчика температуры.

ONE WIRE адрес датчика температуры можно узнать при помощи примера из библиотеки DallasTemperature. Открываем Файл — Примеры — OneWire — DS18x20_Temperature

В строке OneWire ds(10); // on pin 10 (a 4.7K resistor is necessary) меняем значение на 15 И прошиваем ESP. В мониторе порта видим следующую картину.

Копируем строчку ROM. Это и есть адрес нашего датчика температуры. Кстати если заметили этот скетч автоматически определяет тип датчика и еще выводит данные температуры в цельсиях и фаренгейтах. Возвращаемся в скетч Telegram бота и вписываем адрес датчика.

Теперь напишем функцию получения температуры. Думаю расписывать сильно нет смысла. Все хорошо прокомментированно.

float getTemperature(){
float temp;
sensors.setResolution(Thermometer1, 10); // Точность занков после запятой
sensors.requestTemperatures(); // Команда получения температуры
//Serial.print("Temperature for the device 1 (index 0) is: ");
//Serial.println(sensors.getTempCByIndex(0));
temp = sensors.getTempC(Thermometer1); // Сохраняем значение температуры в переменной
return temp; // Возвращаем значение температуры функции
}

Следующая на очереди функция обработки команд и приветствия.

void Bot_EchoMessages() {
for (int i = 1; i < bot.message[0][0].toInt() + 1; i++) {
bot.sendMessage(bot.message[i][4], bot.message[i][5], "");
bot.message[i][5]=bot.message[i][5].substring(1,bot.message[i][5].length());
if (bot.message[i][5] == "start") { // По команде /start выдает приветственное сообщение.
String wellcome = "Привет. Это бот на ESP8266";
bot.sendMessage(bot.message[i][4], wellcome, "");
Start = true;
}
}
bot.message[0][0] = ""; // All messages have been replied - reset new messages
}

Ну и теперь основной цикл проверки сообщений и отправки Alarm о низкой температуре.

void loop() {
if (millis() > Bot_lasttime + Bot_mtbs) {
bot.getUpdates(bot.message[0][1]); // Включаем API и получаем новые сообщения
if (getTemperature() < 65) { // Проверяем,если температура ниже указанной, тогда шлем сообщение
Serial.print("ALARM: ");
bot.sendMessage("1234", "Котел скоро потухнет. Подкинь дровишек браток!!!", ""); // Вписываем ID чата с ботом вместо 1234
}
Bot_EchoMessages(); // reply to message with Echo
Bot_lasttime = millis();
}
}

Как получить ID чата. Компилируем и заливаем скетч в ESP. Открываем монитор порта и устанавливаем соединение. В чате c ботом в окне Telegram пишем сообщение. Возвращаемся в окно монитор порта. И видим следующий текст.

Меняем ID в скетче. Компилируем и заливаем скетч. Вот собственно и все. Если температура опуститься ниже порогового значения, бот начнет на слать сообщения. Естественно этого бота можно переписать абсолютно другие задачи.

Друзья. Если вам понравилась эта статья, поделитесь ей в социальных сетях. Обязательно напишите комментарий если у вас возникли вопросы. Мне важно ваше мнение. У нас есть групповой чат в Telegram, где вы можете оперативно задать вопрос и узнать о последних новостях.  И поддержите проект монеткой.