Luxeon UPS: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 129: Строка 129:
 
* <code>-s 192.168.29.29 </code> - адрес заббикс-агента, IP адрес RaspberryPi куда подключены датчики
 
* <code>-s 192.168.29.29 </code> - адрес заббикс-агента, IP адрес RaspberryPi куда подключены датчики
 
* <code>-k ups.luxeon.voltage_12v_level</code> имя ключа
 
* <code>-k ups.luxeon.voltage_12v_level</code> имя ключа
  +
=Zabbix Template=
  +
Темплейт (очень упрощенный)
  +
<PRE>
  +
<?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)}&lt;11.5</expression>
  +
<name>ups.luxeon.voltage_12v_level is critical low ( &lt;11.5v during last 5 minutes)</name>
  +
<priority>HIGH</priority>
  +
</trigger>
  +
<trigger>
  +
<expression>{max(5)}&lt;12</expression>
  +
<name>ups.luxeon.voltage_12v_level is low ( &lt;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)}&lt;24</expression>
  +
<name>ups.luxeon.voltage_24v_level is low ( &lt;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)}&lt;23</expression>
  +
<name>ups.luxeon.voltage_24v_level is critical low( &lt;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>
  +
</PRE>

Версия 10:10, 29 декабря 2022

Мониторинг напряжения на UPS Luxeon

Постановка задачи

Есть UPS/инвертор (24В): Файл:Ep3000-pro (1).pdf
К нему подключены 2 батареи по 100 Ач, 12Вб последовательно. RS232 или не работает или использует протокол с которым я не смог разобраться.
Для прогнозирования времени работы единственный способ получить данные - это мониторинг напряжения на аккумуляторах.

Аппаратная часть

Для мониторинга использую то что есть под рукой а именно

  • Raspberry Pi Model 1 (самая старая, какая есть)
  • Датчики INA-219 (2шт)

ina-219

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>