Имеем два ИБП 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.
провалы - это мои изыскания |
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
Мониторинг ожил, тестируем дальше
Комментариев нет:
Отправить комментарий