Node-RED Telegram: различия между версиями
(не показано 20 промежуточных версий 3 участников) | |||
Строка 1: | Строка 1: | ||
{{DISPLAYTITLE: Настройка Telegram-бота на контроллере Wiren Board }} | {{DISPLAYTITLE: Настройка Telegram-бота на контроллере Wiren Board }} | ||
[[Image: demo-command-full-tg.png |500px|thumb|right| Пример общения с ботом. Файл этого флоу смотрите в конце статьи]] | [[Image: demo-command-full-tg.png |500px|thumb|right| Пример общения с ботом. Файл этого флоу смотрите в конце статьи]] | ||
== Подготовка == | == Подготовка == | ||
Для настройки Telegram-бота на контроллере [[Wiren Board]] нам понадобится установленный [[Node-Red | Node-RED]] и настроенный модуль [[Node-Red#WB_Nodes |WB Nodes]] и созданный Telegram-бот. | |||
Для настройки Telegram-бота на контроллере [[Wiren Board]] нам понадобится | |||
Настройка делается через встроенный в Node-Red веб-интерфейс, который доступен по адресу '''http://wb-ip-address:1880''', например, http://192.168.42.1:1880. | |||
== Создание бота == | == Создание бота == | ||
Строка 43: | Строка 32: | ||
== Создание ноды для бота == | == Создание ноды для бота == | ||
[[Image: tg-bot-configure-nr.png|300px|thumb|right| Создание ноды телеграм-бота]] | [[Image: tg-bot-configure-nr.png|300px|thumb|right| Создание ноды для телеграм-бота]] | ||
Перед тем, как передавать данные из контроллера в чат с ботом, нам нужно настроить ноду нашего бота: | Перед тем, как передавать данные из контроллера в чат с ботом, нам нужно настроить ноду нашего бота: | ||
# Перетяните в рабочую область ноду '''sender'''. | # Перетяните в рабочую область ноду '''sender'''. | ||
Строка 78: | Строка 67: | ||
# Перетяните в рабочую область ноду '''function'''. | # Перетяните в рабочую область ноду '''function'''. | ||
# Дважды кликните на ней — откроется окно '''Edit function node'''. | # Дважды кликните на ней — откроется окно '''Edit function node'''. | ||
# На вкладке обработчика | # На вкладке обработчика onMessage должна быть написана строка | ||
#:<syntaxhighlight lang="javascript"> | #:<syntaxhighlight lang="javascript"> | ||
return msg; | return msg; | ||
Строка 100: | Строка 89: | ||
Настроим бота так, чтобы он присылал температуру процессора контроллера Wiren Board в ответ на команду <code>/cputemp</code>. | Настроим бота так, чтобы он присылал температуру процессора контроллера Wiren Board в ответ на команду <code>/cputemp</code>. | ||
{{note|info|Перед | {{note|info|Перед настройкой бота очистите рабочее поле — это исключит ложные срабатывания на команду из чата. При очистке все настройки соединения с контроллером и телеграм-ботом сохранятся.}} | ||
=== ChatId === | === ChatId === | ||
[[Image: save-chatId-nr.png|400px|thumb|right| Функция, которая сохраняет chatId]] | [[Image: save-chatId-nr.png|400px|thumb|right| Функция, которая сохраняет chatId]] | ||
Строка 119: | Строка 108: | ||
#* Перетяните в рабочую область ноду '''function'''. | #* Перетяните в рабочую область ноду '''function'''. | ||
#* Дважды кликните на ней — откроется окно '''Edit function node'''. | #* Дважды кликните на ней — откроется окно '''Edit function node'''. | ||
#* На вкладке обработчика | #* На вкладке обработчика onMessage удалите содержимое поля ввода и введите строку: | ||
#*:<syntaxhighlight lang="javascript"> | #*:<syntaxhighlight lang="javascript"> | ||
flow.set("chatId",msg.payload.chatId); | flow.set("chatId",msg.payload.chatId); | ||
Строка 134: | Строка 123: | ||
#* Дважды кликните на ней — откроется окно '''Edit command node'''. | #* Дважды кликните на ней — откроется окно '''Edit command node'''. | ||
#* Выберите в поле '''Bot''' ноду нашего бота. | #* Выберите в поле '''Bot''' ноду нашего бота. | ||
#* Чтобы сохранить настройки, нажмите кнопку '''Done'''. | #* Чтобы сохранить настройки, нажмите кнопку '''Done'''. | ||
# Добавьте запрос температуры процессора контроллера: | # Добавьте запрос температуры процессора контроллера: | ||
Строка 147: | Строка 133: | ||
#* Перетяните в рабочую область ноду '''function'''. | #* Перетяните в рабочую область ноду '''function'''. | ||
#* Дважды кликните на ней — откроется окно '''Edit function node'''. | #* Дважды кликните на ней — откроется окно '''Edit function node'''. | ||
#* На вкладке обработчика | #* На вкладке обработчика onMessage удалите содержимое поля ввода и введите строки: | ||
#*:<syntaxhighlight lang="javascript"> | #*:<syntaxhighlight lang="javascript"> | ||
msg.payload = { | msg.payload = { | ||
Строка 167: | Строка 153: | ||
#* верхний выход ноды '''command''' соедините со входом ноды (WB)'''get'''; | #* верхний выход ноды '''command''' соедините со входом ноды (WB)'''get'''; | ||
#* выход ноды (WB)'''get''' соедините со входом '''function''', где формируется сообщение; | #* выход ноды (WB)'''get''' соедините со входом '''function''', где формируется сообщение; | ||
#* выход | #* выход новы '''function''' соедините со входом ноды '''sender'''. | ||
# Опубликуйте флоу нажатием на кнопку '''Deploy'''. Возле нод '''receiver''' и '''sender''' должны появится надписи ''connected''. | # Опубликуйте флоу нажатием на кнопку '''Deploy'''. Возле нод '''receiver''' и '''sender''' должны появится надписи ''connected''. | ||
Строка 193: | Строка 179: | ||
* [[Media: Node-RED-demo-command.zip | Запрос информации с датчиков контроллера]] | * [[Media: Node-RED-demo-command.zip | Запрос информации с датчиков контроллера]] | ||
* [[Media: Node-RED-demo-command-full.zip | Запрос информации с нескольких датчиков контроллера одновременно]] | * [[Media: Node-RED-demo-command-full.zip | Запрос информации с нескольких датчиков контроллера одновременно]] | ||
Версия 12:46, 4 августа 2021
Подготовка
Для настройки Telegram-бота на контроллере Wiren Board нам понадобится установленный Node-RED и настроенный модуль WB Nodes и созданный Telegram-бот.
Настройка делается через встроенный в Node-Red веб-интерфейс, который доступен по адресу http://wb-ip-address:1880, например, http://192.168.42.1:1880.
Создание бота
Если у вас нет телеграм-бота, то создайте его:
- Установите клиент 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 ноду нашего бота.
- Чтобы сохранить настройки, нажмите кнопку 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 и имя разрешённых пользователей.
Файлы: