Как получать в Telegram информацию от датчиков, подключенных к устройствам мониторинга и удалённого управления электропитанием NetPing?

«Telegram» – кроссплатформенный мессенджер, позволяющий обмениваться сообщениями и медиафайлами многих форматов. Помимо стандартного обмена сообщениями в диалогах и группах, в мессенджере можно хранить неограниченное количество файлов, вести каналы (микроблоги), создавать и использовать боты. Боты – это сторонние утилиты, которые запускаются внутри приложения «Telegram». По сути это учётные записи, которыми управляют не люди, а программное обеспечение. Для работы могут использоваться программируемые кнопки виртуальной клавиатуры, за счёт которых бот превращается в мини-приложение с интуитивно понятным интерфейсом. Использование бота позволяет в любое время и в любом месте получить актуальную информацию от датчиков, подключённых к устройствам мониторинга и удалённого управления электропитанием NetPing.  

В этой статье мы рассмотрим процесс настройки получения уведомлений от датчиков в Telegram.

Получение информации о срабатывании датчиков, подключённых к UniPing server solution v3 или UniPing server solution v3/SMS по запросу

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

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

Для примера в этой части статьи используется устройство мониторинга UniPing server solution v3, настроенное на работу с датчиками температуры и влажности и с датчиками типа «сухой контакт», которые подключены к IO линиям устройства. Подробнее с настройками устройства можно ознакомиться здесь.

В качестве сервера, на котором выполнятся скрипт нашего бота, используется виртуальная машина с установленной OS Ubuntu 16.04.4 LTS. Интерпретатор языка программирования Python 3.5.2 в системе установлен по умолчанию. Установим менеджер пакетов pip командой sudo apt install python3-pip:

Установка pip

Регистрация нового бота

Предполагается, что у вас уже есть установленный мессенджер «Telegram» с активной учётной записью. 

Для создания новых ботов существует специальный Telegram-бот, @BotFather. Добавить этот бот в мессенджере довольно просто. В поиске приложения выбираем @BotFather, после чего откроется окно взаимодействия с ботом. В окне присутствует кнопка Start или «Начать», если у вас установлена русская локализация. Необходимо её нажать, тогда активируется режим диалога. Весь процесс создания нового бота будет осуществляться посредством общения с @BotFather. 

Telegram Поиск BotFather

Telegram запуск диалога с BotFather

Инициируем диалог с @BotFather и запрашиваем список доступных команд командой «/start»:

Telegram BotFather приветствие

Создаём бота командой «/newbot». После чего @BotFather попросит у нас выбрать имя:

Telegram BotFather создание нового бота

Придумываем имя, пишем его и отправляем. Если имя не занято, то бот создается, и будет предложено создать пользователя для бота. Пользователь может быть с любым именем, но должен заканчиваться на bot, например, NetPingBot или NetPing_bot. В нашем примере имя бота и пользователя – UniPingSSv3_bot:

Telegram BotFather получение токена

После ввода имени основная часть создания бота окончена. В этом сообщении будет токен (1) для доступа к API «Telegram», который нам понадобится позже.

Дополнительно ещё можно указать список поддерживаемых функций, который будет выводиться в диалоговом окне при вводе символа «/». Для этого в диалоге с @BotFather нужно выполнить следующую команду «/setcommands» и следовать подсказкам бота:

Telegram BotFather настройка списка команд

Программирование бота

Теперь необходимо запрограммировать бот на нужные нам действия. Выполнять мы это будем через представленный «Telegram» API при помощи скрипта на языке программирования Python 3. Все работы выполняются в консоли сервера с установленной OS Ubuntu 16.04.4 LTS.

Сначала установим необходимые пакеты «pyTelegramBotAPI» и «requests» при помощи команд: «pip3 install pyTelegramBotAPI» и «pip3 install requests»:

Установка pyTelegramBotAPI

Установка requests

Затем командой «nano conf_bot.py» создаём файл конфигурации бота – «conf_bot.py»:

Создание файла конфигурации бота

Со следующим содержанием:

# Токен, который выдал бот @BotFather при регистрации нового бота
TOKEN = ‘527215903:AAEdmEdDHKF8ePqZsIql4Jf-Xr-0r0STbDE’

# Логин и пароль для устройства мониторинга UniPing server solution v3
auth = (‘visor’, ‘ping’)

# IP адрес устройства мониторинга UniPing server solution v3
url = ‘http://192.168.1.200/’

Текст файла конфигурации бота

Далее командой «nano bot.py» создаём основной файл нашего бота – «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):

    sent = bot.send_message(message.chat.id,

      »’*Тестовый бот NetPing*

      Этот бот может запросить актуальные данные

      с датчиков и IO линий устройства NetPing.

      Для продолжения используйте команду /npstatus»’)

 

# Обработка команды «/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, ‘ Выберите параметр:’,

            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

bot.polling()

Текст скрипта бота

Теперь запускаем созданный файл на выполнение командой: «python3 ./bot.py».

Запуск бота

Если в консоли ничего не выводится, и терминал выглядит «зависшим» — значит, мы всё сделали правильно, и наш бот работает.

Исходные файлы бота можно скачать здесь. Для использования с другим ботом укажите свои данные в файле «conf_bot.py».

Работа с ботом

Не закрываем терминал (оставляем всё как есть) и открываем наш бот в «Telegram» (по логину – в нашем примере @UniPingSSv3_bot, либо по ссылке из сообщения от @BotFather). Запускаем робота кнопкой «Запустить»:

UniPing Server Solution v3 начало работы с ботом

И получаем приветственное сообщение с описанием бота и возможных команд:

UniPing Server Solution v3 приветствие бота

Далее пишем боту команду «/npstatus» и получаем приглашение выбрать интересующий нас параметр:

UniPing Server Solution v3 меню бота

Нажимаем на нужную нам кнопку и получаем данные от датчиков или IO линий устройства мониторинга UniPing server solution v3. Для первого примера была нажата кнопка «Влажность»:

UniPing Server Solution v3 данные о влажности

Чтобы снова вызвать меню выбора параметра, нужно ещё раз отправить боту команду «/npstatus»:

UniPing Server Solution v3 перезапуск меню бота

На скриншотах ниже результаты запроса температур и состояния IO линий:

UniPing Server Solution v3 состояние термодатчиков

UniPing Server Solution v3 состояние IO линий

В результате вышеперечисленных действий мы получим бот для мессенджера «Telegram», который может в любое время и в любом месте (при наличии доступа к сети Интернет) опросить устройство NetPing и получить данные о состоянии датчиков.

Автоматическое получение информации о срабатывании датчиков, подключённых к UniPing server solution v3 или UniPing server solution v3/SMS

В примере выше мы рассмотрели получение информации о состоянии датчиков и IO линий по запросу. Далее рассмотрим пример получения информации в «Telegram» от датчиков и IO линий, подключённых к устройству мониторинга UniPing server solution v3 или UniPing server solution v3/SMS в автоматическом режиме с использованием сервиса «Zapier».

Требуемое оборудование и программное обеспечение

  • Устройство мониторинга UniPing server solution v3 или UniPing server solution v3/SMS (можно использовать и другие модели устройств NetPing с некоторыми нюансами) – 1 шт.;
  • ПК с предустановленной операционной системой Linux или Windows и установленным браузером с доступом к Интернет– 1 шт.;
  • Локальная сеть – 1 шт.;
  • Мессенджер Telegram на ПК или смартфоне с доступом к Интернет – 1 шт.

Регистрация и настройка нового бота

На первом этапе настройки создадим новый бот «Telegram». Процедура аналогична описанной выше в разделе «Регистрация нового бота». Имя нового бота UniPingSSv3_send_bot. Токен для доступа к API «Telegram» нам понадобится позже:

Telegram BotFather создание нового бота_

Далее нужно добавить в «Telegram» служебный бот @ChatFuel, с помощью которого мы добавим нашему новому боту расширенный функционал, который позволит @UniPingSSv3_send_bot получать сообщения из сервиса «Zapier». В поиске набираем @Chatfuel, выбираем из предложенных вариантов @chatfuel_bot и начинаем диалог нажатием кнопки «Запустить»:

Telegram ChatFuel начало диалога

Затем переходим по ссылке из сообщения бота @Chatfuel для установки @UniPingSSv3_send_bot надстройки «Chatfuel»:

Telegram ChatFuel установка надстройки

После перехода по ссылке нажимаем кнопку «Запустить»:

Telegram ChatFuel запуск бота

И нажимаем в появившемся меню кнопку «Новый бот»:

Telegram ChatFuel подключение нового бота

Далее, в поле ввода сообщения указываем токен, который мы ранее получили от @BotFather при создании нашего бота @UniPingSSv3_send_bot. 

Telegram ChatFuel указание токена

После ввода токена мы получаем сообщение об успешной установке надстройки для нашего бота. Добавляем бот в контакт лист (если ещё не добавлен) нажатием ссылки:

Telegram ChatFuel добавление бота в контакт лист

И запускаем его кнопкой «Запустить»:

Telegram ChatFuel запуск бота UniPingSSv3_send_bot

Затем переходим в раздел управления нашим ботом, чтобы создать уникальный ключ, необходимый для привязки бота к системе «Zapier». Отправляем боту команды «/chatfuel» и «/botkey»:

Telegram ChatFuel создание уникального ключа

Настройка Zapier

Далее переходим в систему «Zapier». Для этого в любом удобном браузере открываем сайт «https://zapier.com/». При первом использовании необходимо зарегистрировать новую учетную запись (если у вас есть учётная запись, можете пропустить этот шаг). Для регистрации новой учетной записи нажмите кнопку «Sign Up»:

Zapier регистрация

Можно авторизоваться при помощи аккаунта Google либо указать данные для регистрации вручную:

Zapier регистрация авторизация

После регистрации и авторизации мы можем создать автоматическое действие, так называемый «Zap», который будет отправлять сообщение нашему Telegram-боту при регистрации событий на устройстве мониторинга UniPing server solution v3 или UniPing server solution v3/SMS. Для этого нажимаем кнопку «Маке a Zap!»:

Zapier создание нового Zap

Далее выбираем приложение-триггер, при срабатывании которого будет выполняться «Zap». Нам потребуется получать Webhook сообщение от устройства мониторинга UniPing server solution v3 или UniPing server solution v3/SMS о срабатывании датчиков и изменении состояний IO линий.

Zapier выбор триггера Webhook

Далее выбираем тип Webhook-a, как на скриншоте, и нажимаем кнопку «Save +Continue» для перехода к следующему шагу настройки:

Zapier выбор типа Webhook

На следующем шаге всё оставляем по умолчанию и нажимаем кнопку «Continue» для продолжения настроек:

Zapier настройка Webhook

На следующем шаге будет создана уникальная ссылка, по которой будет передаваться Webhook в «Zap». Нажимаем кнопку «Копировать» в поле ссылки:

Zapier генерация уникальной ссылки для получения Webhook

Теперь ненадолго отложим «Zapier» и перейдем к web-интерфейсу нашего устройства мониторинга, например, UniPing server solution v3/SMS. Здесь нам необходимо настроить настраиваемое уведомление. Для создания настраиваемого уведомления необходимо зайти на страницу «УВЕДОМЛЕНИЯ» web-интерфейса устройства и нажать на строку «кликните сюда для добавления новых данных»:

UniPing Server Solution v3 SMS настройка настраиваемых уведомлений

На этом этапе создадим сообщение о превышении верхней границы нормальной температуры на термодатчике 1:

UniPing Server Solution v3 SMS создание сообщения

Для этого укажем следующие параметры:

  • Вкл. уведомление – активировать чек бокс.
  • Датчик – выбираем из списка «Термо» и «1».
  • Событие – активируем чек-бокс «Выше нормы».
  • Метод уведомления – выбираем из списка «HTTP GET».
  • URL – в этом поле указываем уникальную ссылку на «Zap», которую мы скопировали ранее, и через пробел пишем сообщение. В текст сообщения можно включить информацию из ветки MIB, относящуюся к датчику, IO линии или реле, вызвавшему событие. Формат: {N}, где N — компонент SNMP OID, стоящий перед индексом датчика (подробнее можно прочитать здесь и здесь). В нашем сообщении используется {2} – OID .1.3.6.1.4.1.25728.8800.1.1.2.n — Текущая температура на термодатчике, где n – номер датчика. К сожалению, кириллица не поддерживается системой «Zapier».

Нажимаем «Сохранить изменения». Затем переходим на страницу «ТЕРМОДАТЧИКИ» и искусственно вызываем срабатывание события «Температура выше нормы», задав верхнюю границу нормы меньше текущего значения температуры на датчике:

UniPing Server Solution v3 SMS изменение границ диапазона температуры

Нажимаем кнопку «Применить изменения», возвращаемся к «Zapier» и нажимаем кнопку «Ok, I did this»:

Zapier проверка получения Webhook

Если в настройках нашего устройства мониторинга UniPing server solution v3/SMS мы всё сделали верно, то на следующем шаге мы получим входящее Webhook-сообщение. На этом настройка триггера завершена. Для перехода к настройкам «Действия» нажимаем кнопку «Continue»:

Zapier успешное получение Webhook

На следующем экране выбираем Приложение-действие для нашего «Zap-a». Пишем в поле поиска «Chatfuel for Telegram» и выбираем его из списка вариантов:

Zapier выбор программы для действия

Далее выбираем тип действия, которое будет выполнено программой «Chatfuel for Telegram» при срабатывании триггера, и нажимаем кнопку «Save +Continue»:

Zapier выбор типа действия

На следующем шаге нам необходимо привязать аккаунт нашего Telegram-бота к системе «Zapier». Нажимаем кнопку «Connect an Account» и в открывшемся pop-up окне указываем уникальный ключ, который мы ранее получили у нашего бота @UniPingSSv3_send_bot командой «/botkey»:

Zapier активация диалога подключения аккаунта Telegram

Zapier указание уникального ключа бота

Подтверждаем изменения нажатием кнопок «Yes, Continue» и «Save+Continue».

Затем система предложит нам задать текст сообщения, которое будет отправляться нашему Telegram-боту. Нажимаем кнопку в правом верхнем углу поля «Message» и выбираем из списка «Full Webhook Message». Для перехода к следующему шагу настройки нажимаем кнопку «Continue».

Zapier задание текста передаваемого сообщения

На следующем шаге будет выполнено тестирование работы нашего «Zap-a». Нажимаем кнопку «Send Test to Chatfuel for Telegram»:

Zapier тестирование работы zap действия

И, если тестирование выполнено успешно, мы получаем сообщение об этом в системе «Zapier» и сообщение в телеграмм. Завершаем создание «Zap-a» нажатием кнопки «Finish».

Zapier завершение создания Zap

После этого нам будет предложено назвать наш «Zap» и запустить его на выполнение. Напишем имя «Zap-a» в текстовом поле (у нас NetPing Message) и переведём переключатель выполнения в положение «ON»:

Zapier задание имени Zap

После чего получим сообщение о том, что наш «Zap» работает.

Zapier новый Zap успешно создан

На этом настройку системы «Zapier» для передачи сообщения от устройства мониторинга UniPing server solution v3/SMS в «Telegram» можно считать оконченной.

Настройка UniPing server solution v3/SMS

Вернемся к веб-интерфейсу устройства мониторнга UniPing server solution v3/SMS и добавим важные уведомления для мониторинга датчиков. Настройки производятся аналогично настройкам для термодатчика, которые были описаны в разделе настройки «Zapier». После создания новых настраиваемых уведомлений на устройстве мониторинга UniPing server solution v3/SMS каким либо образом менять настройки сервиса «Zapier» нет необходимости. «Подхватывание» новых сообщений произойдёт автоматически.

UniPing Server Solution v3 SMS настройка сообщений для разных датчиков

В результате всех вышеприведённых настроек в момент изменения статуса датчиков, подключённых к нашему устройству мониторинга, в «Telegram» поступают следующие уведомления:

Получение в Telegram информации от датчиков подключенных к устройствам NetPing