Luxeon UPS
Мониторинг напряжения на UPS Luxeon
Постановка задачи
Есть UPS/инвертор (24В): Файл:Ep3000-pro (1).pdf
К нему подключены 2 батареи по 100 Ач, 12Вб последовательно. RS232 или не работает или использует протокол с которым я не смог разобраться.
Для прогнозирования времени работы единственный способ получить данные - это мониторинг напряжения на аккумуляторах.
Аппаратная часть
Для мониторинга использую то что есть под рукой а именно
- Raspberry Pi Model 1 (самая старая, какая есть)
- Датчики INA-219 (2шт)
INA-219 подключается по интерфейсу I²C (2 проводной интерфейс), питание на датчик подается с распберри
У распберри
- pin 02 - +5В на Vcc датчиков
- pin 05 - Земля на Gnd датчиков
- pin 03 - I2C SDA (данные) на SDA датчиков
- pin 05 - I2C SCL (синхронизация) на SCL датчиков
Всего на одну шину можно подключить 4 датчика, адрес на шине задается с помошью перемычек (2 перемычки, дают 4 возможных адреса)
Другими словами все датчики подключены к 4 пинам распберри, отдельные пины для каждого датчика не нужны
Программная часть
Требуется включение поддержки I2C со стороны линукса
Самый простой способ - использовать raspi-config
который пропишет все что надо в /etc/modules-load.d/modules.conf
или вручную загрузить нужные модули:
lsmod | grep i2c i2c_bcm2835 16384 0 i2c_dev 20480 0
После загрузки модулей можно просканировать шину на предмет устройств:
i2cdetect 1
Параметр 1
это номер шины I2C ( их может быть более чем одна, но в моем случае - одна, с номером 1, /dev/i2c-1
WARNING! This program can confuse your I2C bus, cause data loss and worse! I will probe file /dev/i2c-1. I will probe address range 0x03-0x77. Continue? [Y/n] y 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 41 -- -- 44 45 -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
В этом примере видно что есть устройства на адресах 0x40
, 0x41
, 0x44
, 0x45
(У меня фактически включены 4 датчика, но 2 не используются)
Для снятия данных с датчика использую простой скрипт на Python
,
библиотека для работы с ina-219 может быть установлена командой pip3 install pi-ina219
#!/usr/bin/env python3 from ina219 import INA219 from ina219 import DeviceRangeError import time SHUNT_OHMS = 0.1 COUNT = 10 def read(): V = ina1.voltage() return V ina1 = INA219(SHUNT_OHMS,address=0x40) ina1.configure() if __name__ == "__main__": c = 0 voltage_summ = 0 while c < COUNT: try: current_voltage = read() if current_voltage < 18: raise ValueError("Voltage can't be < 18v"); voltage_summ = voltage_summ + current_voltage c = c + 1 time.sleep(0.01) except: time.sleep(0.2) pass print("{V1:.3f}".format(V1=voltage_summ/COUNT))
В этом скрипте
ina1 = INA219(SHUNT_OHMS,address=0x40)
- 0x40 это адрес датчика, для снятия данных с нескольких датчиков его можно вынести в параметры или сделать копию скрипта =)if current_voltage < 18: raise ValueError("Voltage can't be < 18v");
нужна для того что бы игнорировать значения ниже 18Вольт, так как иногда происходит ошибка измеренияCOUNT = 10
число измерений, результат берется как среднее значение
Интеграция с системой мониторинга Zabbix
Для того что бы избежать возможных проблем данные снимаются регулярно, раз в минуту используя cron
cat /etc/cron.d/voltage
* * * * * root /etc/zabbix/scripts/voltage_0x40.py > /etc/zabbix/scripts/voltage_24v * * * * * root /etc/zabbix/scripts/voltage_0x41.py > /etc/zabbix/scripts/voltage_12v
Данные по 2 точкам (12В и 24В) сохраняются в тестовые файлы, например /etc/zabbix/scripts/voltage_24v
Zabbix-agent
прочто читает эти файлы и отдает как значения ключей
cat /etc/zabbix/zabbix_agentd.conf.d/UserParameter-voltage.conf
UserParameter=ups.luxeon.voltage_24v_level,/usr/bin/cat /etc/zabbix/scripts/voltage_24v UserParameter=ups.luxeon.voltage_12v_level,/usr/bin/cat /etc/zabbix/scripts/voltage_12v
Проверить работу можно командой zabbix_get
zabbix_get -s 192.168.29.29 -k ups.luxeon.voltage_12v_level 13.698
-s 192.168.29.29
- адрес заббикс-агента, IP адрес RaspberryPi куда подключены датчики-k ups.luxeon.voltage_12v_level
имя ключа
Zabbix Template
Темплейт (очень упрощенный)
<?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>5.0</version> <date>2022-12-29T08:09:19Z</date> <groups> <group> <name>Luxeon</name> </group> </groups> <templates> <template> <template>Temlate Luxeon Voltage</template> <name>Temlate Luxeon Voltage</name> <groups> <group> <name>Luxeon</name> </group> </groups> <applications> <application> <name>Luxeon</name> </application> </applications> <items> <item> <name>ups.luxeon.voltage_12v_level</name> <key>ups.luxeon.voltage_12v_level</key> <value_type>FLOAT</value_type> <units>V</units> <applications> <application> <name>Luxeon</name> </application> </applications> <triggers> <trigger> <expression>{max(5)}<11.5</expression> <name>ups.luxeon.voltage_12v_level is critical low ( <11.5v during last 5 minutes)</name> <priority>HIGH</priority> </trigger> <trigger> <expression>{max(5)}<12</expression> <name>ups.luxeon.voltage_12v_level is low ( <12v during last 5 minutes)</name> <priority>AVERAGE</priority> </trigger> <trigger> <expression>{nodata(15m)}=1</expression> <name>ups.luxeon.voltage_12v_level NODATA</name> <priority>HIGH</priority> </trigger> <trigger> <expression>{max(5)}<24</expression> <name>ups.luxeon.voltage_24v_level is low ( <24v during last 5 minutes)</name> <priority>AVERAGE</priority> </trigger> </triggers> </item> <item> <name>ups.luxeon.voltage_12v_level_5min_avg</name> <type>CALCULATED</type> <key>ups.luxeon.voltage_12v_level_5min_avg</key> <value_type>FLOAT</value_type> <params>avg(ups.luxeon.voltage_12v_level, 5m)</params> <applications> <application> <name>Luxeon</name> </application> </applications> </item> <item> <name>ups.luxeon.voltage_24v_level</name> <key>ups.luxeon.voltage_24v_level</key> <value_type>FLOAT</value_type> <units>V</units> <applications> <application> <name>Luxeon</name> </application> </applications> <triggers> <trigger> <expression>{max(5)}<23</expression> <name>ups.luxeon.voltage_24v_level is critical low( <23v during last 5 minutes)</name> <priority>HIGH</priority> </trigger> <trigger> <expression>{nodata(15m)}=1</expression> <name>ups.luxeon.voltage_24v_level NODATA</name> <priority>HIGH</priority> </trigger> </triggers> </item> <item> <name>ups.luxeon.voltage_24v_level_5min_avg</name> <type>CALCULATED</type> <key>ups.luxeon.voltage_24v_level_5min_avg</key> <value_type>FLOAT</value_type> <params>avg(ups.luxeon.voltage_24v_level, 5m)</params> <applications> <application> <name>Luxeon</name> </application> </applications> </item> </items> <screens> <screen> <name>Voltage</name> <hsize>1</hsize> <vsize>2</vsize> <screen_items> <screen_item> <resourcetype>0</resourcetype> <style>0</style> <resource> <name>UPS Voltage (5min avg)</name> <host>Temlate Luxeon Voltage</host> </resource> <width>1500</width> <height>300</height> <x>0</x> <y>0</y> <colspan>1</colspan> <rowspan>1</rowspan> <elements>0</elements> <valign>0</valign> <halign>0</halign> <dynamic>0</dynamic> <sort_triggers>0</sort_triggers> <url/> <application/> <max_columns>3</max_columns> </screen_item> <screen_item> <resourcetype>0</resourcetype> <style>0</style> <resource> <name>UPS Voltage</name> <host>Temlate Luxeon Voltage</host> </resource> <width>1500</width> <height>300</height> <x>0</x> <y>1</y> <colspan>1</colspan> <rowspan>1</rowspan> <elements>0</elements> <valign>0</valign> <halign>0</halign> <dynamic>0</dynamic> <sort_triggers>0</sort_triggers> <url/> <application/> <max_columns>3</max_columns> </screen_item> </screen_items> </screen> </screens> </template> </templates> <graphs> <graph> <name>UPS Voltage</name> <yaxismin>9</yaxismin> <yaxismax>30</yaxismax> <ymin_type_1>FIXED</ymin_type_1> <ymax_type_1>FIXED</ymax_type_1> <graph_items> <graph_item> <sortorder>1</sortorder> <color>1A7C11</color> <item> <host>Temlate Luxeon Voltage</host> <key>ups.luxeon.voltage_12v_level</key> </item> </graph_item> <graph_item> <sortorder>2</sortorder> <color>F63100</color> <item> <host>Temlate Luxeon Voltage</host> <key>ups.luxeon.voltage_24v_level</key> </item> </graph_item> </graph_items> </graph> <graph> <name>UPS Voltage (5min avg)</name> <yaxismin>9</yaxismin> <yaxismax>30</yaxismax> <ymin_type_1>FIXED</ymin_type_1> <ymax_type_1>FIXED</ymax_type_1> <graph_items> <graph_item> <sortorder>1</sortorder> <color>1A7C11</color> <item> <host>Temlate Luxeon Voltage</host> <key>ups.luxeon.voltage_12v_level_5min_avg</key> </item> </graph_item> <graph_item> <sortorder>2</sortorder> <color>F63100</color> <item> <host>Temlate Luxeon Voltage</host> <key>ups.luxeon.voltage_24v_level_5min_avg</key> </item> </graph_item> </graph_items> </graph> </graphs> </zabbix_export>