Ранее в нашем блоге мы рассмотрели процесс создания ботов для мессенджера «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». Подробнее об этих настройках можно прочитать здесь и здесь.
Программирование функций управления кондиционером для бота @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?«), уведомление о превышении температуры верхней границы нормы:
Активируем диалог с ботом @UniPingSSv3_bot, в скрипт для управления которым мы добавили новый функционал. После того, как мы отправим боту команду «/start» (1), в окно диалога будет выведена памятка (2), и ниже поля для ввода сообщения появятся кнопки (3), дублирующие команды для управления ботом:
Для включения и выключения резервного кондиционера в нашем боте настроена команда «/fault» (1). После её выбора в окне диалога отображается уведомление о выбранной команде и кнопки для выбора возможных действий (2):
Сейчас нам нужно включить резервный кондиционер. Выбираем кнопку «Включить резервный кондиционер», после чего получаем сообщение: «Резервный кондиционер включен»:
Теперь ждём сообщения о восстановлении работы основного кондиционера от бота @UniPingSSv3_send_bot. И, если мы его получили, то нужно выключить резервный кондиционер:
Возвращаемся к диалогу с @UniPingSSv3_bot, снова нажимаем кнопку «/fault» (1) и выбираем действие «Выключить резервный кондиционер» (2):
Теперь рассмотрим порядок действий в случае, когда необходимо изменить текущую температуру в серверной. Сначала запросим текущую температуру при помощи команды «/npstatus». Работа с этой командой подробно описана здесь.
Затем выбираем команду «/temp» (1) и с помощью ее действий корректируем текущую температуру (2):
Рассмотрим порядок действий для изменения режима работы кондиционера. Для этого выбираем команду «/mode» (1) и задаём нужный режим работы кондиционера нажатием соответствующей кнопки (2):
На скриншоте ниже результаты последовательного нажатия кнопок-действий команды «/mode»:
В результате организации подобной интеграции устройства мониторинга микроклимата UniPing server solution v3 с мессенджером «Telegram» мы получаем удобный инструмент для удалённого управления микроклиматом серверного помещения из любого уголка мира, где есть подключение к Интернет.