В данном разделе находится общая информация.
В данном разделе находятся примеры различных Linux shell скриптов.
В данном разделе находятся примеры различных скриптов на WSH.
В данном разделе находятся материалы по разным темам.

Правильный CSS!

Для корректного отображения страницы, рекомендуется использовать браузер поддерживающий JavaScript.

Для навигации пользуйтесь боковым меню и кнопками "Описание" и "Подробно".

Особенности настройки nut и ИБП Powercom IMP-425AP (баг "battery.charge: 0.0")

История подключения IMP-425AP

Выбран данный девайс был из соображений соотношения цены/качества и наличию его поддержки в Network UPS Tools (NUT) (см. UPS hardware compatibility list (stable) на www.networkupstools.org).
Подключить его не составило особого труда. Достаточно поставить nut 2.4.1 или 2.6.5, подключить ИБП к 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 или 2.6.5), однако текст патча в ветке форума не нашелся. Для устранения этой вопиющей несправедливости, привожу текст своего патча (см. Подробности).
В powercom.c (nut 2.4.1 или 2.6.5) производится переопределение types[type].name=KIN даже если в настройках задан type=IMP для UPS Powercom IMP-425AP и подобных, что приводит к ошибочному определению battery.charge: 0.0

Патч для powercom.c, исправляющий баг "battery.charge: 0.0" для IMP-425AP и подобных

Текст патча (nut-2.6.5):

--- drivers/powercom.c.orig	2012-07-31 21:38:59.000000000 +0400
+++ drivers/powercom.c	2014-08-30 01:10:25.820362835 +0400
@@ -887,24 +887,37 @@
 	types[type].flowControl.setup_flow_control();
 
 	/* Setup Model and LineVoltage */
-	if (!strncmp(types[type].name, "BNT",3) || !strcmp(types[type].name, "KIN") || !strcmp(types[type].name, "IMP")){
+	/* 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;
 		/* Give "BNT-other" a chance! */
 		if (raw_data[MODELNAME]==0x42 || raw_data[MODELNAME]==0x4B){
-			model=BNTmodels[raw_data[MODELNUMBER]/16];
+			/* model=BNTmodels[raw_data[MODELNUMBER]/16]; */
 			if (!strcmp(types[type].name, "BNT-other"))
 				types[type].name="BNT-other";
 			else if (raw_data[MODELNAME]==0x42)
 				types[type].name="BNT";
 			else if (raw_data[MODELNAME]==0x4B){
 				types[type].name="KIN";
-				model=KINmodels[raw_data[MODELNUMBER]/16];
+				/* model=KINmodels[raw_data[MODELNUMBER]/16]; */
 			}
 		}
 		else if (raw_data[UPSVERSION]==0xFF){
 			types[type].name="IMP";
+			/* model=IMPmodels[raw_data[MODELNUMBER]/16]; */
+		}
+	}
+	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];
 		snprintf(buf,sizeof(buf),"%s-%dAP",types[type].name,model);
 		if (!strcmp(modelname, "Unknown"))
			

Текст патча (nut-2.4.1):

--- 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 - 2.6.5 это решений будет актуально.

Yandex.Metrika

Page modification: Вто Сен 09 19:47:09 MSD 2014