[Nut-upsdev] [PATCH 33/36] Add basic temperature monitoring support to snmp-ups.

Greg A. Woods woods at planix.com
Thu Mar 8 23:21:44 UTC 2012


From: "Greg A. Woods" <woods at planix.com>

The "ups.temperature" and "ambient.temperature" values are monitored, if
available, and if either exceeds the configured "maxtemp" variable's
value, or 150 by default, the UPS reports that it is DYING so that NUT
can shut everything down and then turn it off with the
upsdrv_shutdown(epo=1) call.
---
 docs/man/snmp-ups.txt |   28 ++++++++++++++++++++++++++++
 drivers/snmp-ups.c    |   24 +++++++++++++++++++++++-
 drivers/snmp-ups.h    |    3 ++-
 3 files changed, 53 insertions(+), 2 deletions(-)

diff --git a/docs/man/snmp-ups.txt b/docs/man/snmp-ups.txt
index 5512fa0..c087aad 100644
--- a/docs/man/snmp-ups.txt
+++ b/docs/man/snmp-ups.txt
@@ -70,6 +70,15 @@ Set SNMP version (default = v1, the other allowed value is v2c)
 *pollfreq*='value'::
 Set polling frequency in seconds, to reduce network flow (default=30)
 
+*maxtemp*='value'::
+Set the maximum temperature for the *ups.temperature* and
+*ambient.temperature* variables, above which point the UPS will report
+the emergency *DYING* state (default=150 (in degrees Celsius)).  This
+option takes a numeric value in the range of 1 to 150.  Typically this
+will cause connected systems to be safely shut down and the monitored
+UPS to be powered down completely (if possible) so that human
+intervention will be required to restart things.
+
 *notransferoids*::
 Disable the monitoring of the low and high voltage transfer OIDs in
 the hardware.  This will remove input.transfer.low and input.transfer.high
@@ -148,6 +157,25 @@ The hostname of the UPS is specified with the "port" value in
 		privPassword = myprivatepassphrase
 		desc = "Example SNMP v3 device, with the highest security level"
 
+MONITORING FOR UNHEALTHY ENVIRONMENTS
+-------------------------------------
+
+Many SNMP-capable UPS units can report on their internal temperature
+(see the *ups.temperature* and *ambient.temperature* variables).  The
+driver will report a *DYING* state if this temperature exceeds some
+pre-set value.  The default maximum temperature is set to 150 degrees
+Celsius, the point where many plastics begin to melt, but far past the
+point where the batteries have probably already self-destructed.  A
+reasonable value to use may be somewhere between 45 and 50.  Most
+battery specifications warn that operating over 40 C for long will
+seriously lower the battery's expected lifetime.  Note that the battery
+may not be at the same temperature as the sensor.
+
+You may wish to observe the normal operating temperature of your UPS as
+reported by this driver, and perhaps measure it independently by hand as
+well, before setting a maximum temperature which will protect your UPS
+and nearby systems from certain physical damage.
+
 AUTHORS
 -------
 Arnaud Quette, Dmitry Frolov
diff --git a/drivers/snmp-ups.c b/drivers/snmp-ups.c
index ebf0cab..842fbdf 100644
--- a/drivers/snmp-ups.c
+++ b/drivers/snmp-ups.c
@@ -274,6 +274,8 @@ void upsdrv_makevartable(void)
 		"Set the authentication protocol (MD5 or SHA) used for authenticated SNMPv3 messages (default=MD5)");
 	addvar(VAR_VALUE, SU_VAR_PRIVPROT,
 		"Set the privacy protocol (DES or AES) used for encrypted SNMPv3 messages (default=DES)");
+	addvar(VAR_VALUE, SU_VAR_MAXTEMP,
+	       "Set the maximum allowed operating temperature (in degrees C, default=150)");
 #if 0 /* XXX unused */
 	addvar(VAR_VALUE, SU_VAR_SDTYPE,
 	       "Set the shutdown mode (3 or 2, default=3)");
@@ -1331,6 +1333,23 @@ bool_t snmp_ups_walk(int mode)
 	return status;
 }
 
+static void check_temperature(const char *type, int curtemp)
+{
+	char *val;
+	int maxtemp = 150;		/* 150 is far too high for sure... */
+
+	/* should */
+
+	if ((val = getval("maxtemp"))) {
+		maxtemp = atoi(val);
+	}
+	if (curtemp > maxtemp) {
+		upslogx(LOG_EMERG, "current value of %s at %d C exceeds maximum temperature of %d C", type, curtemp, maxtemp);
+
+		status_set("DYING");		/* dying! */
+	}
+}
+
 bool_t su_ups_get(snmp_info_t *su_info_p)
 {
 	static char buf[SU_INFOSIZE];
@@ -1353,7 +1372,8 @@ bool_t su_ups_get(snmp_info_t *su_info_p)
 	}
 
 	/* another special case */
-	if (!strcasecmp(su_info_p->info_type, "ambient.temperature")) {
+	if (!strcasecmp(su_info_p->info_type, "ups.temperature") ||
+	    !strcasecmp(su_info_p->info_type, "ambient.temperature")) {
 		float temp=0;
 
 		status = nut_snmp_get_int(su_info_p->OID, &value);
@@ -1382,6 +1402,8 @@ bool_t su_ups_get(snmp_info_t *su_info_p)
 		snprintf(buf, sizeof(buf), "%.1f", temp);
 		su_setinfo(su_info_p, buf);
 
+		check_temperature(su_info_p->info_type, temp);
+
 		return TRUE;
 	}
 
diff --git a/drivers/snmp-ups.h b/drivers/snmp-ups.h
index 2fd0400..b1d5e5b 100644
--- a/drivers/snmp-ups.h
+++ b/drivers/snmp-ups.h
@@ -172,6 +172,8 @@ typedef struct {
 #define SU_VAR_MIBS			"mibs"
 #define SU_VAR_POLLFREQ		"pollfreq"
 #define SU_VAR_SDTYPE		"sdtype"	/* XXX unused */
+#define SU_VAR_WARNTEMP		"warntemp"	/* XXX unused -- for alarms */
+#define SU_VAR_MAXTEMP		"maxtemp"
 /* SNMP v3 related parameters */
 #define SU_VAR_SECLEVEL		"secLevel"
 #define SU_VAR_SECNAME		"secName"
@@ -181,7 +183,6 @@ typedef struct {
 #define SU_VAR_PRIVPROT		"privProtocol"
 #define SU_VAR_MAGIC		"magic"
 
-
 #define SU_INFOSIZE		128
 #define SU_BUFSIZE		32
 #define SU_LARGEBUF		256
-- 
1.7.9.2




More information about the Nut-upsdev mailing list