🤖 Telegram + Node-RED: создаём чат-бота для управления умным домом
Как уже ранее в статье про подключение Telegram напрямую к Home Assistant, мы затронули тот факт, что строить различные автоматизации удобнее и практичнее в Node-RED, а также рассмотрели некоторые технические моменты.
Поэтому пришло время разобраться с интеграцией Telegram в Node-RED — визуальном инструменте, который позволяет создавать сложные сценарии без написания громоздкого кода.
В статье рассмотрим: создание бота через BotFather, установку библиотеки node-red-contrib-telegrambot, настройку подключения в Node-RED, создание простейшего эхо-бота, а также обработку команд с помощью узла switch.
Содержание статьи
1. Создание Telegram-бота и получение токена
- Перейдите по ссылке t.me/BotFather и нажмите кнопку «Старт»
- Отправьте команду
/newbotдля создания нового бота - Введите имя бота (например, «Домашний бот») — оно будет отображаться пользователям
- Введите username бота — он должен заканчиваться на
bot(например,myHomeBotилиmy_home_bot) - После успешного создания BotFather выдаст API-ключ — сохраните его, он понадобится позже
2. Установка библиотеки в Node-RED
- Откройте интерфейс Node-RED (
http://IP_сервера:1880) - Нажмите на значок «гамбургера» (три полоски) в правом верхнем углу
- Выберите «Manage palette» (Управление палитрой)
- Перейдите на вкладку «Install» (Установить)
- В строке поиска введите:
node-red-contrib-telegrambot - Нажмите кнопку «Install» рядом с найденным пакетом
3. Подключение бота внутри Node-RED
- Перетащите на рабочую область любой узел, например, telegram sender
- Дважды кликните по нему, чтобы открыть настройки
- Рядом с полем Bot нажмите на значок карандаша ✏️, чтобы добавить новый конфигурационный узел
- В открывшемся окне:
- Name: Введите любое понятное имя (например, «Мой первый бот»)
- Token: Вставьте сюда тот самый токен, который вы скопировали у BotFather
- Нажмите Add (Добавить), а затем Done (Готово)
- В том же окне конфигурации найдите поле Server URL (оно может быть пустым). Скопируйте и вставьте туда адрес:
https://api.telegram.org— это может помочь, если нода не может подставить стандартный URL - В том же окне конфигурации можно указать свой ник аккаунта или ID чата (узнать можно у бота @getidsbot)
4. Пример 1: Эхо-бот (отвечает любым сообщением)
Создадим простейший рабочий поток, который будет принимать любое сообщение и отправлять его обратно. Этот шаг критически важен, чтобы убедиться, что базовая связь работает.
Узел 1: telegram receiver
- Перетащите узел telegram receiver на рабочую область
- Дважды кликните по нему
- В поле Bot выберите созданную вами конфигурацию
- Нажмите Done
Узел 2: function (обработка сообщения)
- Перетащите узел function на рабочую область
- Дважды кликните по нему
- В поле Name напишите, например, «Формирование ответа»
- Скопируйте и вставьте следующий код в поле On Message:
// Этот код получает текст из входящего сообщения и формирует ответ
// 1. Извлекаем ID чата, откуда пришло сообщение
var chatId = msg.payload.chatId;
// 2. Извлекаем текст присланного сообщения
var receivedText = msg.payload.content || "[пустое сообщение]";
// 3. Формируем новое сообщение для отправки
msg.payload = {
chatId: chatId, // Кому отвечаем
type: "message", // ТИП СООБЩЕНИЯ - ЭТО КЛЮЧЕВОЙ МОМЕНТ!
content: "Вы написали: " + receivedText // Текст ответа
};
// 4. Возвращаем msg, чтобы оно ушло дальше по потоку
return msg;
Узел 3: telegram sender
- Перетащите узел telegram sender на рабочую область
- Дважды кликните по нему
- В выпадающем списке Bot выберите вашу конфигурацию
- Остальные поля пока можно не трогать
- Нажмите Done
Запуск:
- Соедините выход telegram receiver со входом function
- Соедините выход function со входом telegram sender
- Нажмите красную кнопку Deploy в правом верхнем углу
5. Пример 2: Обработка команды /start через switch
Теперь давайте сделаем так, чтобы бот отвечал только на конкретную команду, например, /start. Для этого используем узел switch.
Настройка узла switch
- Перетащите узел switch на рабочую область
- Дважды кликните по нему
- В поле Property укажите путь к тексту сообщения:
payload.content - Убедитесь, что в поле «1» выбрано:
- Comparison: ==
- Value type: string
- Value: /start
- Нажмите Add rule (Добавить правило)
- Выберите otherwise — это будет второй выход для всех остальных сообщений
- Нажмите Done
Как теперь работает поток:
- Если пользователь отправит команду
/start→ сообщение пойдёт в первый выход узла switch (к вашему function) - Если пользователь отправит что-то другое → сообщение пойдёт во второй выход (который можно подключить к другому function для ответа «Я понимаю только команду /start»)
Упрощённый код function для команды /start
// Готовим приветственное сообщение
msg.payload = {
chatId: msg.payload.chatId,
type: "message",
content: "✅ Привет! Я подключен к Node-RED и работаю исправно. Команда /start получена."
};
return msg;
Дополнительный function для неизвестных команд (подключается ко второму выходу switch):
msg.payload = {
chatId: msg.payload.chatId,
type: "message",
content: "❌ Я понимаю только команду /start"
};
return msg;
- Добавить команду
/statusдля получения статуса устройств - Подключить узлы Home Assistant для управления светом, климатом и т.д.
- Создать инлайн-кнопки для удобного управления (требуется другой тип узлов)
- Интегрировать с внешними API (погода, курсы валют, напоминания)