Настройка Telegram-бота на контроллере Wiren Board
Описание
Телеграмм-бот — это многофункциональный помощник на платформе Телеграм, который понимает команды, может обращаться в API вашего сайта или сервиса.
С помощью телеграм-бота вы можете управлять умным домом, получать состояние устройств или сделать систему напоминаний.
Подготовка
Для настройки Telegram-бота на контроллере Wiren Board нам понадобится:
- установленный Node-RED и настроенный модуль WB Nodes,
- модуль node-red-contrib-telegrambot
- и созданный Telegram-бот.
Настройка делается через встроенный в Node-Red веб-интерфейс, который доступен по адресу http://wb-ip-address:1880, например, http://192.168.42.1:1880.
В примерах мы будем создавать флоу (flows) — это блок-схемы процесса.
Создание бота
Если у вас нет телеграм-бота, то создайте его:
- Установите клиент Telegram и зарегистрируйте аккаунт.
- Найдите в Telegram бота @BotFather и запустите его.
- Создайте нового бота и настройте его:
- введите команду
/newbot
, - задайте название бота,
- придумайте и напишите имя бота, оно должно заканчиваться на
_bot
.
- введите команду
- В сообщении об успешном создании нового бота:
- скопируйте API-токен для подключения к боту,
- нажмите на ссылку
t.me/имя_вашего_бота
, откроется диалог с ботом — запустите его командой/start
Всё, теперь мы готовы настраивать его на контроллере Wiren Board.
Установка модуля
Чтобы Node-RED смог работать с Telegram, установите модуль node-red-contrib-telegrambot
:
- Зайдите в веб-интерфейс Node-RED.
- В правом верхнем углу вызовите меню.
- В открывшемся окне выберите вкладку Управление палитрой (Manager palette).
- Перейдите на вкладку Установка (Install), введите в поле поиска telegrambot и нажмите на клавиатуре Enter.
- Установите пакет с названием node-red-contrib-telegrambot.
- Закройте окно с настройками. Установка модуля завершена.
После установки, в левой панели появится секция telegram.
Создание ноды для бота
Перед тем, как передавать данные из контроллера в чат с ботом, нам нужно настроить ноду нашего бота:
- Перетяните в рабочую область ноду sender.
- Дважды кликните на ней — откроется окно Edit sender node.
- В поле Bot нажмите на кнопку с карандашом, откроется окно Edit telegram bot node.
- В открывшемся окне заполните поля:
- Bot-Name — произвольное имя
- Token — API-токен, который вы получили при создании бота в мессенджере Telegram.
- Users — имена telegram-пользователей, которые смогут отправлять боту команды и получать данные.
- Update Mode — выберите Pooling
- Poll Interval — установите 1000.
- Сохраните настройки нажатием кнопки Done.
- Вы вернётесь в окно Edit sender node, в котором нажмите Cancel.
Создание ноды бота завершено, теперь мы можем использовать её для соединения с telegram-ботом.
Пересылка принятых сообщений
Добавьте ноду, которая будет принимать сообщения, отправленные в чат с ботом:
- Перетяните в рабочую область ноду receiver.
- Дважды кликните на ней — откроется окно Edit receiver node.
- Выберите в поле Bot созданную раньше ноду бота.
- Чтобы сохранить настройки, нажмите кнопку Done.
Добавьте ноду, которая будет отправлять сообщения в чат с ботом:
- Перетяните в рабочую область ноду sender.
- Дважды кликните на ней — откроется окно Edit sender node.
- Выберите в поле Bot ноду бота.
- Чтобы сохранить настройки, нажмите кнопку Done.
Дальше нам нужно добавить логику обработки входящих сообщений. Настройте пересылку входящих сообщений обратно в чат:
- Перетяните в рабочую область ноду function.
- Дважды кликните на ней — откроется окно Edit function node.
- На вкладке обработчика onMessage должна быть написана строка
return msg;
- это значит, что функция возвращает целиком сообщение, которое пришло на её вход.
- Сохраните настройки, нажатием на кнопку Done.
После настройки всех трёх нод, соедините их между собой:
- Верхний выход ноды receiver соедините с входом функции.
- Выход функции соедините с входом ноды sender.
После настройки нод и соединений между ними, опубликуйте изменения нажатием на кнопку Deploy в правой верхней части веб-интерфейса Node-RED.
Теперь перейдите в чат к боту и отправьте ему произвольное сообщение, если бот прислал это же сообщение вам в ответ, то всё настроено правильно и можно переходить к более сложным задачам.
Запрос информации с датчиков контроллера
Чтобы Node-RED мог общаться с MQTT-брокером контроллера, у вас должен быть настроен плагин WB Nodes.
Настроим бота так, чтобы он присылал температуру процессора контроллера Wiren Board в ответ на команду /cputemp
.
Перед созданием нового флоу очистите рабочее поле — это исключит ложные срабатывания на команду из чата. При очистке все настройки соединения с контроллером и телеграм-ботом сохранятся.
ChatId
ChatId — это идентификатор чата с ботом, он нужен, чтобы бот понимал куда ему отвечать.
В предыдущем примере chatId был в принятом сообщении, которое мы пересылали — поэтому указывать его не было нужно. Сейчас мы будем формировать своё сообщение, поэтому нам нужно знать — кто запросил данные.
Так как chatId есть в любом принятом сообщении, то мы можем его сохранить в момент получения команды, а потом подставить при формировании ответа.
Сохраните chatId в глобальной переменной флоу:
- Добавьте ноду приёма сообщений:
- Перетяните в рабочую область ноду receiver.
- Дважды кликните на ней — откроется окно Edit receiver node.
- Выберите в поле Bot созданную раньше ноду бота.
- Задайте в поле Name имя Save chatId.
- Чтобы сохранить настройки, нажмите кнопку Done.
- Добавьте ноду, которая будет сохранять chatId:
- Перетяните в рабочую область ноду function.
- Дважды кликните на ней — откроется окно Edit function node.
- На вкладке обработчика onMessage удалите содержимое поля ввода и введите строку:
flow.set("chatId",msg.payload.chatId);
- это значит, что функция сохранит chatId из поступившего сообщения в глобальную переменную chatId.
- Сохраните настройки, нажатием на кнопку Done.
Обработка команды
В предыдущем примере бот реагировал на любое входящее сообщение — теперь мы научим его понимать команды:
- Добавьте реакцию на команду
/cputemp
:- Перетяните в рабочую область ноду command.
- Дважды кликните на ней — откроется окно Edit command node.
- Выберите в поле Bot ноду нашего бота.
- Для отображения команды в меню бота в телеграм:
- Установите галочку для Register at telegram server.
- Введите описание команды в поле Description.
- Чтобы сохранить настройки, нажмите кнопку Done.
- Добавьте запрос температуры процессора контроллера:
- Перетяните в рабочую область ноду get, она находится в разделе Wiren Board.
- Дважды кликните на ней — откроется окно Edit get node.
- Выберите в поле Server созданное на этапе настройки WB Nodes соединение с контроллером.
- В поле Channel откройте список каналов и найдите там CPU Temperature.
- Чтобы сохранить настройки, нажмите кнопку Done.
- Теперь настройте формирование ответного сообщения:
- Перетяните в рабочую область ноду function.
- Дважды кликните на ней — откроется окно Edit function node.
- На вкладке обработчика onMessage удалите содержимое поля ввода и введите строки:
msg.payload = { chatId: flow.get("chatId"), type: 'message', content: msg.payload }; return msg;
- здесь мы создали ответное сообщение типа message, заполнили chatId и в содержимом передали поступившую из ноды get информацию.
- Сохраните настройки, нажатием на кнопку Done.
- Добавьте ноду, которая отправит наше сообщение в чат с ботом:
- Перетяните в рабочую область ноду sender.
- Дважды кликните на ней — откроется окно Edit sender node.
- Выберите в поле Bot ноду бота.
- Чтобы сохранить настройки, нажмите кнопку Done.
- После настройки всех нод, соедините их между собой:
- верхний выход ноды receiver соедините с нодой Save chatId;
- верхний выход ноды command соедините со входом ноды (WB)get;
- выход ноды (WB)get соедините со входом function, где формируется сообщение;
- выход ноды function соедините со входом ноды sender.
- Опубликуйте флоу нажатием на кнопку Deploy. Возле нод receiver и sender должны появится надписи connected.
Настройка бота завершена.
Запрос данных в телеграм-чате с ботом
Теперь проверим работу нашего бота:
- Перейдите в мессенджер Telegram.
- Откройте чат с ботом.
- Введите команду
/cputemp
, бот должен прислать ответ:/cputemp 61.414
Примеры флоу из статьи
Примеры — это JSON-файлы, которые нужно загрузить в среду Node-RED:
- Скачайте архив с примером на компьютер и распакуйте его.
- Выберите в меню Node-RED пункт Import и выберите импорт из JSON.
- Выберите распакованный на первом шаге файл.
- После импорта укажите в параметрах телеграм-бота свой API-Key и имя разрешённых пользователей.
Файлы:
- Пересылка принятых сообщений
- Запрос информации с датчиков контроллера
- Запрос информации с нескольких датчиков контроллера одновременно