python

Сертифицированный мониторинг температуры

  • понедельник, 7 октября 2019 г. в 00:22:10
https://habr.com/ru/post/470267/
  • Системное администрирование
  • Python


В нашей компании используется Система менеджмента качества (СМК). В рамках одной из сертификации по системе ISO:9001 было предписано собирать показания температуры и влажность в некоторых помещениях, например в серверной или на складах.

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

В связи с этим был повешен самый обычный гигрометр и на протяжении нескольких лет люди ежедневно записывали показания в журнал. Согласитесь, неудобно.


Дабы автоматизировать данную процедуру были начаты поиски устройства для сбора температуры и влажности.

Цель была как то собирать данные и передавать все это в Zabbix. (для СМК не обязателен заббикс, любое место хранения, но делать еще какую то отдельную систему под мониторинг температуры не хотелось).

В принципе было много готовых комплектов для этого, например Equicom PING3 или netping и таких примеров еще куча, так же можно было собрать свою систему на arduino или raspeberry,
но все эти варианты не подходили т.к. все они не имеют сертификации, а точнее метрологической поверки, а следовательно и не могут считаться официальными средствами измерения и не подходят для прохождения ISO:9001.

В итоге был найден прибор умеющий отдавать данные по ethernet и входящий в реестр измерительных средств. Им оказался «Ивит-М.Е.» разработанный в Новосибирске, там же и производящийся. Заказали (заказ кстати идет долго. срок изготовления около месяца, плюс поверка, плюс доставка до Москвы).

Приходит все это вот в таком виде. Когда берешь в руки сразу понимаешь что это российское производство :-)





Блок питания(заказывается отдельно) не подключен к датчику.

По этому разбираем его и начинаем подключать.





Вход подключаем все равно как. ток переменный. я использовал обычный силовой кабель от компа.

На выходе постоянный ток. плюс и минус подписаны прям на плате.

Дальше подключаем провода непосредственно к самому датчику. Согласно инструкции



Сами клеммы выглядят вот так:





Откручиваем, снимаем и из Г-образной половинки выковыриваем вкладыш.
Подключаем питание и сеть.



В итоге получается нечто такое:



Из минусов данного устройства — он не умеет отдавать данные по SNMP, работает по протоколу Modbus.

В принципе есть много SCADA систем и OPC серверов умеющих читать по Modbus, но большинство из них либо платные, либо собирают в какую то свою базу данных из которой тоже не понятно как вытаскивать данные для передачи их в дальнейшем заббиксу.

По этому был написан небольшой скрипт на питоне для прямого обращения к датчику.
Данные в регистрах хранятся в виде float и приходят при обращении к ним вот в таком виде

READ_INPUT_REGISTERS (16855, 57976)

Для конфигурирования датчика есть приложение config-ivit.exe

Настроек там не очень много. можно настроить сеть, почту.



в конфигураторе регистры указаны в 16речной системе, но в питоновском скрипте нужно указывать регистры в 10-тичной системе.

Приводим данные к нормальному читаемому виду согласно стандарту ieee-754.

Реализовать передачу данных полученных от скрипта в заббикс можно двумя путями.

Первый способ: с помощью userparametr, на какой-нибудь узел, где установлен питон и заббикс агент. У меня, например, был на самом заббикс сервере.

import modbus_tk.defines as cst
import modbus_tk.modbus_tcp as modbus_tcp
import sys

def check_reg(reg,ip):
    reg = int(reg)
    master = modbus_tcp.TcpMaster(host=ip, port=int(502))
    master.set_timeout(1.0)
    getDI = master.execute(1,cst.READ_INPUT_REGISTERS, reg, 2)
    Num1 = str(bin(getDI[0]))[2:]
    while len(Num1) < 16:
        Num1 = '0' + Num1

    Num2 = str(bin(getDI[1]))[2:]
    while len(Num2) < 16:
        Num2 = '0' + Num2

    res = Num1 + Num2
    znak = int(res[0], 2)
    znak2 = (0 - 1) ** znak
    e = int(res[1:9], 2) - 127
    exp = 2 ** e
    m = 1 + (int(res[9:], 2) / float(2 ** 23))
    F = znak2 * exp * m
    print(round(F, 1))

check_reg(sys.argv[1],sys.argv[2])

Со стороны заббикса в zabbix_agentd.conf указываем:

UserParameter=check_reg[*], /usr/bin/python /home/appliance/scada.py $1 $2

В самом заббиксе нам нужно будет передать только номер регистра и IP адрес устройства к кому мы хотим обратиться:

например: check_reg[22,192.168.100.100]

Номера регистров:

22 — Влажность
34 — Температура
36 — Точка росы

Второй способ: передавать значения через zabbix_sender. Этот способ удобен тем, что можно создать отдельный узел сети у которого не будет агента, и соответственно можно будет сделать шаблон для многих устройств.

import modbus_tk.defines as cst
import modbus_tk.modbus_tcp as modbus_tcp
import sys, os

def check_reg(reg,ip):
    reg = int(reg)
    master = modbus_tcp.TcpMaster(host=ip, port=int(502))
    master.set_timeout(1.0)
    getDI = master.execute(1,cst.READ_INPUT_REGISTERS, reg, 2)
    Num1 = str(bin(getDI[0]))[2:]
    while len(Num1) < 16:
        Num1 = '0' + Num1

    Num2 = str(bin(getDI[1]))[2:]
    while len(Num2) < 16:
        Num2 = '0' + Num2

    res = Num1 + Num2
    znak = int(res[0], 2)
    znak2 = (0 - 1) ** znak
    e = int(res[1:9], 2) - 127
    exp = 2 ** e
    m = 1 + (int(res[9:], 2) / float(2 ** 23))
    F = znak2 * exp * m
    return round(F, 1)

os.system('zabbix_sender -z 127.0.0.1 -s Ivit1  -k Humidity -o '+ str(check_reg(22,sys.argv[1])))
os.system('zabbix_sender -z 127.0.0.1 -s Ivit1  -k Temper -o '+ str(check_reg(34,sys.argv[1])))
os.system('zabbix_sender -z 127.0.0.1 -s Ivit1  -k Rosa -o '+ str(check_reg(36,sys.argv[1])))


Дальше остается только запустить этот скрипт на выполнение по крону указав только лишь ip адрес устройства

*/1 * * * * /home/ivitsender.py 192.168.100.100

Дальше настраиваем тригеры которые для нас считаются критичными. минимальная/максимальная температура, влажность.

Вот и все. Таким образом мы получили сертифицированный мониторинг температуры, который подходит для прохождения СМК и ISO:9001