Примеры применения
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
Устройство NetPing PWR68-01
Датчик мониторинга 220В 1-wire
Адаптер DKST910.8
Устройство NetPing DKST61-01
Блок питания 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
▼ Все теги
Новинки
Датчик воздушного потока (модель АМС520)
Датчик воздушного потока позволяет контролировать наличие или отсутствие напора воздушного потока. Содержит подробнее...

Цена: 2 587 руб.

ИКС-1 извещатель охранный инфракрасный активный однолучевой
Извещатель предназначен для регистрации пересечения нарушителями контролируемой зоны, образованной оптическим подробнее...

Цена: 3 854 руб.

Внешний ИБП SKAT-12DC-1.0 Li-ion
Малогабаритный источник бесперебойного питания (ИБП) со встроенной Li-Ion АКБ. Для питания устройств подробнее...

Цена: 3 200 руб.

МОЛЛЮСК-12/1,5
Малогабаритный блок питания с выходным напряжением 12 В. Имеет уникальный корпус, который позволяет подробнее...

Цена: 950 руб.

Датчик дыма комбинированный (дым/тепло) ИП 212/101-2М-A1R с базой Е412NL
Комбинированный извещатель предназначен для обнаружения возгораний в помещениях различных зданий и сооружений подробнее...

Цена: 2 098 руб.

MP701 Исполнительный элемент (4 независимых канала по 2 кВт 10А)
Силовой модуль коммутации предназначен для обеспечения управления при помощи устройств NetPing силовыми подробнее...

Цена: 1 400 руб.

BM8070D Силовое реле 16А/250В на DIN-рейку
Блок реле для удалённой коммутации мощной нагрузки при помощи устройств NetPing. Изготавливается в корпусе подробнее...

Цена: 1 350 руб.

Датчик движения (SWAN-QUAD ИК детектор квадросенсор), (2м)
Пассивный инфракрасный детектор движения позволяет регистрировать любое движение в зоне до 18 метров. подробнее...

Цена: 1 516 руб.

МАЯК-12-СТ
Оповещатель охранно-пожарный световой стробоскопический предназначен для выдачи световых стробоскопических подробнее...

Цена: 385 руб.

Датчик протечки H2О
Датчик протечки позволяет определить наличие воды в точке установки датчика. Устанавливается в нескольких подробнее...

Цена: 1 450 руб.

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

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