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

Управление кондиционером в серверной комнате через Telegram

Управление кондиционером в серверной комнате через Telegram

Ранее в нашем блоге мы рассмотрели процесс создания ботов для мессенджера «Telegram», которые позволяли получать информацию от датчиков и IO линий устройства NetPing по запросу и автоматически. В этой статье рассмотрим пример практического использования этих ботов, добавив им функционал, который в связке с устройством мониторинга UniPing server solution v3 позволит в любое время и в любом месте (при наличии доступа к сети Интернет) управлять кондиционером в серверной комнате.

В нашем примере бот имитирует нажатие кнопок на пульте дистанционного управления кондиционером при помощи URL-encoded команд, которые он отправляет устройству мониторинга UniPing server solution v3. Устройство, в свою очередь, посылает ранее записанные в память команды управления при помощи ИК-модуля IRC-TR v2 кондиционеру, который расположен в серверном помещении.

Варианты применения данного решения:

  • Системный администратор через «Telegram» может включить или выключить резервный кондиционер в серверной комнате, когда он находится не на рабочем месте, например, в выходные, праздничные дни или во время отпуска. Поводом для включения резервного кондиционера должно послужить уведомление в «Telegram» о превышении температуры верхней границы нормы, установленной на странице "ТЕРМОДАТЧИКИ" web-интерфейса устройства. Поводом для отключения резервного кондиционера должно послужить уведомление в «Telegram» о срабатывании датчика воздушного потокаустановленного на выходе потока воздуха основного кондиционера, что означает восстановление его работоспособности;
  • Системный администратор через «Telegram» может понизить или повысить температуру охлаждения, не заходя в серверную комнату, и проконтролировать температуру воздуха по показаниям датчика температуры 1-wire (THS);
  • Системный администратор через «Telegram» может изменить режим работы кондиционера, не заходя в серверную комнату.

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

Для реализации функционала управления кондиционером нам потребуется следующий комплект оборудования:

  • UniPing server solution v3 (можно использовать любую модель устройства мониторинга и удалённого управления электропитанием NetPingкоторая поддерживает подключение ИК-модуля расширения IRC-TR v2) – 1 шт.;
  • ИК-модуль IRC-TR v2 – 1 шт.;
  • Датчик температуры 1-wire – 1 шт.;
  • Датчик воздушного потока – 1 шт.;
  • ПК или сервер с предустановленной операционной системой Linux или Windows и доступом в Интернет – 1 шт.;
  • Локальная сеть для связи между устройством мониторинга и ПК, на котором выполняется скрипт бота – 1 шт.;
  • Мессенджер «Telegram» на ПК или смартфоне с доступом к Интернет – 1 шт.

Считаем, что устройство UniPing server solution v3 настроено на работу в вашей локальной сети, и ИК-модуль IRC-TR v2датчик воздушного потока и датчик температуры 1-wire подключены. Подробнее с настройками устройства можно ознакомиться здесь. Также считаем, что устройство UniPing server solution v3 настроено на управление кондиционером. Правила настройки можно прочитать здесь и здесь.

В нашей статье будем использовать следующие параметры устройства UniPing server solution v3:

IP адрес192.168.1.208

Логин

visor

Пароль

ping

Номер подключенного термодатчика

1

Номер IO линии с подключенным датчиком воздушного потока

IO 1

Номер команды включения резервного кондиционера

2

Номер команды выключения резервного кондиционера

3

Номер команды повышения температуры на 1 °C

4

Номер команды понижения температуры на 1 °C

5

Номер команды включения режима «Охлаждение»

6

Номер команды включения режима «Обогрев»

7

Номер команды включения режима «Осушение»

8

Номер команды включения режима «Вентиляция»

9

Номер команды включения ночного режима

10

Номер команды изменения направления шторок кондиционера

11

Номер команды блокировки пульта

12

В разделе «Настраиваемые уведомления» web-интерфейса устройства мониторинга UniPing server solution v3 пропишем уведомления, которые будут отправляться в «Telegram» при превышении температуры верхней границы нормы (1) и при регистрации датчиком воздушного потока наличия потока воздуха от основного кондиционера (2). К сожалению, кириллица не поддерживается системой «Zapier». Подробнее об этих настройках можно прочитать здесь и здесь.

UniPing server solution v3 - настройка уведомлений в Telegram

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

Предполагается, что у вас настроен сервер с OS Ubuntu, и созданы боты в соответствии с рекомендациями предыдущей статьи. Запрограммируем расширенный функционал для нашего бота @UniPingSSv3_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('/npstatus', '/fault')
     markup.row('/temp', '/mode')
     markup.row('/help')
     bot.send_message(message.chat.id, '''
    ***Тестовый бот NetPing***

    Чтобы запросить актуальные данные с датчиков и IO линий устройства NetPing используйте команду /npstatus

    Чтобы включить или выключить аварийный кондиционер используйте команду /fault

    Чтобы повысить/понизить температуру в помещении серверной используйте команду /temp

    Чтобы изменить режим работы кондиционера в помещении серверной используйте команду /mode

    Для вызова этой справки используйте команду /help ''',
    reply_markup=markup)

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

# Обработка команды "/fault", создание меню.
@bot.message_handler(commands=['fault'])
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)

# Обработка команды "/temp", создание меню.
@bot.message_handler(commands=['temp'])
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)

# Обработка команды "/mode", создание меню.
@bot.message_handler(commands=['mode'])
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='Текущие показания термодатчиков UniPing Server Solution v3',
              parse_mode='Markdown')
         i=1
         while i <=8:
              def termo ():
                   r = requests.get(url+'thermo.cgi?t'+str(i), auth=auth)
                   t = r.text[20:22]
                   s = r.text[-3]
                   if s == '0':
                        t = ('Датчик #' +str(i) + ' не подключен или сбоит.')
                        return t
                   else:
                        t= ('Текущая температура на термодатчике #'
                        + str(i)  +':  '+ t + ' градусов С' )
                        return t          
              term = termo()         
              sent = bot.send_message(c.message.chat.id, term )         
              i=i+1
                     
# Обработка нажатия кнопки меню "Влажность"     
     elif c.data =='Влажность':
         bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='Текущие показания датчиков влажности UniPing Server Solution v3',
              parse_mode='Markdown')
         i=1
         while i <=4:
              def rel_hum ():
                   r = requests.get(url+'relhum.cgi?h'+str(i), auth=auth)
                   h = r.text[20:22]
                   s = r.text[-3]
                   if s == '0':
                        h = ('Датчик #' +str(i) + ' не подключен или сбоит.')
                        return h
                   else:
                        h= ('Текущая относительная влажность на датчике #'
                        + str(i)  +':  '+ h + ' %' )
                        return h          
              hum = rel_hum()             
              sent = bot.send_message(c.message.chat.id, hum )          
              i=i+1
   
# Обработка нажатия кнопки меню "Статус IO линии"
     elif c.data =='Cтатус IO линии':
         bot.edit_message_text(
              chat_id=c.message.chat.id,
              message_id=c.message.message_id,
              text='''Текущий статус IO линий UniPing Server Solution v3
              (0 - выкл. 1 - вкл.)''',
              parse_mode='Markdown')
         i=1
         while i <=8:
              def IO_line ():
                   r = requests.get(url+'io.cgi?io'+str(i), auth=auth)
                   io = r.text[20:21]               
                   if io == '0':
                        io = ('Текущее состояние IO линии #'
                            + str(i) + ': ' + io + ' выключено')
                        return io
                   else:
                        io= ('Текущее состояние IO линии #'
                            + str(i)  + ': ' + io + ' включено')
                        return io         
              io_stat = IO_line()         
              sent = bot.send_message(c.message.chat.id, io_stat )           
              i=i+1

# Обработка нажатия кнопки меню "Включить резервный кондиционер"
     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+'ir.cgi?play=2', 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+'ir.cgi?play=3', 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+'ir.cgi?play=4', 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+'ir.cgi?play=5', 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+'ir.cgi?play=6', 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+'ir.cgi?play=7', 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+'ir.cgi?play=8', 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+'ir.cgi?play=9', 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+'ir.cgi?play=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+'ir.cgi?play=11', 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+'ir.cgi?play=12', auth=auth)

bot.polling()

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

Работа с ботом управления кондиционером.

Рассмотрим вариант включения/выключения резервного кондиционера. Если мы получили от бота @UniPingSSv3_send_bot (информацию о боте смотрите в статье "Как получать в Telegram информацию от датчиков, подключенных к устройствам мониторинга и удалённого управления электропитанием NetPing?"), уведомление о превышении температуры верхней границы нормы:

Telegram получение от UniPing server Solution v3 сообщения о превышении температуры

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

Telegram начало диалога с ботом для управления кондиционером

Для включения и выключения резервного кондиционера в нашем боте настроена команда «/fault» (1). После её выбора в окне диалога отображается уведомление о выбранной команде и кнопки для выбора возможных действий (2):

Telegram Включение и выключение резервного кондиционера с помощью UniPing server Solution v3

Сейчас нам нужно включить резервный кондиционер. Выбираем кнопку «Включить резервный кондиционер», после чего получаем сообщение: «Резервный кондиционер включен»:

Telegram включение резеврного кондиционера с помощью UniPing server Solution v3

Теперь ждём сообщения о восстановлении работы основного кондиционера от бота @UniPingSSv3_send_bot. И, если мы его получили, то нужно выключить резервный кондиционер:

Telegram получение от UniPing server Solution v3 сообщения о восстановлении работы основного кондиционера

Возвращаемся к диалогу с @UniPingSSv3_bot, снова нажимаем кнопку «/fault» (1) и выбираем действие «Выключить резервный кондиционер» (2):

Telegram выключение основного кондиционера с помощью UniPing server Solution v3

Теперь рассмотрим порядок действий в случае, когда необходимо изменить текущую температуру в серверной. Сначала запросим текущую температуру при помощи команды «/npstatus». Работа с этой командой подробно описана здесь.

Telegram UniPing server Solution v3 запрос текущей температуры

Затем выбираем команду «/temp» (1) и с помощью ее действий корректируем текущую температуру (2):

Telegram увеличение или уменьшение температуры с помощью UniPing server Solution v3 запрос текущей температуры

Telegram корректировка значения температуры с помощью UniPing server Solution v3

Рассмотрим порядок действий для изменения режима работы кондиционера. Для этого выбираем команду «/mode» (1) и задаём нужный режим работы кондиционера нажатием соответствующей кнопки (2):

Telegram выбор режима работы кондиционера с помощью UniPing server Solution v3

На скриншоте ниже результаты последовательного нажатия кнопок-действий команды «/mode»:

Telegram результаты работы кнопок команды mode

В результате организации подобной интеграции устройства мониторинга микроклимата UniPing server solution v3 с мессенджером «Telegram» мы получаем удобный инструмент для удалённого управления микроклиматом серверного помещения из любого уголка мира, где есть подключение к Интернет.


  • Устройство UniPing server solution v3
  • Устройство UniPing server solution v3/SMS
  • Устройство NetPing 4/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 руб.

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

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