Управление кондиционером в серверной комнате через 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» мы получаем удобный инструмент для удалённого управления микроклиматом серверного помещения из любого уголка мира, где есть подключение к Интернет.

?
×

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

    Наши операторы свяжутся с вами при первой возможности

    ×

      Обращение в техническую поддержку

      Сформулируйте, пожалуйста, тему и текст вашего обращения. Вам ответят в течении рабочего дня.

      ×
      Ваша заявка отправлена. Мы свяжемся с вами при первой возможности.