Настройка Telegram-бота на контроллере Wiren Board

From Wiren Board
Revision as of 08:30, 4 September 2024 by A.Degtyarev (talk | contribs) (→‎Подготовка)

(diff) ← Older revision | Approved revision (diff) | Latest revision (diff) | Newer revision → (diff)
Пример общения с ботом. Файл этого флоу смотрите в конце статьи

Описание

Телеграмм-бот — это многофункциональный помощник на платформе Телеграм, который понимает команды, может обращаться в API вашего сайта или сервиса.

С помощью телеграм-бота вы можете управлять умным домом, получать состояние устройств или сделать систему напоминаний.

Подготовка

Настройка телеграм-бота на контроллере Wiren Board 6.7.2 с помощью Node-RED

Для настройки Telegram-бота на контроллере Wiren Board нам понадобится:

Настройка делается через встроенный в Node-Red веб-интерфейс, который доступен по адресу http://wb-ip-address:1880, например, http://192.168.42.1:1880.

В примерах мы будем создавать флоу (flows) — это блок-схемы процесса.

Создание бота

Процесс создания нового бота в мессенджере Telegram

Если у вас нет телеграм-бота, то создайте его:

  1. Установите клиент Telegram и зарегистрируйте аккаунт.
  2. Найдите в Telegram бота @BotFather и запустите его.
  3. Создайте нового бота и настройте его:
    • введите команду /newbot,
    • задайте название бота,
    • придумайте и напишите имя бота, оно должно заканчиваться на _bot.
  4. В сообщении об успешном создании нового бота:
    • скопируйте API-токен для подключения к боту,
    • нажмите на ссылку t.me/имя_вашего_бота, откроется диалог с ботом — запустите его командой /start

Всё, теперь мы готовы настраивать его на контроллере Wiren Board.

Установка модуля

Установка модуля node-red-contrib-telegrambot

Чтобы Node-RED смог работать с Telegram, установите модуль node-red-contrib-telegrambot:

  1. Зайдите в веб-интерфейс Node-RED.
  2. В правом верхнем углу вызовите меню.
  3. В открывшемся окне выберите вкладку Управление палитрой (Manager palette).
  4. Перейдите на вкладку Установка (Install), введите в поле поиска telegrambot и нажмите на клавиатуре Enter.
  5. Установите пакет с названием node-red-contrib-telegrambot.
  6. Закройте окно с настройками. Установка модуля завершена.

После установки, в левой панели появится секция telegram.

Создание ноды для бота

Создание ноды телеграм-бота

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

  1. Перетяните в рабочую область ноду sender.
  2. Дважды кликните на ней — откроется окно Edit sender node.
  3. В поле Bot нажмите на кнопку с карандашом, откроется окно Edit telegram bot node.
  4. В открывшемся окне заполните поля:
    • Bot-Name — произвольное имя
    • Token — API-токен, который вы получили при создании бота в мессенджере Telegram.
    • Users — имена telegram-пользователей, которые смогут отправлять боту команды и получать данные.
    • Update Mode — выберите Pooling
    • Poll Interval — установите 1000.
  5. Сохраните настройки нажатием кнопки Done.
  6. Вы вернётесь в окно Edit sender node, в котором нажмите Cancel.

Создание ноды бота завершено, теперь мы можем использовать её для соединения с telegram-ботом.

Пересылка принятых сообщений

Флоу пересылки сообщения
Общение с ботом в чате мессенджера Telegram. Бот отправил обратно принятое сообщение

Добавьте ноду, которая будет принимать сообщения, отправленные в чат с ботом:

  1. Перетяните в рабочую область ноду receiver.
  2. Дважды кликните на ней — откроется окно Edit receiver node.
  3. Выберите в поле Bot созданную раньше ноду бота.
  4. Чтобы сохранить настройки, нажмите кнопку Done.

Добавьте ноду, которая будет отправлять сообщения в чат с ботом:

  1. Перетяните в рабочую область ноду sender.
  2. Дважды кликните на ней — откроется окно Edit sender node.
  3. Выберите в поле Bot ноду бота.
  4. Чтобы сохранить настройки, нажмите кнопку Done.

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

  1. Перетяните в рабочую область ноду function.
  2. Дважды кликните на ней — откроется окно Edit function node.
  3. На вкладке обработчика onMessage должна быть написана строка
    return msg;
    
    это значит, что функция возвращает целиком сообщение, которое пришло на её вход.
  4. Сохраните настройки, нажатием на кнопку Done.

После настройки всех трёх нод, соедините их между собой:

  1. Верхний выход ноды receiver соедините с входом функции.
  2. Выход функции соедините с входом ноды sender.

После настройки нод и соединений между ними, опубликуйте изменения нажатием на кнопку Deploy в правой верхней части веб-интерфейса Node-RED.

Теперь перейдите в чат к боту и отправьте ему произвольное сообщение, если бот прислал это же сообщение вам в ответ, то всё настроено правильно и можно переходить к более сложным задачам.

Запрос информации с датчиков контроллера

Флоу отправки температуры процессора по запросу пользователя. Темно-зелёная нода msg.payload — это вывод отладочных сообщений в debug-консоль
Общение с ботом в чате мессенджера Telegram. Бот в ответ на команду прислал температуру процессора, но не среагировал на другие сообщения

Чтобы Node-RED мог общаться с MQTT-брокером контроллера, у вас должен быть настроен плагин WB Nodes.

Настроим бота так, чтобы он присылал температуру процессора контроллера Wiren Board в ответ на команду /cputemp.

Перед созданием нового флоу очистите рабочее поле — это исключит ложные срабатывания на команду из чата. При очистке все настройки соединения с контроллером и телеграм-ботом сохранятся.

ChatId

Функция, которая сохраняет chatId

ChatId — это идентификатор чата с ботом, он нужен, чтобы бот понимал куда ему отвечать.

В предыдущем примере chatId был в принятом сообщении, которое мы пересылали — поэтому указывать его не было нужно. Сейчас мы будем формировать своё сообщение, поэтому нам нужно знать — кто запросил данные.

Так как chatId есть в любом принятом сообщении, то мы можем его сохранить в момент получения команды, а потом подставить при формировании ответа.

Сохраните chatId в глобальной переменной флоу:

  1. Добавьте ноду приёма сообщений:
    • Перетяните в рабочую область ноду receiver.
    • Дважды кликните на ней — откроется окно Edit receiver node.
    • Выберите в поле Bot созданную раньше ноду бота.
    • Задайте в поле Name имя Save chatId.
    • Чтобы сохранить настройки, нажмите кнопку Done.
  2. Добавьте ноду, которая будет сохранять chatId:
    • Перетяните в рабочую область ноду function.
    • Дважды кликните на ней — откроется окно Edit function node.
    • На вкладке обработчика onMessage удалите содержимое поля ввода и введите строку:
      flow.set("chatId",msg.payload.chatId);
      
      это значит, что функция сохранит chatId из поступившего сообщения в глобальную переменную chatId.
    • Сохраните настройки, нажатием на кнопку Done.

Обработка команды

Настройка получения данных с датчиков контроллера Wiren Board

В предыдущем примере бот реагировал на любое входящее сообщение — теперь мы научим его понимать команды:

  1. Добавьте реакцию на команду /cputemp:
    • Перетяните в рабочую область ноду command.
    • Дважды кликните на ней — откроется окно Edit command node.
    • Выберите в поле Bot ноду нашего бота.
    • Для отображения команды в меню бота в телеграм:
      • Установите галочку для Register at telegram server.
      • Введите описание команды в поле Description.
    • Чтобы сохранить настройки, нажмите кнопку Done.
  2. Добавьте запрос температуры процессора контроллера:
    • Перетяните в рабочую область ноду get, она находится в разделе Wiren Board.
    • Дважды кликните на ней — откроется окно Edit get node.
    • Выберите в поле Server созданное на этапе настройки WB Nodes соединение с контроллером.
    • В поле Channel откройте список каналов и найдите там CPU Temperature.
    • Чтобы сохранить настройки, нажмите кнопку Done.
  3. Теперь настройте формирование ответного сообщения:
    • Перетяните в рабочую область ноду function.
    • Дважды кликните на ней — откроется окно Edit function node.
    • На вкладке обработчика onMessage удалите содержимое поля ввода и введите строки:
      msg.payload = {
      	chatId: flow.get("chatId"), 
      	type: 'message', 
      	content: msg.payload
      };
      return msg;
      
      здесь мы создали ответное сообщение типа message, заполнили chatId и в содержимом передали поступившую из ноды get информацию.
    • Сохраните настройки, нажатием на кнопку Done.
  4. Добавьте ноду, которая отправит наше сообщение в чат с ботом:
    • Перетяните в рабочую область ноду sender.
    • Дважды кликните на ней — откроется окно Edit sender node.
    • Выберите в поле Bot ноду бота.
    • Чтобы сохранить настройки, нажмите кнопку Done.
  5. После настройки всех нод, соедините их между собой:
    • верхний выход ноды receiver соедините с нодой Save chatId;
    • верхний выход ноды command соедините со входом ноды (WB)get;
    • выход ноды (WB)get соедините со входом function, где формируется сообщение;
    • выход ноды function соедините со входом ноды sender.
  6. Опубликуйте флоу нажатием на кнопку Deploy. Возле нод receiver и sender должны появится надписи connected.

Настройка бота завершена.

Запрос данных в телеграм-чате с ботом

Теперь проверим работу нашего бота:

  1. Перейдите в мессенджер Telegram.
  2. Откройте чат с ботом.
  3. Введите команду /cputemp, бот должен прислать ответ:
    /cputemp
    61.414
    

Примеры флоу из статьи

Примеры — это JSON-файлы, которые нужно загрузить в среду Node-RED:

  1. Скачайте архив с примером на компьютер и распакуйте его.
  2. Выберите в меню Node-RED пункт Import и выберите импорт из JSON.
  3. Выберите распакованный на первом шаге файл.
  4. После импорта укажите в параметрах телеграм-бота свой API-Key и имя разрешённых пользователей.

Файлы:

Полезные ссылки