Мы продолжаем публикацию цикла статей по реализации интеграции устройств NetPing с мессенджером «Telegram». Ранее в нашем блоге мы достаточно подробно рассматривали процесс создания ботов для мессенджера «Telegram», управление розетками IP PDU NetPing через Telegram и управление кондиционером в серверной комнате через Telegram. В этой статье мы рассмотрим процесс настройки бота для управления дискретными линиями ввода-вывода устройства мониторинга NetPing IO v2. Подобная интеграция может применяться на практике в следующих случаях:
- Обслуживающий персонал с помощью мессенджера «Telegram» может отправлять команду на открытие и закрытие шлагбаума. В этом случае использование бота позволяет отказаться от использования обычной механической стационарной кнопки в пользу варианта удалённого управления посредством мобильного телефона и/или планшета. Шлагбаум подключается к BM8070D силовое реле 16А/250В на DIN-рейку, которое в свою очередь подключается к IO линии устройства мониторинга NetPing IO v2;
- Технический персонал с помощью мессенджера «Telegram» может управлять нагрузкой (сервер, коммутатор, роутер, освещение, вентиляция и прочее), подключённой к управляемой розетке NetPing AC/DIN, в независимости от своего географического положения;
- Технический персонал с помощью мессенджера «Telegram» может удалённо открывать или закрывать электрозамок на входной двери в серверную комнату тем самым обеспечивая дополнительную защиту от проникновения посторонних лиц на объект.
Требуемое оборудование, программное обеспечение и подготовка к разработке
Для реализации функционала удалённого управления дискретными линиями ввода-вывода устройства NetPing через «Telegram» потребуется следующий комплект оборудования:
- Устройство мониторинга NetPing IO v2 – 1 шт.;
- BM8070D силовое реле 16А/250В на DIN-рейку – 1 шт.;
- Шлагбаум – 1 шт.;
- Управляемая розетка NetPing AC/DIN – 1 шт.;
- Электрозамок на входной двери в серверную комнату – 1 шт.
- ПК или сервер с предустановленной операционной системой Linux или Windows и доступом в Интернет – 1 шт.;
- Локальная сеть для связи между устройством мониторинга и ПК, на котором выполняется скрипт бота – 1 шт.;
- Мессенджер «Telegram» на ПК или смартфоне с доступом к Интернет – 1 шт.
Считаем, что устройство мониторинга NetPing IO v2 настроено на работу в вашей локальной сети. BM8070D силовое реле 16А/250В на DIN-рейку, управляемая розетка NetPing AC/DIN и электрозамок подключены к соответствующим линиям ввода-вывода устройства NetPing IO v2 и настроены. Подробнее ознакомиться с настройками NetPing IO v2 можно в документации.
Ниже представлена примерная схема подключения оборудования к устройству мониторинга NetPing IO v2 (более подробную информацию по подключению внешних устройств можно посмотреть в руководстве пользователя на странице «Подключение датчиков» либо обратиться в службу технической поддержки по адресу support@netping.ru):
Также предполагается, что у вас настроен сервер с OS Ubuntu, и созданы боты в соответствии с рекомендациями этой статьи. В данном примере мы создали бота с именем @NetPing_IO_bot.
Программирование функций управления дискретными линиями ввода-вывода для бота @NetPing_IO_bot
Запрограммируем расширенный функционал для нашего бота @NetPing_IO_bot. Бот управляет дискретными линиями ввода-вывода устройства NetPing IO v2 при помощи URL-encoded команд, которые прописаны в коде скрипта бота и назначены кнопкам. Правим основной файл скрипта управляющего ботом – «bot.py»:
import telebot import requests from telebot import types import conf_bot auth = conf_bot.auth url = conf_bot.url bot = telebot.TeleBot(conf_bot.TOKEN) # Обработка команд "/start" и "/help" @bot.message_handler(commands=['start', 'help']) def start(message): markup = types.ReplyKeyboardMarkup() markup.row('/barrier', '/socket', '/door') markup.row('/help') bot.send_message(message.chat.id, ''' ***Тестовый бот для управления IO линиями устройства NetPing IO v2*** Чтобы открыть или закрыть шлагбаум используйте команду /barrier Чтобы включить, выключить или перезагрузить роутер используйте команду /socket Чтобы открыть или закрыть дверь в серверную используйте команду /door Для вызова этой справки используйте команду /help ''', reply_markup=markup) # Обработка команды "/barrier", создание меню. @bot.message_handler(commands=['barrier']) def status(m): keyboard = types.InlineKeyboardMarkup() keyboard.add(*[types.InlineKeyboardButton(text=name, callback_data=name) for name in ['Открыть шлагбаум', 'Закрыть шлагбаум']]) msg = bot.send_message(m.chat.id, ''' Эта команда позволяет открыть или закрыть шлагбаум. Выберите необходимое действие: ''', reply_markup=keyboard) # Обработка команды "/socket", создание меню. @bot.message_handler(commands=['socket']) def status(m): keyboard = types.InlineKeyboardMarkup() keyboard.add(*[types.InlineKeyboardButton(text=name, callback_data=name) for name in ['Включить розетку', 'Выключить розетку', 'Перезагрузить розетку' ]]) msg = bot.send_message(m.chat.id, ''' Эта команда позволяет управлять розеткой электропитания. Выберите необходимое действие: ''', reply_markup=keyboard) # Обработка команды "/door", создание меню. @bot.message_handler(commands=['door']) def status(m): keyboard = types.InlineKeyboardMarkup() keyboard.add(*[types.InlineKeyboardButton(text=name, callback_data=name) for name in ['Открыть электрозамок', 'Закрыть электрозамок' ]]) msg = bot.send_message(m.chat.id, ''' Эта команда позволяет открывать или закрывать электрозамок на двери в серверную. Выберите необходимое действие: ''', reply_markup=keyboard) # Обработка нажатия кнопки меню "Открыть шлагбаум" @bot.callback_query_handler(func=lambda c: True) def inline(c): if c.data =='Открыть шлагбаум': bot.edit_message_text( chat_id=c.message.chat.id, message_id=c.message.message_id, text='Шлагбаум открыт', parse_mode='Markdown') r = requests.get(url+'io.cgi?io1=1', auth=auth) #Обработка нажатия кнопки меню "Закрыть шлагбаум" elif c.data =='Закрыть шлагбаум': bot.edit_message_text( chat_id=c.message.chat.id, message_id=c.message.message_id, text='Шлагбаум закрыт', parse_mode='Markdown') r = requests.get(url+'io.cgi?io1=0', auth=auth) # Обработка нажатия кнопки меню "Включить розетку" elif c.data =='Включить розетку': bot.edit_message_text( chat_id=c.message.chat.id, message_id=c.message.message_id, text='Роутер включен', parse_mode='Markdown') r = requests.get(url+'io.cgi?io2=0', auth=auth) #Обработка нажатия кнопки меню "Выключить розетку" elif c.data =='Выключить розетку': bot.edit_message_text( chat_id=c.message.chat.id, message_id=c.message.message_id, text='Роутер выключен', parse_mode='Markdown') r = requests.get(url+'io.cgi?io2=1', auth=auth) #Обработка нажатия кнопки меню "Перезагрузить розетку" elif c.data =='Перезагрузить розетку': bot.edit_message_text( chat_id=c.message.chat.id, message_id=c.message.message_id, text='Роутер перезагружен', parse_mode='Markdown') r = requests.get(url+'io.cgi?io2=f,10', auth=auth) # Обработка нажатия кнопки меню "Открыть электрозамок" elif c.data =='Открыть электрозамок': bot.edit_message_text( chat_id=c.message.chat.id, message_id=c.message.message_id, text='Дверь в серверную открыта', parse_mode='Markdown') r = requests.get(url+'io.cgi?io3=1', auth=auth) #Обработка нажатия кнопки меню "Закрыть электрозамок" elif c.data =='Закрыть электрозамок': bot.edit_message_text( chat_id=c.message.chat.id, message_id=c.message.message_id, text='Дверь в серверную закрыта', parse_mode='Markdown') r = requests.get(url+'io.cgi?io3=0', auth=auth) bot.polling()
Исходные файлы бота можно скачать здесь.
Работа с ботом удалённого управления IO линиями устройства NetPing IOv2
Активируем диалог с ботом @NetPing_IO_bot, в скрипт для управления которым мы добавили новый функционал. После того, как мы отправим боту команду «/start» (1), в окно диалога будет выведена памятка (2), и ниже поля для ввода сообщения появятся кнопки (3), дублирующие команды для управления ботом:
Теперь последовательно ознакомимся с командами. Первая команда «/barrier» предназначена для управления шлагбаумом и имитирует нажатие физической кнопки. При выборе команды в окне диалога отображается уведомление о выбранной команде (1) и кнопки для выбора возможных действий (2). Доступны действия «Открыть шлагбаум» и «Закрыть шлагбаум»:
При выполнении команды в окне диалога выводится уведомление о текущем состоянии шлагбаума. На скриншоте ниже результаты последовательного нажатия на кнопки управления шлагбаумом:
Следующая команда «/socket» позволяет управлять питанием управляемой розетки NetPing AC/DIN и соответственно, питанием подключённой к ней нагрузки (в нашем примере роутер). При выборе команды в окне диалога отображается уведомление о выбранной команде (1) и кнопки для выбора возможных действий (2):
Для управления питанием управляемой розетки NetPing AC/DIN доступны команды «Включить», «Выключить» и «Перезагрузить». Команда «Перезагрузить» выполняет кратковременное (10 секунд) переключение линии ввода-вывода в инверсное состояние (выдача импульса сброса), таким образом выполняется перезагрузка подключённого к розетке оборудования. При выполнении команды в окне диалога выводится уведомление о текущем состоянии линии ввода-вывода. На скриншоте ниже результаты последовательного нажатия на кнопки управления розеткой электропитания:
Команда «/door» работает аналогично команде «/barrier», но управляет электрозамком, который подключён к IO линии 3 устройства NetPing IO v2. При выборе команды в окне диалога отображается уведомление о выбранной команде (1) и кнопки для выбора возможных действий (2). Доступны действия «Открыть электрозамок» и «Закрыть электрозамок»:
При выполнении команды в окне диалога выводится уведомление о текущем состоянии двери в серверную. На скриншоте ниже результаты последовательного нажатия на кнопки управления электрозамком:
Таким образом реализуется удалённое управление дискретными линиями ввода-вывода устройства мониторинга NetPing IO v2 при помощи мессенджера «Telegram».