История подключения IMP-425AP
Выбран данный девайс был из соображений соотношения
цены/качества и наличию его поддержки в Network UPS Tools
(NUT) (см. UPS hardware compatibility list (stable) на
www.networkupstools.org).
Подключить его не составило особого труда. Достаточно
поставить nut-2.4.1, подключить ИБП к USB (появляется
устройство /dev/ttyUSB0), которое прописываем в
/etc/ups/ups.conf и стартуем службу upsd (если upsd стартует
не от root, то необходимо предварительно выставить
требуемому пользователю соответствующие права на
/dev/ttyUSB0).
Баг:
Радость была не долгой - служба upsd, получив данные
battery.charge: 0.0 с ИБП, как ей и положено, отправила
сигнал завершения работы.
С учетом того, что ИБП уже заряжался около 6 часов и
корректно отрабатывал самотестирование, был исключен
аппаратный глюк. И действительно, полазив по форумам, было
найдено упоминание о данной проблеме
http://forum.pcm.ru/viewtopic.php?f=3&t=2627.
Решение:
Патчить powercom.c (nut-2.4.1), однако текст патча в ветке
форума не нашелся. Для устранения этой вопиющей
несправедливости, привожу текст своего патча (см.
Подробности).
В powercom.c (nut-2.4.1) производится переопределение
types[type].name=KIN даже если в настройках задан type=IMP
для UPS Powercom IMP-425AP и подобных, что приводит к
ошибочному определению battery.charge: 0.0
PS: Готовые сборки пропатченого nut-2.4.1 для openSUSE-11.2 доступны в:
http://download.opensuse.org/repositories/home:/nk_rec/
Патч для powercom.c, исправляющий баг "battery.charge: 0.0" для IMP-425AP и подобных
Текст патча:
--- drivers/powercom.c 2009-02-17 12:20:48.000000000 +0300
+++ drivers/powercom.c 2010-03-02 15:48:25.354735038 +0300
@@ -852,21 +852,30 @@
/* setup flow control */
types[type].flowControl.setup_flow_control();
- if (!strncmp(types[type].name, "BNT",3) || !strcmp(types[type].name, "KIN") || !strcmp(types[type].name, "IMP")){
+ if (getval("type") == NULL){
if (!ups_getinfo()) return;
if (raw_data[UPSVERSION]==0xFF){
types[type].name="IMP";
- model=IMPmodels[raw_data[MODELNUMBER]/16];
}
if (raw_data[MODELNAME]==0x42){
if (!strcmp(types[type].name, "BNT-other"))
types[type].name="BNT-other";
else
types[type].name="BNT";
- model=BNTmodels[raw_data[MODELNUMBER]/16];
}
if (raw_data[MODELNAME]==0x4B){
types[type].name="KIN";
+ }
+ }
+ if (!strncmp(types[type].name, "BNT",3) || !strcmp(types[type].name, "KIN") || !strcmp(types[type].name, "IMP")){
+ if (!ups_getinfo()) return;
+ if (!strcmp(types[type].name, "IMP")){
+ model=IMPmodels[raw_data[MODELNUMBER]/16];
+ }
+ if (!strncmp(types[type].name, "BNT",3)){
+ model=BNTmodels[raw_data[MODELNUMBER]/16];
+ }
+ if (!strcmp(types[type].name, "KIN")){
model=KINmodels[raw_data[MODELNUMBER]/16];
}
linevoltage=voltages[raw_data[MODELNUMBER]%16];
Пока в nut не исправили этот глючек, т.е. как минимум для
nut-2.4.1 это решений будет актуально.