Примеры применения
22.05.2018

Управление розетками IP PDU NetPing через Telegram

Управление розетками IP PDU NetPing через Telegram

Всё ближе пора отпусков. Как и многие другие сотрудники, системные администраторы тоже мечтают провести отпуск где-нибудь вдали от рабочего места. Для большинства системных администраторов, особенно в небольших организациях, отвлечься от работы даже на относительно короткое время не так-то просто. Многие из них единолично несут ответственность за состояние различных компонентов ИТ-инфраструктуры. Как же ИТ-специалисту уйти в отпуск с уверенностью в том, что в его отсутствие компания сможет работать не менее эффективно, чем обычно? Ранее в нашем блоге мы уже рассматривали процесс создания ботов для мессенджера «Telegram». В этой статье мы рассмотрим один из вариантов удалённого управления питанием ИТ-оборудования из любой точки земного шара (при наличии доступа к Интернет) с использованием интеграции мессенджера «Telegram» и устройства удалённого управления электропитанием (IP PDU) NetPing. При необходимости ИТ-специалист отправляет команду на розетку через «Telegram», после применения команды специалисту в «Telegram» приходит уведомление о том, что команда была успешно применена, и розетка изменила свое состояние.

Требуемое оборудование, программное обеспечение и подготовка к разработке:

Для реализации функционала удалённого управления розетками устройства NetPing через «Telegram» потребуется следующий комплект оборудования:

  • Устройство удалённого управления розетками (NetPing 8/PWR-220 v3/SMS, NetPing 4/PWR-220 v3/SMS, NetPing 2/PWR-220 v2/SMS или NetPing 2/PWR-220 v3/ETH) – 1 шт.;
  • Подключаемая нагрузка – количество в зависимости от количества встроенных розеток IP PDU NetPing;
  • ПК или сервер с предустановленной операционной системой Linux или Windows и доступом в Интернет – 1 шт.;
  • Локальная сеть для связи между устройством мониторинга и ПК, на котором выполняется скрипт бота – 1 шт.;
  • Мессенджер «Telegram» на ПК или смартфоне с доступом к Интернет – 1 шт.;

В нашем примере будем использовать устройство NetPing 4/PWR-220 v3/SMS. Считаем, что устройство настроено на работу в вашей локальной сети. Подробнее ознакомиться с настройками можно в документации. Также предполагается, что у вас настроен сервер с OS Ubuntu, и созданы боты в соответствии с рекомендациями этой статьи. В данном примере мы создали бота с именем @NetPing_4PWR_bot. 

Программирование функций управления электропитанием для бота @NetPing_4PWR_bot

Запрограммируем расширенный функционал для нашего бота @NetPing_4PWR_bot. Правим основной файл скрипта управляющего ботом – «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('/relay1', '/relay2')
     markup.row('/relay3', '/relay4')
     markup.row('/npstatus', '/help')
     bot.send_message(message.chat.id, '''
    ***Тестовый бот для управления розетками устройства NetPing 4/PWR-220 v3/SMS***
    Чтобы запросить актуальные данные о состоянии реле используйте команду /npstatus
    Чтобы управлять реле №1 используйте команду /relay1
    Чтобы управлять реле №2 используйте команду /relay2
    Чтобы управлять реле №3 используйте команду /relay3
    Чтобы управлять реле №4 используйте команду /relay4
    Для вызова этой справки используйте команду /help
         ''',
    reply_markup=markup)

# Обработка команды "/npstatus" получение данных о статусе реле
@bot.message_handler(commands=['npstatus'])
def status(m):
     i=1
     while i <=4:
         def relay ():
              r = requests.get(url+'relay.cgi?r'+str(i), auth=auth)
              io = r.text[22:23]               
              if io == '0':
                   io = ('Текущее состояние реле #'
                        + str(i) + ': ' + io + ' выключено')
                   return io
              else:
                   io= ('Текущее состояние реле #'
                        + str(i)  + ': ' + io + ' включено')
                   return io         
         io_stat = relay()           
         sent = bot.send_message(m.chat.id, io_stat )         
         i=i+1

# Обработка команды "/relay1", создание меню.
@bot.message_handler(commands=['relay1'])
def status(m):
     keyboard = types.InlineKeyboardMarkup()
     keyboard.add(*[types.InlineKeyboardButton(text=name,
         callback_data=name) for name in ['Включить реле 1',
     'Выключить реле 1', 'Сбросить реле 1' ]])
     msg = bot.send_message(m.chat.id, '''
         Эта команда позволяет управлять реле 1.
         Выберите необходимое действие: ''',
         reply_markup=keyboard)

# Обработка команды "/relay2", создание меню.
@bot.message_handler(commands=['relay2'])
def status(m):
     keyboard = types.InlineKeyboardMarkup()
     keyboard.add(*[types.InlineKeyboardButton(text=name,
         callback_data=name) for name in ['Включить реле 2',
     'Выключить реле 2', 'Сбросить реле 2' ]])
     msg = bot.send_message(m.chat.id, '''
         Эта команда позволяет управлять реле 2.
         Выберите необходимое действие: ''',
         reply_markup=keyboard)

# Обработка команды "/relay3", создание меню.
@bot.message_handler(commands=['relay3'])
def status(m):
     keyboard = types.InlineKeyboardMarkup()
     keyboard.add(*[types.InlineKeyboardButton(text=name,
         callback_data=name) for name in ['Включить реле 3',
     'Выключить реле 3', 'Сбросить реле 3' ]])
     msg = bot.send_message(m.chat.id, '''
         Эта команда позволяет управлять реле 3.
         Выберите необходимое действие: ''',
         reply_markup=keyboard)

# Обработка команды "/relay4", создание меню.
@bot.message_handler(commands=['relay4'])
def status(m):
     keyboard = types.InlineKeyboardMarkup()
     keyboard.add(*[types.InlineKeyboardButton(text=name,
         callback_data=name) for name in ['Включить реле 4',
     'Выключить реле 4', 'Сбросить реле 4' ]])
     msg = bot.send_message(m.chat.id, '''
         Эта команда позволяет управлять реле 4.
         Выберите необходимое действие: ''',
         reply_markup=keyboard)
 
# Обработка нажатия кнопки меню "Включить реле 1"
@bot.callback_query_handler(func=lambda c: True)
def inline(c):
     if c.data =='Включить реле 1':
         bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='Реле 1 включено',
              parse_mode='Markdown')
         r = requests.get(url+'relay.cgi?r1=1', auth=auth)

#Обработка нажатия кнопки меню "Выключить реле 1"
     elif c.data =='Выключить реле 1':
         bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='Реле 1 выключено',
              parse_mode='Markdown')
         r = requests.get(url+'relay.cgi?r1=0', auth=auth)

#Обработка нажатия кнопки меню "Сбросить реле 1"
     elif c.data =='Сбросить реле 1':
         bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='Реле 1 переключено в инверсное состояние на 10 сек.',
              parse_mode='Markdown')
         r = requests.get(url+'relay.cgi?r1=f,10', auth=auth)
    
# Обработка нажатия кнопки меню "Включить реле 2"
     elif c.data =='Включить реле 2':
         bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='Реле 2 включено',
              parse_mode='Markdown')
         r = requests.get(url+'relay.cgi?r2=1', auth=auth)

#Обработка нажатия кнопки меню "Выключить реле 2"
     elif c.data =='Выключить реле 2':
         bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='Реле 2 выключено',
              parse_mode='Markdown')
         r = requests.get(url+'relay.cgi?r2=0', auth=auth)

#Обработка нажатия кнопки меню "Сбросить реле 2"
     elif c.data =='Сбросить реле 2':
         bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='Реле 2 переключено в инверсное состояние на 10 сек.',
              parse_mode='Markdown')
         r = requests.get(url+'relay.cgi?r2=f,10', auth=auth) 

# Обработка нажатия кнопки меню "Включить реле 3"
     elif c.data =='Включить реле 3':
         bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='Реле 3 включено',
              parse_mode='Markdown')
         r = requests.get(url+'relay.cgi?r3=1', auth=auth)

#Обработка нажатия кнопки меню "Выключить реле 3"
     elif c.data =='Выключить реле 3':
         bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='Реле 3 выключено',
              parse_mode='Markdown')
         r = requests.get(url+'relay.cgi?r3=0', auth=auth)

#Обработка нажатия кнопки меню "Сбросить реле 3"
     elif c.data =='Сбросить реле 3':
         bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='Реле 3 переключено в инверсное состояние на 10 сек.',
              parse_mode='Markdown')
         r = requests.get(url+'relay.cgi?r3=f,10', auth=auth)

# Обработка нажатия кнопки меню "Включить реле 4"
     elif c.data =='Включить реле 4':
         bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='Реле 4 включено',
              parse_mode='Markdown')
         r = requests.get(url+'relay.cgi?r4=1', auth=auth)

#Обработка нажатия кнопки меню "Выключить реле 4"
     elif c.data =='Выключить реле 4':
          bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='Реле 4 выключено',
              parse_mode='Markdown')
         r = requests.get(url+'relay.cgi?r4=0', auth=auth)

#Обработка нажатия кнопки меню "Сбросить реле 4"
     elif c.data =='Сбросить реле 4':
         bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='Реле 4 переключено в инверсное состояние на 10 сек.',
              parse_mode='Markdown')
         r = requests.get(url+'relay.cgi?r4=f,10', auth=auth) 
bot.polling()

Исходные файлы бота можно скачать здесь.

Работа с ботом удалённого управления электропитанием

Активируем диалог с ботом @NetPing_4PWR_bot, в скрипт для управления которым мы добавили новый функционал. После того, как мы отправим боту команду «/start» (1) в окно диалога будет выведена памятка (2), и ниже поля для ввода сообщения появятся кнопки (3), дублирующие команды для управления ботом:

Telegram начало диалога с ботом для управления устройством NetPing 4PWR-220 v3 SMS

Команды «/relay1» - «/relay4» служат для управления розетками устройства NetPing 4/PWR-220 v3/SMS. При выборе команды в окне диалога отображается уведомление о выбранной команде (1) и кнопки для выбора возможных действий (2). На скриншоте ниже последовательно выбраны все четыре команды для управления розетками:

Telegram вывод команд для управления розетками устройства NetPing 4PWR-220 v3 SMS

Рассмотрим подробнее команды управления розетками. Бот управляет розетками устройства NetPing 4/PWR-220 v3/SMS при помощи URL-encoded команд, которые прописаны в коде скрипта бота и назначены кнопкам. Для управления реле доступны команды «Включить», «Выключить» и «Сбросить». Команда «Сбросить» выполняет кратковременное (10 секунд) переключение реле в инверсное состояние (выдача импульса сброса), таким образом выполняется перезагрузка подключённого к розетке оборудования. При выполнении команды в окне диалога выводится уведомление о текущем состоянии реле. На скриншоте ниже результаты последовательного нажатия на кнопки управления реле 1:

Telegram вывод сообщений о статусе реле устройства NetPing 4PWR-220 v3 SMS

Команда «/npstatus» позволяет запросить текущее состояние всех розеток устройства NetPing 4/PWR-220 v3/SMS. В этом примере команда «/npstatus» не имеет кнопок действий, и запрос состояния розеток происходит сразу после выбора команды:

Telegram Вывод текущего состояния всех розеток устройства NetPing 4PWR-220 v3 SMS

Таким образом, мы получили удобный инструмент для удалённого управления питанием различных ИТ-устройств (серверов, коммутаторов, маршрутизаторов, Wi-Fi точек доступа, модемов и прочего оборудования) из любого уголка мира, где есть подключение к Интернет, благодаря которому системный администратор может спокойно ехать в отпуск.


  • Устройство NetPing 2/PWR-220 v2/SMS
  • Устройство NetPing 2/PWR-220 v3/ETH
  • Устройство NetPing 4/PWR-220 v3/SMS
  • Устройство NetPing 8/PWR-220 v3/SMS

Основные теги


Каталог устойств мониторинг серверных комнат и шкафов
Все устройства
Устройство UniPing v3
Устройство UniPing server solution v3/SMS
Устройство NetPing 2/PWR-220 v1/SMS
Устройство NetPing IO v2
Устройства NetPing
Каталог датчиков для устройств NetPing
Устройство NetPing 8/PWR-220 v3/SMS
Устройство NetPing 2/PWR-220 v3/ETH
Устройство NetPing 2/PWR-220 v2/SMS
Устройство NetPing 4/PWR-220 v3/SMS
Устройство NetPing SMS
Устройство NetPing /PWR-220 v3/ETH
Адаптер WiFi VAP11N
Коммутатор PS104GT
Устройство NetPing Mini-UPS
Коммутатор NP-SM4
Сплиттер POE 12В (стандарта 802.3af)
IRC-TR v2 (ИК модуль расширения)
Каталог устройств удалённого управления и распределения электропитания NetPing
Устройство UniPing server solution
Устройство UniPing server solution v3
Датчик разбития стекла (Стекло-3 ИО 329-4), 2м
Переходник для NetPing IO v2
Блок питания 48В 1,5А (мод.HRS20005)
Датчик температуры TS, 1м
Датчик температуры, (T811), 2м
Датчик температуры WT, 1м
Датчик протечки, модель 2605, 2м
Датчик протечки H2О
Датчик температуры 1-wire, (THS), 2м
МАЯК-12-СТ
Датчик движения (PYRONIX COLT QUAD PI ПИК детектор), 2м
Датчик движения (SWAN-QUAD ИК детектор квадросенсор), (2м)
BM8070D Силовое реле 16А/250В на DIN-рейку
MP701 Исполнительный элемент (4 независимых канала по 2 кВт 10А)
Датчик дыма комбинированный (дым/тепло) ИП 212/101-2М-A1R с базой Е412NL
МОЛЛЮСК-12/1,5
Внешний ИБП SKAT-12DC-1.0 Li-ion
ИКС-1 извещатель охранный инфракрасный активный однолучевой
Датчик охранный (Извещатель охранный ИО102-20/Б2П, 2м)
Блок розеток SNR-PDU-08S-1
Устройство NetPing 2/PWR-220 v4/SMS
Устройство UniPing server solution v4/SMS
Устройство NetPing 8/PWR-220 v4/SMS
VT592 кабельный датчик протечки
WLC10 кабель протечки
NetPing Connection board v2 (коммутационная плата для UniPing v3)
Инжектор питания POE (стандарта 802.3af)
NetPing датчик наличия электропитания 995S1
Устройство NetPing 2/PWR-220 v12/ETH
Устройство NetPing 2/PWR-220 v13/GSM3G
Датчик наличия 220В (мод. HRS05005), 1.5м
NetPing удлинитель-разветвитель 1-wire на 5 портов, модель R912R1
NetPing датчик качества электропитания 1-wire 910S20
▼ Все теги
Новинки
PLController BM8070D силовое реле 15A/250В на DIN-рейку
Силовое реле в корпусе для крепления на DIN-рейку предназначено для удаленной коммутации мощной нагрузки.Напряжение подробнее...

Цена: 1 429 руб.

NetPing адаптер датчиков с аналоговым интерфейсом 0-20мА, модель 886A01
Адаптер предназначен для подключения аналоговых датчиков, способен измерять протекающий ток, напряжение подробнее...

Цена: 3 354 руб.

NetPing датчик качества электропитания 1-wire 910S20
Датчик предназначен для мониторинга качества электропитания в розетке. Датчик должен быть подключен подробнее...

Цена: 2 240 руб.

NetPing удлинитель-разветвитель 1-wire на 5 портов, модель R912R1
Активный удлинитель-разветвитель для подключения датчиков 1-wire к устройствам NetPing5 портов для подключения подробнее...

Цена: 1 400 руб.

Устройство NetPing 2/PWR-220 v12/ETH
Управляемый блок удаленного распределения питания по сети Ethernet/Internet (IP PDU)2 независимые управляемые подробнее...

Цена: 8 157 руб.

Устройство NetPing 2/PWR-220 v13/GSM3G
Управляемый блок удаленного распределения питания по сети Ethernet/Internet (IP PDU) c поддержкой управления подробнее...

Цена: 15 700 руб.

NetPing датчик наличия электропитания 995S1
Датчик позволяет определить наличие напряжения в розетке питания. Выполнен в корпусе блока питания с подробнее...

Цена: 1 224 руб.

WLC10 кабель протечки
Чувствительный кабель для использования совместно с датчиком VT592. Может быть смонтирован в труднодоступных подробнее...

Цена: 6 700 руб.

VT592 кабельный датчик протечки
Датчик предназначен для работы совместно с кабелем протечки WLC10. Возможность подключения датчика как подробнее...

Цена: 3 800 руб.

-+ руб. руб.
Итого руб.

Данные о заказе