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