Некоторые картинки не загружаются из РФ и РК, используйте VPN.

вторник, 26 марта 2024 г.

RPi 3B+ NUT UPS Monitoring


Имеем два ИБП Powercom KING PRO KIN-2200AP RM и Powercom KING PRO KIN-3000AP RM и RaspberryPi на собственном ИБП на базе 18650



Хочу мониторить и управлять ИБП с малины. К малине подключены при помощи USB кабеля (2 метра)

Дальше идет описание моих изысканий со всеми ошибками.

Ищем наши ИБП

user@rpi02:~ $ lsusb
Bus 001 Device 004: ID 0d9f:00a7 Powercom Co., Ltd   UPS  KIN-2200AP       FW3.A7
Bus 001 Device 005: ID 0d9f:0002 Powercom Co., Ltd Black Knight PRO / WOW Uninterruptible Power Supply (Cypress HID->COM RS232)

В /etc/nut/nut.conf указываем режим работы сервер

MODE=server

В /etc/nut/ups.conf я их записал так (согласно документации данная модель

[KIN_2200AP]
driver = usbhid-ups
desc = "KIN-2200AP"
port = auto
vendorid = 0d9f
productid = 00a7

[KIN_3000AP]
driver = usbhid-ups
desc = "KIN-3000AP"
port = auto
vendorid = 0d9f
productid = 0002

Попытка запуска завершилась ошибкой

could not detach kernel driver from interface 0: Operation not permitted

Нашел такое решение данной ошибки - создаем правила при подключении устройств:

user@rpi02:~ $ sudo nano /etc/udev/rules.d/90-nut-ups.rules

Вот с таким содержимым (idVendor и idProduct взяты из вывода lsusb)

# /etc/udev/rules.d/90-nut-ups.rules
ACTION=="add", \
SUBSYSTEM=="usb", \
ATTR{idVendor}=="0d9f", ATTR{idProduct}=="00a7", \
MODE="0660", GROUP="nut"

И добавляем второе правило, для другого ИБП, где надо поправить idVendor и idProduct

Проверить текущие права (в фигурных скобках указаны device id из вывода lsusb)

user@rpi02:~ $ ls -la /dev/bus/usb/001/00{4,5}
crw-rw-r-- 1 root root 189, 3 Mar 24 20:19 /dev/bus/usb/001/004
crw-rw-r-- 1 root root 189, 4 Mar 24 20:19 /dev/bus/usb/001/005
user@rpi02:~ $ sudo reboot

После перезагрузки группа сменилась на nut:

user@rpi02:~ $ ls -la /dev/bus/usb/001/00{4,5}
crw-rw---- 1 root nut 189, 3 Mar 24 20:30 /dev/bus/usb/001/004
crw-rw---- 1 root nut 189, 4 Mar 24 20:30 /dev/bus/usb/001/005

В /usr/share/nut/driver.list нашел powercom, тут для product id 0002 сказано "powercom (requires 'usbserial' kernel module)", гугел сказал установить linux-modules-extra

Я не смог найти нужный пакет для моей версии:

user@rpi02:~ $ uname -a
Linux rpi02 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr  3 17:24:16 BST 2023 aarch64 GNU/Linux
user@rpi02:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)       
Release:        11
Codename:       bullseye

Вообще не смог найти, видать это связано с тем, что текущая ОС базируется на debian. К debian гугл говорит о raspberrypi-kernel-headers

Поэтому я решил обновить ОС на rpi. Для этого нужно заменить bullseye на bookworm в файлах /etc/apt/sources.list и /etc/apt/sources.list.d/raspi.list. И добавить в конце non-free-firmware. У меня получилось так:

deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware

Теперь обновляемся

user@rpi02:~ $ sudo apt update
user@rpi02:~ $ sudo apt full-upgrade
user@rpi02:~ $ sudo reboot

После обновления проверить установку raspberrypi-kernel-headers

user@rpi02:~ $ sudo apt install raspberrypi-kernel-headers

Служба nut-server не запускается, при этом в логах ноль:

2024-03-25T02:01:43.292490+03:00 rpi02 systemd[1]: Started nut-server.service - Network UPS Tools - power devices information server.
2024-03-25T02:01:43.305470+03:00 rpi02 systemd[1]: nut-server.service: Main process exited, code=exited, status=1/FAILURE
2024-03-25T02:01:43.306312+03:00 rpi02 systemd[1]: nut-server.service: Failed with result 'exit-code'.

А вот служба nut-driver@KIN_2200AP работает

Как выяснилось после обновления в файле /etc/nut/nut.conf режим сервера указывается так:

MODE=netserver

Теперь один ИБП работает - KIN_2200AP

К rpi подключено по USB два ИБП, а к GPIO подключен SIM800. ls /dev/ttyUSB* показывал только одно устройство, и я предположил, что это sim800. Но вот такой скрипт (найден в интернетах случайно)

#!/bin/bash

for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
    (
        syspath="${sysdevpath%/dev}"
        devname="$(udevadm info -q name -p $syspath)"
        [[ "$devname" == "bus/"* ]] && exit
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && exit
        echo "/dev/$devname - $ID_SERIAL"
    )
done

Показал другую картину:

/dev/ttyUSB0 - POWERCOM_CO.__LTD._USB_to_Serial

Без скрипта простой командой изучаем вывод:

user@rpi02:~ $ udevadm info -a /dev/ttyUSB0

После этого я привел ups.conf к такому виду:

[KIN_2200AP]
driver = usbhid-ups
desc = "KIN-2200AP"
port = auto
vendorid = 0d9f
productid = 00a7

[KIN_3000AP]
driver = powercom
desc = "KIN-3000AP"
port = /dev/ttyUSB0

Перезапустил службу и в логах увидел ошибку Permission denied на /dev/ttyUSB0. Ну тут мы знаем что делать, я сразу явно указал права на устройство:

user@rpi02:~ $ sudo chmod 0660 /dev/ttyUSB0
user@rpi02:~ $ sudo chown root:nut /dev/ttyUSB0

Теперь служба запускается без прямой ошибки, но в логах вот такое:

Data for UPS [KIN_3000AP] is stale - check driver
data receiving error (validation check)

Раз уж исправление прав решает проблему доступа, правим правила udev

user@rpi02:~ $ sudo cp /lib/udev/rules.d/62-nut-usbups.rules /etc/udev/rules.d/
user@rpi02:~ $ sudo nano /etc/udev/rules.d/62-nut-usbups.rules

Если есть такой idVendor+idProduct - правим, иначе добавляем

#  PowerCOM WOW  - powercom 
ATTR{idVendor}=="0d9f", ATTR{idProduct}=="0002", MODE="664", GROUP="nut"

В секцию, где описан данный вендор 0d9f, второй ИБП (0d9f:00a7) там не описан, поэтому наложение правил быть не должно. Но данный вариант устанавливает права только на /dev/usb/001/005, но не на /dev/ttyUSB0, что вызывает ошибку при запуске службы

Для детального изучения проблемы нужно запустить драйвер в режиме логирования. У меня драйвера находятся в /lib/nut/

user@rpi02:~ $ sudo /lib/nut/powercom -a KIN_3000AP -DDDD
0.000000 [D1] debug level is '4'
0.001427 /dev/ttyUSB0 is locked by another process

Эта ошибка из-за запущенной службы драйвера

user@rpi02:~ $ sudo service nut-driver@KIN_3000AP stop

Еще раз запускаем драйвер

user@rpi02:~ $ sudo /lib/nut/powercom -a KIN_3000AP -DDDDDD
Network UPS Tools - PowerCom protocol UPS driver 0.19 (2.8.0)
   0.000000     [D1] debug level is '6'
   0.001403     [D5] send_to_all: SETINFO device.type "ups"
   0.005153     [D2] DTR => 0, RTS => 1
   0.005226     [D1] Values of arguments:
   0.005271     [D1]  manufacturer            : 'PowerCom'
   0.005313     [D1]  model name              : 'Unknown'
   0.005354     [D1]  serial number           : 'Unknown'
   0.005420     [D1]  line voltage            : '230'
   0.005463     [D1]  type                    : 'Trust'
   0.005504     [D1]  number of bytes from UPS: '11'
   0.005547     [D1]  method of flow control  : 'dtr0rts1'
   0.005590     [D1]  validation sequence: '{{5,0},{7,0},{8,0}}'
   0.005632     [D1]  shutdown arguments: '{{0,10},n}'
   0.005721     [D1]  frequency calculation coefficients: '{0.000210,0.000209}'
   0.005768     [D1]  load percentage calculation coefficients: '{6.134300,-0.380800,4.311000,0.181100}'
   0.005819     [D1]  battery percentage calculation coefficients: '{5.000000,0.326800,-825.000000,4.563900,-835.820007}'
   0.005865     [D1]  voltage calculation coefficients: '{0.954500,0.000000}'
   0.005921     [D5] send_to_all: SETINFO driver.version "2.8.0"
   0.005974     [D5] send_to_all: SETINFO driver.version.internal "0.19"
   0.006019     [D5] send_to_all: SETINFO driver.name "powercom"
   0.006065     [D5] send_to_all: SETINFO ups.mfr "PowerCom"
   0.006110     [D5] send_to_all: SETINFO ups.model "Unknown"
   0.006153     [D5] send_to_all: SETINFO ups.serial "Unknown"
   0.006199     [D5] send_to_all: SETINFO ups.model.type "Trust"
   0.006239     [D5] send_to_all: SETINFO input.voltage.nominal "230"
   0.006285     [D5] send_to_all: ADDCMD test.battery.start
   0.006328     [D5] send_to_all: ADDCMD shutdown.return
   0.006370     [D5] send_to_all: ADDCMD shutdown.stayoff
   0.006426     writing error
   0.006708     [D2] dstate_init: sock /run/nut/powercom-KIN_3000AP open on fd 5
   0.006768     [D5] send_to_all: SETINFO driver.parameter.pollinterval "2"
   0.006816     [D5] send_to_all: SETINFO driver.parameter.synchronous "auto"
   0.006897     [D5] send_to_all: SETINFO device.mfr "PowerCom"
   0.006947     [D5] send_to_all: SETINFO device.model "Unknown"
   0.006994     [D5] send_to_all: SETINFO device.serial "Unknown"
   0.007049     writing error
   2.009225     [D5] Num of bytes requested for reading from UPS: 11
   2.126147     [D5] Num of bytes received from UPS: 11
Raw data from UPS:
 0 0x0e ( )
 1 0x5e (^)
 2 0x69 (i)
 3 0x69 (i)
 4 0x32 (2)
 5 0xff (▒)
 6 0x32 (2)
 7 0x00 ( )
 8 0x00 ( )
 9 0x00 ( )
10 0x08 ( )
   2.126432     data receiving error (validation check)
   4.011166     [D5] Num of bytes requested for reading from UPS: 11
   4.087208     [D5] Num of bytes received from UPS: 11
Raw data from UPS:
 0 0x4b (K)
 1 0xd8 (▒)
 2 0x00 ( )
 3 0x00 ( )
 4 0x4b (K)
 5 0x0e ( )
 6 0x5e (^)
 7 0x69 (i)
 8 0x69 (i)
 9 0x32 (2)
10 0xff (▒)
   4.087536     data receiving error (validation check)

Собственно сам то драйвер запускается, да вот с данными что то не так. В топике за 2009 нашел упоминание параметра type для powercom и в моем случае он равен KIN (есть у меня еще ИБП imperial, проверю там IMP/IMPERIAL) и как только я поправил ups.conf сразу полетели нужные данные О_О

Решил попробовать создать симлинк на устройство 0d9f:0002 и указать его в качестве порта в ups.conf, для того, чтобы избежать смены номера порта при переподключениях (/dev/ttyUSBX)

user@rpi02:~ $ sudo nano /etc/udev/rules.d/62-nut-usbups.rules
ATTR{idVendor}=="0d9f", ATTR{idProduct}=="0002", MODE="664", GROUP="nut", SYMLINK+="KIN3000"

После перезагрузки симлинк появился. На права можно не смотреть, так как нас интересуют права на конечный файл

user@rpi02:~ $ ls -la /dev/KIN3000
lrwxrwxrwx 1 root root 15 Mar 26 13:26 /dev/KIN3000 -> bus/usb/001/005
user@rpi02:~ $ ls -la /dev/bus/usb/001/005
crw-rw-r-- 1 root nut 189, 4 Mar 26 13:26 /dev/bus/usb/001/005

Но я не долго радовался, так как получил такую ошибку

tcgetattr(/dev/KIN3000): Inappropriate ioctl for device
Network UPS Tools - PowerCom protocol UPS driver 0.19 (2.8.0)
Driver failed to start (exit status=1)

А теперь поясню за свою глупость. /dev/bus/usb/001/005 - это самое USB устройство (DWC OTG Controller), а /dev/ttyUSB0 - это уже именно serial port. Это видно из вывода (часть данных опущена):

user@rpi02:~ $ udevadm info -a /dev/ttyUSB0
  looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.3/1-1.1.3:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""
    ...

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.3/1-1.1.3:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="cyphidcom"
    ...

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.3/1-1.1.3:1.0':
    KERNELS=="1-1.1.3:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="cypress_m8"
    ...

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.3':
    KERNELS=="1-1.1.3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ....
    ATTRS{configuration}=="Sample HID"
    ATTRS{devnum}=="5"
    ATTRS{devpath}=="1.1.3"
    ATTRS{devspec}=="(null)"
    ATTRS{idProduct}=="0002"
    ATTRS{idVendor}=="0d9f"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="POWERCOM CO., LTD."
    ...
    ATTRS{product}=="USB to Serial"
    ...
	
  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1':
    KERNELS=="1-1.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ...
    ATTRS{idProduct}=="2514"
    ATTRS{idVendor}=="0424"
    ...

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ...
    ATTRS{idProduct}=="2514"
    ATTRS{idVendor}=="0424"
    ...

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ...
    ATTRS{idProduct}=="0002"
    ATTRS{idVendor}=="1d6b"
    ...
    ATTRS{product}=="DWC OTG Controller"
    ...

  looking at parent device '/devices/platform/soc/3f980000.usb':
    KERNELS=="3f980000.usb"
    SUBSYSTEMS=="platform"
    DRIVERS=="dwc2"
    ...

  looking at parent device '/devices/platform/soc':
    KERNELS=="soc"
    SUBSYSTEMS=="platform"
    DRIVERS=="simple-pm-bus"
    ...

  looking at parent device '/devices/platform':
    KERNELS=="platform"
    SUBSYSTEMS==""
    DRIVERS==""
    ...

Т.о. попытка при помощи rules.d поменять права на устройство 0d9f:0002 или сделать symlink бессмысленна, так как драйвер работает не с /dev/bus/usb/001/005, а именно с /dev/ttyUSB0. Т.о. необходимо каким то образом проверить атрибуты родителя. Можно описать все скрипте, но чет я уже устал возится, думаю переживу, тем более вопрос с правами на tty решился банальным добавлением пользователя nut в групп dialout (эта группа определена как владелец всех ttyUSB*).

ПыСы, скрипт пришлось писать через 2 недели, читай ниже

Итак, итог:

user@rpi02:~ $ lsusb
Bus 001 Device 004: ID 0d9f:00a7 Powercom Co., Ltd   UPS  KIN-2200AP       FW3.A7
Bus 001 Device 005: ID 0d9f:0002 Powercom Co., Ltd Black Knight PRO / WOW Uninterruptible Power Supply (Cypress HID->COM RS232)

user@rpi02:~ $  lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 12 (bookworm)
Release:        12
Codename:       bookworm

user@rpi02:~ $  uname -a
Linux rpi02 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr  3 17:24:16 BST 2023 aarch64 GNU/Linux

user@rpi02:~ $ sudo apt-get update && apt-get install nut -y

user@rpi02:~ $ sudo usermod -a -G dialout nut

user@rpi02:~ $ cat /etc/udev/rules.d/90-nut-ups.rules
# /etc/udev/rules.d/90-nut-ups.rules
ACTION=="add"
SUBSYSTEM=="usb", ATTR{idVendor}=="0d9f", ATTR{idProduct}=="00a7", MODE="0660", GROUP="nut"

user@rpi02:~ $ sudo grep -vE "^#|^$" /etc/nut/nut.conf
MODE=netserver

user@rpi02:~ $ sudo grep -vE "^#|^$" /etc/nut/ups.conf
maxretry = 5
[KIN_2200AP]
driver = usbhid-ups
desc = "KIN-2200AP"
port = auto
vendorid = 0d9f
productid = 00a7
[KIN_3000AP]
driver = powercom
desc = "KIN-3000AP"
port = /dev/ttyUSB0
type = KIN

user@rpi02:~ $ sudo grep -vE "^#|^$" /etc/nut/upsd.conf
MAXAGE 15
MAXCONN 8
STATEPATH /var/run/nut
LISTEN 0.0.0.0 3493

user@rpi02:~ $ sudo grep -vE "^#|^$" /etc/nut/upsd.users
[admin]
password = admin
actions = SET
instcmds = ALL

[upsmaster]
password = password
upsmon master

[upsslave]
password = password
upsmon slave

user@rpi02:~ $ sudo grep -vE "^#|^$" /etc/nut/upsmon.conf
MINSUPPLIES 1
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 25
POWERDOWNFLAG /etc/killpower
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

Вот теперь можно прикручивать мониторинг zabbix.


провалы - это мои изыскания

28/03/2024
Как и обещал подключил еще Powercom линейки IMPERIAL - IMP-3000AP, но тут оказалась третья ситуация.
user@fnode2:~ $ lsusb
Bus 001 Device 002: ID 0d9f:00a2 Powercom Co., Ltd Imperial Uninterruptible Power Supply (HID PDC)
user@fnode2:~ $ grep -a1 0d9f /lib/udev/rules.d/62-nut-usbups.rules | grep -a1 00a2
#  PowerCOM IMP - IMPERIAL Series  - usbhid-ups
ATTR{idVendor}=="0d9f", ATTR{idProduct}=="00a2", MODE="664", GROUP="nut"

Согласно комментарию драйвер не Powercom, lsusb показывает нам полноценный USB без всяких COM. Поэтому настраиваем по первому варианту (KIN_2200)

user@fnode2:~ $ sudo chown root:nut /dev/bus/usb/001/002
user@fnode2:~ $ sudo chmod 0664 /dev/bus/usb/001/002
user@fnode2:~ $ sudo grep -vE "^#|^$" /etc/nut/ups.conf
maxretry = 3
[IMP-3000AP]
driver = usbhid-ups
desc = "IMP-3000AP"
vendorid = 0d9f
productid = 00a2
user@fnode2:~ $ sudo grep -vE "^#|^$" /etc/udev/rules.d/90-nut-ups.rules
ACTION=="add"
SUBSYSTEM=="usb", ATTR{idVendor}=="0d9f", ATTR{idProduct}=="00a2", MODE="0660", GROUP="nut"
user@fnode2:~ $  sudo upsdrvctl start IMP-3000AP -DDDD
Network UPS Tools - UPS driver controller 2.7.4
Network UPS Tools - Generic HID driver 0.41 (2.7.4)
USB communication driver 0.33
Error: you must specify a port name in ups.conf. Try -h for help.
Driver failed to start (exit status=1)

О какая интересная ошибка. Создаю симлинк

user@fnode2:~ $ sudo ln -s /dev/bus/usb/001/002 /dev/IMP3000

Правлю ups.conf, запускаю службу и оно взлетает!!!

Конечный конфиг выглядит так

user@fnode2:~ $ sudo grep -vE "^#|^$" /etc/nut/ups.conf
maxretry = 3
[IMP-3000AP]
driver = usbhid-ups
desc = "IMP-3000AP"
port = /dev/IMP3000

user@fnode2:~ $ sudo grep -vE "^#|^$" /etc/udev/rules.d/90-nut-ups.rules
ACTION=="add"
SUBSYSTEM=="usb", ATTR{idVendor}=="0d9f", ATTR{idProduct}=="00a2", MODE="0660", GROUP="nut" , SYMLINK+="IMP3000"

Буду дальше смотреть, как оно себя ведет. На rpi пока есть какие-то провалы, буду сравнивать с двумя другими серверами

12/04/2024

Все таки надо писать скрипт, так как при наличии других USB иногда переключается на другой tty. Погнали

ищем серийный номер

user@rpi02:~ $ sudo udevadm info -a /dev/ttyUSB0 | grep -i serial
    SUBSYSTEMS=="usb-serial"
    ATTRS{product}=="USB to Serial"
    ATTRS{serial}=="3f980000.usb"

Вот он 3f980000.usb, идем в файл и добавляем строчку с указанием серийного номера и запуск скрипта

user@rpi02:~ $ sudo nano /etc/udev/rules.d/62-nut-usbups.rules
ATTR{idVendor}=="0d9f", ATTR{idProduct}=="0002", ATTRS{serial}=="3f980000.usb" MODE="664", GROUP="nut" RUN+="/opt/script/test.sh '$env{ID_SERIAL}' '$links' '$devnode'"

Пишем скрипт

user@rpi02:~ $ sudo nano /opt/scripts/test.sh
#!/bin/bash

logFile="/opt/scripts/test.log"

nameScript=$(basename "$0")
if [ "$(pgrep -c "$nameScript")" -gt 1 ]
then
        echo  "Script is run"
        exit
fi

# Debugging info
echo -e "---\n"                             >> $logFile
date                                        >> $logFile
echo "USB Device '$1' plugged in..."        >> $logFile
echo "Current symlinks (in /dev dir): "$2   >> $logFile
echo "Name of the device node: "$3          >> $logFile
echo "Vendor ID: "$ID_VENDOR_ID             >> $logFile
echo "Model ID: "$ID_MODEL_ID               >> $logFile

# Do other stuff...
exit 0
user@rpi02:~ $ sudo chmod +x /opt/scripts/test.sh

На всякий случай создаем файл и ставим ему права

user@rpi02:~ $ sudo touch /opt/scripts/test.log
user@rpi02:~ $ sudo chmod 777 /opt/scripts/test.log

перезапустим udev

sudo udevadm control --reload-rules && sudo udevadm trigger && cat /opt/scripts/test.log

не прокатило, вангую трабл в серийном номере, хотя, внимательный читатель обратит внимание на то, что я пропустил пару запятых в правиле udev

ATTR{idVendor}=="0d9f", ATTR{idProduct}=="0002", ATTRS{serial}=="3f980000.usb", MODE="664", GROUP="nut", RUN+="/opt/scripts/test.sh '$env{ID_SERIAL}' '$links' '$devnode'"

Стоит обратить внимание, что не всегда срабатывает с первого раза. Благодаря дате в логе, видно когда получены данные

user@rpi02:~ $ sudo udevadm control --reload-rules && sudo udevadm trigger && cat /opt/scripts/test.log
---

Fri Apr 12 15:08:09 MSK 2024
USB Device 'POWERCOM_CO.__LTD._USB_to_Serial' plugged in...
Current symlinks (in /dev dir):
Name of the device node: /dev/bus/usb/001/005
Vendor ID: 0d9f
Model ID: 0002

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

user@rpi02:~ $ udevadm info -t /dev/bus/usb/001/005 

Вот так получим только адрес самого tty

udevadm info -t /dev/bus/usb/001/005 | grep DEVNAME | grep tty | awk -F"=" '{print $2}'

Добавим в скрипт получение адреса tty и создание симлинка:

#!/bin/bash
nameScript=$(basename "$0")
nameFolder=$(dirname "$0")
logFile="$nameFolder/crtSymlink.log"

if [ "$(pgrep -c "$nameScript")" -gt 1 ]; then exit; fi

echo -e "---\n"                             > $logFile
date                                        >> $logFile

if [[ "$4" == "" ]]
then
        echo "Name for sysmlink is empty" >> $logFile
        exit
fi

tty_addr=`udevadm info -t $3 | grep DEVNAME | grep tty | awk -F"=" '{print $2}' | head -n 1`

echo "USB Device '$1' plugged in..."        >> $logFile
echo "Current symlinks (in /dev dir): "$2   >> $logFile
echo "Name of the device node: "$3          >> $logFile
echo "Vendor ID: "$ID_VENDOR_ID             >> $logFile
echo "Model ID: "$ID_MODEL_ID               >> $logFile
echo "TTY ID: "$tty_addr               >> $logFile

if [[ "$tty_addr" == "" ]]
then
        echo "TTY ID is empty" >> $logFile
else
        symLink="/dev/$4"
        [[ -L $symLink ]] && unlink $symLink
        ln -s $tty_addr $symLink
fi
exit 0

и назовем его уже по человечески:

user@rpi02:~ $ sudo mv /opt/scripts/test.sh /opt/scripts/nut/createSymlink.sh
user@rpi02:~ $ sudo /opt/scripts/nut/createSymlink.sh
pgrep: pattern that searches for process name longer than 15 characters will result in zero matches
Try `pgrep -f' option to match against the complete command line.

user@rpi02:~ $ sudo mv /opt/scripts/nut/createSymlink.sh /opt/scripts/nut/crtSymlink.sh

В правиле в /etc/udev/rules.d/62-nut-usbups.rules добавим 4 параметр - название для симлинка

ATTR{idVendor}=="0d9f", ATTR{idProduct}=="0002", ATTRS{serial}=="3f980000.usb", MODE="664", GROUP="nut", RUN+="/opt/scripts/nut/crtSymlink.sh '$env{ID_SERIAL}' '$links' '$devnode' 'KIN3000'"

Проверяем:

user@rpi02:~ $ sudo udevadm control --reload-rules && sudo udevadm trigger && cat /opt/scripts/nut/crtSymlink.log
---

Fri Apr 12 17:06:24 MSK 2024
USB Device 'POWERCOM_CO.__LTD._USB_to_Serial' plugged in...
Current symlinks (in /dev dir):
Name of the device node: /dev/bus/usb/001/005
Vendor ID: 0d9f
Model ID: 0002
TTY ID: /dev/ttyUSB0

Правим конфиг nut

user@rpi02:~ $ sudo nano /etc/nut/ups.conf
maxretry = 5
[KIN_2200AP]
driver = usbhid-ups
desc = "KIN-2200AP"
port = auto
vendorid = 0d9f
productid = 00a7
[KIN_3000AP]
driver = powercom
desc = "KIN-3000AP"
port = /dev/KIN3000
type = KIN

Все. Можно перезагрузить и проверить


17/04/2024

Оказывается нельзя отправлять данные на /dev/ttyUSBx (ИБП), после этого ИБП KIN-3000ap вырубился, но не сразу, в минут через 10. При этом сам он не включился, когда пришли посмотреть, Line mode горела, а Boost мигала. Чаще у нас напряжение около 200 Вольт

При этом zabbix фиксирует странные показатели, когда уровень заряда батарей падает до 40% за 15 секунд О_О

Еще один ИБП KIN-2200 подключен к серверу Zabbix по USB, но есть и COM порт. Подключили по COM порту. 

user@zabbix:~$ dmesg | grep tty
[    0.000000] console [tty0] enabled
[    0.690930] 00:07: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
vint@zabbix:~$ sudo grep -vE "^#|^$" /etc/nut/ups.conf
maxretry = 3
[KIN_2200AP]
driver = powercom
desc = "KIN-2200AP"
port=/dev/ttyS0
user@zabbix:~$ sudo /lib/nut/powercom -DDDDDD -a KIN_2200AP
Password:
Network UPS Tools - PowerCom protocol UPS driver 0.13 (2.7.1)
   0.000000     send_to_all: SETINFO driver.parameter.port "/dev/ttyS0"
   0.000027     debug level is '6'
   0.000867     /dev/ttyS0 is locked by another process

Какая интересная ошибка, я даже выпал на некоторое время, пока не сообразил что служба nut и заблокировала файл

user@zabbix:~$ sudo service nut-server stop
user@zabbix:~$ sudo service nut-client stop
user@zabbix:~$ sudo /lib/nut/powercom -DDDDDD -a KIN_2200AP
Network UPS Tools - PowerCom protocol UPS driver 0.13 (2.7.1)
   0.000000     send_to_all: SETINFO driver.parameter.port "/dev/ttyS0"
   0.000028     debug level is '6'
   0.001055     DTR => 0, RTS => 1
   0.001080     Values of arguments:
   0.001083      manufacturer            : 'PowerCom'
   0.001085      model name              : 'Unknown'
   0.001087      serial number           : 'Unknown'
   0.001100      line voltage            : '230'
   0.001103      type                    : 'Trust'
   0.001112      number of bytes from UPS: '11'
   0.001114      method of flow control  : 'dtr0rts1'
   0.001117      validation sequence: '{{5,0},{7,0},{8,0}}'
   0.001120      shutdown arguments: '{{0,10},n}'
   0.001124      frequency calculation coefficients: '{0.000210,0.000209}'
   0.001128      load percentage calculation coefficients: '{6.134300,-0.380800,4.311000,0.181100}'
   0.001134      battery percentage calculation coefficients: '{5.000000,0.326800,-825.000000,4.563900,-835.820007}'
   0.001138      voltage calculation coefficients: '{0.954500,0.000000}'
   0.001145     send_to_all: SETINFO device.type "ups"
   0.001149     send_to_all: SETINFO driver.version "2.7.1"
   0.001153     send_to_all: SETINFO driver.version.internal "0.13"
   0.001156     send_to_all: SETINFO driver.name "powercom"
   0.001159     send_to_all: SETINFO ups.mfr "PowerCom"
   0.001163     send_to_all: SETINFO ups.model "Unknown"
   0.001166     send_to_all: SETINFO ups.serial "Unknown"
   0.001176     send_to_all: SETINFO ups.model.type "Trust"
   0.001179     send_to_all: SETINFO input.voltage.nominal "230"
   0.001182     send_to_all: ADDCMD test.battery.start
   0.001185     send_to_all: ADDCMD shutdown.return
   0.001188     send_to_all: ADDCMD shutdown.stayoff
   0.001281     Num of bytes requested for reading from UPS: 11
   0.103254     Num of bytes received from UPS: 11
Raw data from UPS:
 0 0x0c ( )
 1 0x64 (d)
 2 0x6c (l)
 3 0x6c (l)
 4 0x32 (2)
 5 0xff (▒)
 6 0x32 (2)
 7 0x00 ( )
 8 0x00 ( )
 9 0x00 ( )
10 0x08 ( )
   0.103382     data receiving error (validation check)
   0.103503     dstate_init: sock /var/run/nut/powercom-KIN_2200AP open on fd 6
   0.103548     send_to_all: SETINFO driver.parameter.pollinterval "2"
   0.103569     send_to_all: SETINFO device.mfr "PowerCom"
   0.103590     send_to_all: SETINFO device.model "Unknown"
   0.103606     send_to_all: SETINFO device.serial "Unknown"
   0.103689     Num of bytes requested for reading from UPS: 11
   3.159810     data receiving error (0 instead of 11 bytes)
   3.159955     Num of bytes requested for reading from UPS: 11
   3.262548     Num of bytes received from UPS: 11

Ну тут я уж догадался, что драйверу нужно пояснить о ком идет речь и добавить type в конфиг

user@zabbix:~$ sudo grep -vE "^#|^$" /etc/nut/ups.conf
maxretry = 3
[KIN_2200AP]
driver = powercom
desc = "KIN-2200AP"
port=/dev/ttyS0
type = KIN

Мониторинг ожил, тестируем дальше

Комментариев нет:

Отправить комментарий