Управление IO линиями устройства NetPing через Telegram

Мы продолжаем публикацию цикла статей по реализации интеграции устройств 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):

NetPing IO v2 схема подключения оборудования

Также предполагается, что у вас настроен сервер с 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), дублирующие команды для управления ботом:

Telegram начало диалога с ботом для управления IO линиями NetPing IO v2

Теперь последовательно ознакомимся с командами. Первая команда «/barrier» предназначена для управления шлагбаумом и имитирует нажатие физической кнопки. При выборе команды в окне диалога отображается уведомление о выбранной команде (1) и кнопки для выбора возможных действий (2). Доступны действия «Открыть шлагбаум» и «Закрыть шлагбаум»:

Telegram команда для управления шлагбаумом подключённым к NetPing IO v2

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

Telegram результат управления шлагбаумом подключённым к NetPing IO v2

Следующая команда «/socket» позволяет управлять питанием управляемой розетки NetPing AC/DIN и соответственно, питанием подключённой к ней нагрузки (в нашем примере роутер). При выборе команды в окне диалога отображается уведомление о выбранной команде (1) и кнопки для выбора возможных действий (2):

Telegram команда для управления розеткой подключённой к NetPing IO v2

Для управления питанием управляемой розетки NetPing AC/DIN доступны команды «Включить», «Выключить» и «Перезагрузить». Команда «Перезагрузить» выполняет кратковременное (10 секунд) переключение линии ввода-вывода в инверсное состояние (выдача импульса сброса), таким образом выполняется перезагрузка подключённого к розетке оборудования. При выполнении команды в окне диалога выводится уведомление о текущем состоянии линии ввода-вывода. На скриншоте ниже результаты последовательного нажатия на кнопки управления розеткой электропитания:

Telegram результаты управления розеткой подключённой к NetPing IO v2

Команда «/door» работает аналогично команде «/barrier», но управляет электрозамком, который подключён к IO линии 3 устройства NetPing IO v2. При выборе команды в окне диалога отображается уведомление о выбранной команде (1) и кнопки для выбора возможных действий (2). Доступны действия «Открыть электрозамок» и «Закрыть электрозамок»:

Telegram команда для управления электрозамком подключённым к NetPing IO v2

При выполнении команды в окне диалога выводится уведомление о текущем состоянии двери в серверную. На скриншоте ниже результаты последовательного нажатия на кнопки управления электрозамком:

Telegram результат управления электрозамком подключённым к NetPing IO v2

Таким образом реализуется удалённое управление дискретными линиями ввода-вывода устройства мониторинга NetPing IO v2 при помощи мессенджера «Telegram».