Skip to content

Commit 99831a0

Browse files
authored
Merge pull request #3299 from jawz101/master
Support Vertiv Liebert PSI5 UPS with SNMP
2 parents 92ea04e + 9d9710e commit 99831a0

7 files changed

Lines changed: 215 additions & 3 deletions

File tree

NEWS.adoc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,9 @@ https://github.com/networkupstools/nut/milestone/12
212212
mappings. Suggest how user can help improve the driver if too few data
213213
points were seen, or if the `mibs=auto` detection only found the fallback
214214
IETF mapping. [PR #3095]
215+
* Added new vendor extension mappings for Vertiv Liebert UPS, tested with
216+
PSI5-750MT120 UPS model and IS-UNITY-DP (Firmware 8.4.7.0) SNMP card.
217+
[issue #3296, PR #3299]
215218

216219
- `tripplite_usb` driver updates:
217220
* Added support for Tripplite protocol 3017 (mostly ASCII). [issue #2258,

data/driver.list.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,7 @@
742742
"Liebert" "ups" "3" "PowerSure PSA500MT3-230U" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/601
743743
"Liebert" "ups" "3" "PowerSure PSI 1440" "USB" "usbhid-ups" # http://www.emersonnetworkpower.com/en-US/Products/ACPower/Pages/LiebertPowerSurePSILineInteractiveUPS10003000VA.aspx
744744
"Liebert" "ups" "3" "PSI5-800RT120" "USB" "usbhid-ups" # https://www.vertiv.com/en-us/products-catalog/critical-power/uninterruptible-power-supplies-ups/psi5-800rt120/
745+
"Liebert" "ups" "3" "PSI5-750MT120 (with IS-UNITY-DP SNMP card)" "" "snmp-ups" # https://github.com/networkupstools/nut/pull/3299
745746

746747
"LNXI" "pdu" "1" "Icebox" "10 outlets" "powerman-pdu (experimental)"
747748

docs/nut.dict

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
personal_ws-1.1 en 3654 utf-8
1+
personal_ws-1.1 en 3655 utf-8
22
AAC
33
AAS
44
ABI
@@ -1475,6 +1475,7 @@ Valderen
14751475
Vdc
14761476
Velloso
14771477
VendorID
1478+
Vertiv
14781479
Viewpower
14791480
Viewsonic
14801481
Viktor

drivers/Makefile.am

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ snmp_ups_SOURCES = snmp-ups.c snmp-ups-helpers.c \
394394
mge-mib.c \
395395
netvision-mib.c \
396396
raritan-pdu-mib.c raritan-px2-mib.c \
397+
vertiv-mib.c \
397398
xppc-mib.c
398399
snmp_ups_CFLAGS = $(AM_CFLAGS)
399400
snmp_ups_CFLAGS += $(LIBNETSNMP_CFLAGS)
@@ -540,7 +541,7 @@ dist_noinst_HEADERS = \
540541
nutdrv_qx_voltronic-axpert.h nutdrv_qx_voltronic-qs.h nutdrv_qx_voltronic-qs-hex.h \
541542
nutdrv_qx_zinto.h \
542543
upsdrvquery.h \
543-
xppc-mib.h huawei-mib.h eaton-ats16-nmc-mib.h eaton-ats16-nm2-mib.h apc-ats-mib.h raritan-px2-mib.h eaton-ats30-mib.h \
544+
xppc-mib.h huawei-mib.h eaton-ats16-nmc-mib.h eaton-ats16-nm2-mib.h apc-ats-mib.h raritan-px2-mib.h vertiv-mib.h eaton-ats30-mib.h \
544545
apc-pdu-mib.h apc-epdu-mib.h ecoflow-hid.h ever-hid.h eaton-pdu-genesis2-mib.h eaton-pdu-marlin-mib.h eaton-pdu-marlin-helpers.h \
545546
eaton-pdu-pulizzi-mib.h eaton-pdu-revelation-mib.h emerson-avocent-pdu-mib.h eaton-ups-pwnm2-mib.h eaton-ups-pxg-mib.h legrand-hid.h \
546547
hpe-pdu-mib.h hpe-pdu3-cis-mib.h powervar-hid.h delta_ups-hid.h generic_modbus.h salicru-hid.h adelsystem_cbi.h eaton-pdu-nlogic-mib.h ydn23.h

drivers/snmp-ups.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
#include "emerson-avocent-pdu-mib.h"
7373
#include "hpe-pdu-mib.h"
7474
#include "hpe-pdu3-cis-mib.h"
75+
#include "vertiv-mib.h"
7576

7677
/* Address API change */
7778
#if ( ! NUT_HAVE_LIBNETSNMP_usmAESPrivProtocol ) && ( ! defined usmAESPrivProtocol )
@@ -128,6 +129,7 @@ static mib2nut_info_t *mib2nut[] = {
128129
&netvision, /* This struct comes from : netvision-mib.c */
129130
&raritan, /* This struct comes from : raritan-pdu-mib.c */
130131
&raritan_px2, /* This struct comes from : raritan-px2-mib.c */
132+
&vertiv, /* This struct comes from : vertiv-mib.c */
131133
&xppc, /* This struct comes from : xppc-mib.c */
132134
/*
133135
* Prepend vendor specific MIB mappings before IETF, so that
@@ -177,7 +179,7 @@ static const char *mibname;
177179
static const char *mibvers;
178180

179181
#define DRIVER_NAME "Generic SNMP UPS driver"
180-
#define DRIVER_VERSION "1.38"
182+
#define DRIVER_VERSION "1.39"
181183

182184
/* driver description structure */
183185
upsdrv_info_t upsdrv_info = {

drivers/vertiv-mib.c

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
/* vertiv-mib.h - Driver for Vertiv Liebert PSI5 UPS (maybe other Vertiv too)
2+
*
3+
* Copyright (C)
4+
* 2026 jawz101 <jawz101@users.noreply.github.com> + Gemini
5+
* 2026 Jim Klimov <jimklimov+nut@gmail.com> - cleanup
6+
*
7+
* This program is free software; you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation; either version 2 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program; if not, write to the Free Software
19+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20+
*
21+
* Includes support for:
22+
* - Basic Monitoring (Voltage, Load, Temperature)
23+
* - Battery Management (Charge, Runtime)
24+
* - Alarms (Replace Battery, Overload, etc.)
25+
* - Beeper Control
26+
*/
27+
28+
#include "vertiv-mib.h"
29+
30+
#define VERTIV_MIB_VERSION "0.01"
31+
32+
/* Base OIDs from IS-UNITY-DP Card */
33+
#define VERTIV_BASEOID ".1.3.6.1.4.1.476.1.42"
34+
#define VERTIV_ID_OID VERTIV_BASEOID ".2.4.2.1.4.1"
35+
#define VERTIV_VAL_OID VERTIV_BASEOID ".3.9.30.1.20.1.2.1"
36+
#define VERTIV_ALM_OID VERTIV_BASEOID ".3.9.20.1.10.1.2.100"
37+
#define VERTIV_PWRSTATUS_OID VERTIV_BASEOID ".3.5.3"
38+
#define VERTIV_BEEPER_OID VERTIV_VAL_OID ".6188"
39+
40+
#ifdef VERTIV_WITH_IETF_BEEPER_FALLBACK
41+
/* May be defined in experimental builds */
42+
static info_lkp_t ietf_beeper_status_info[] = {
43+
info_lkp_default(1, "disabled"),
44+
info_lkp_default(2, "enabled"),
45+
info_lkp_default(3, "muted"),
46+
info_lkp_sentinel
47+
};
48+
#endif /* VERTIV_WITH_IETF_BEEPER_FALLBACK */
49+
50+
static info_lkp_t vertiv_beeper_status_info[] = {
51+
info_lkp_default(1, "enabled"),
52+
info_lkp_default(2, "disabled"),
53+
info_lkp_sentinel
54+
};
55+
56+
/* FIXME: the below may introduce status redundancy, that needs to be
57+
* addressed by the driver, as for usbhid-ups! */
58+
/*
59+
* DESCRIPTION
60+
* The present source of output power. The enumeration
61+
* none(2) indicates that there is no source of output
62+
* power (and therefore no output power), for example,
63+
* the system has opened the output breaker.
64+
*
65+
* NOTE: In a single-module system, this point
66+
* is intended to have the same behavior as
67+
* the RFC1628 point upsOutputSource."
68+
*/
69+
static info_lkp_t vertiv_power_source_info[] = {
70+
info_lkp_default(1, ""), /* other */
71+
info_lkp_default(2, "OFF"), /* none */
72+
info_lkp_default(3, "OL"), /* normal */
73+
info_lkp_default(4, "BYPASS"), /* bypass */
74+
info_lkp_default(5, "OB"), /* battery */
75+
info_lkp_default(6, "BOOST"), /* booster */
76+
info_lkp_default(7, "TRIM"), /* reducer */
77+
info_lkp_sentinel
78+
};
79+
80+
static snmp_info_t vertiv_mib[] = {
81+
/* Standard IETF MIB items */
82+
snmp_info_default("device.description", ST_FLAG_STRING | ST_FLAG_RW, SU_INFOSIZE, ".1.3.6.1.2.1.1.1.0", NULL, SU_FLAG_OK | SU_FLAG_SEMI_STATIC, NULL),
83+
snmp_info_default("device.contact", ST_FLAG_STRING | ST_FLAG_RW, SU_INFOSIZE, ".1.3.6.1.2.1.1.4.0", NULL, SU_FLAG_OK | SU_FLAG_SEMI_STATIC, NULL),
84+
snmp_info_default("device.location", ST_FLAG_STRING | ST_FLAG_RW, SU_INFOSIZE, ".1.3.6.1.2.1.1.6.0", NULL, SU_FLAG_OK | SU_FLAG_SEMI_STATIC, NULL),
85+
86+
/* Device Identification from vendor MIB */
87+
snmp_info_default("device.mfr", ST_FLAG_STRING, 1.0, VERTIV_BASEOID ".2.1.1.0", NULL, SU_FLAG_OK | SU_FLAG_STATIC, NULL),
88+
snmp_info_default("device.model", ST_FLAG_STRING, 1.0, VERTIV_BASEOID ".2.4.2.1.4.1", NULL, SU_FLAG_OK | SU_FLAG_STATIC, NULL),
89+
snmp_info_default("device.serial", ST_FLAG_STRING, 1.0, VERTIV_BASEOID ".2.4.2.1.7.1", NULL, SU_FLAG_OK | SU_FLAG_STATIC, NULL),
90+
snmp_info_default("ups.firmware", ST_FLAG_STRING, 1.0, VERTIV_BASEOID ".2.4.2.1.5.1", NULL, SU_FLAG_OK | SU_FLAG_STATIC, NULL),
91+
92+
/* Extended Identification */
93+
snmp_info_default("device.type", ST_FLAG_STRING, 1.0, VERTIV_BASEOID ".3.9.20.1.20.1.2.1.4553", NULL, SU_FLAG_OK | SU_FLAG_STATIC, NULL),
94+
snmp_info_default("ups.mfr", ST_FLAG_STRING, 1.0, VERTIV_BASEOID ".3.9.20.1.20.1.2.1.4333", NULL, SU_FLAG_OK | SU_FLAG_STATIC, NULL),
95+
snmp_info_default("ups.model", ST_FLAG_STRING, 1.0, VERTIV_BASEOID ".3.9.20.1.20.1.2.1.4240", NULL, SU_FLAG_OK | SU_FLAG_STATIC, NULL),
96+
97+
/* UPS Measurements & Topology (High-precision) */
98+
snmp_info_default("ups.load", 0, 1.0, VERTIV_VAL_OID ".5861", "", SU_FLAG_OK | SU_FLAG_NEGINVALID, NULL),
99+
snmp_info_default("ups.temperature", 0, 1.0, VERTIV_BASEOID ".3.9.30.1.10.1.2.1.4291", NULL, SU_FLAG_NEGINVALID, NULL),
100+
snmp_info_default("ups.type", ST_FLAG_STRING, 1.0, VERTIV_BASEOID ".3.9.20.1.20.1.2.1.6199", NULL, SU_FLAG_OK | SU_FLAG_STATIC, NULL),
101+
102+
/* Battery Data */
103+
snmp_info_default("battery.charge", 0, 1.0, VERTIV_VAL_OID ".4153", "", SU_FLAG_OK | SU_FLAG_NEGINVALID, NULL),
104+
/* Multiplier 60.0 converts UPS minutes to NUT seconds */
105+
snmp_info_default("battery.runtime", 0, 60.0, VERTIV_VAL_OID ".4150", "", SU_FLAG_OK | SU_FLAG_NEGINVALID, NULL),
106+
snmp_info_default("battery.voltage", 0, 1.0, VERTIV_VAL_OID ".4148", "", SU_FLAG_OK | SU_FLAG_NEGINVALID, NULL),
107+
snmp_info_default("battery.voltage.nominal", 0, 1.0, VERTIV_VAL_OID ".6189", "", SU_FLAG_OK | SU_FLAG_STATIC, NULL),
108+
109+
/* Power Quality - Scaled (0.1) for high precision decimal values (tenths of Volts/Amps/Hz) */
110+
snmp_info_default("input.voltage", 0, 0.1, VERTIV_VAL_OID ".4096", "", SU_FLAG_OK | SU_FLAG_NEGINVALID, NULL),
111+
snmp_info_default("input.current", 0, 0.1, VERTIV_VAL_OID ".4113", "", SU_FLAG_OK | SU_FLAG_NEGINVALID, NULL),
112+
snmp_info_default("input.frequency", 0, 0.1, VERTIV_VAL_OID ".4105", "", SU_FLAG_OK | SU_FLAG_NEGINVALID, NULL),
113+
snmp_info_default("input.voltage.nominal", 0, 1.0, VERTIV_VAL_OID ".4102", "", SU_FLAG_OK | SU_FLAG_STATIC, NULL),
114+
snmp_info_default("input.current.nominal", 0, 1.0, VERTIV_VAL_OID ".4104", "", SU_FLAG_OK | SU_FLAG_STATIC, NULL),
115+
snmp_info_default("input.frequency.nominal", 0, 1.0, VERTIV_VAL_OID ".4103", "", SU_FLAG_OK | SU_FLAG_STATIC, NULL),
116+
snmp_info_default("output.voltage", 0, 0.1, VERTIV_VAL_OID ".4385", "", SU_FLAG_OK | SU_FLAG_NEGINVALID, NULL),
117+
snmp_info_default("output.current", 0, 0.1, VERTIV_VAL_OID ".4204", "", SU_FLAG_OK | SU_FLAG_NEGINVALID, NULL),
118+
snmp_info_default("output.frequency", 0, 0.1, VERTIV_VAL_OID ".4207", "", SU_FLAG_OK | SU_FLAG_NEGINVALID, NULL),
119+
snmp_info_default("output.power", 0, 1.0, VERTIV_VAL_OID ".4208", "", SU_FLAG_OK | SU_FLAG_NEGINVALID, NULL),
120+
snmp_info_default("output.power.apparent", 0, 1.0, VERTIV_VAL_OID ".4209", "", SU_FLAG_OK | SU_FLAG_NEGINVALID, NULL),
121+
snmp_info_default("output.voltage.nominal", 0, 1.0, VERTIV_VAL_OID ".4260", "", SU_FLAG_OK | SU_FLAG_STATIC, NULL),
122+
snmp_info_default("output.power.nominal", 0, 1.0, VERTIV_VAL_OID ".4264", "", SU_FLAG_OK | SU_FLAG_STATIC, NULL),
123+
124+
/* UPS Status */
125+
snmp_info_default("ups.status", ST_FLAG_STRING, SU_INFOSIZE, VERTIV_VAL_OID ".4872", "", SU_STATUS_PWR | SU_FLAG_OK, vertiv_power_source_info),
126+
127+
/* Beeper status and commands */
128+
snmp_info_default("ups.beeper.status", ST_FLAG_STRING, SU_INFOSIZE, VERTIV_BEEPER_OID, "", SU_FLAG_UNIQUE, vertiv_beeper_status_info),
129+
130+
snmp_info_default("beeper.disable", 0, 1, VERTIV_BEEPER_OID, "2", SU_TYPE_CMD, NULL),
131+
snmp_info_default("beeper.enable", 0, 1, VERTIV_BEEPER_OID, "1", SU_TYPE_CMD, NULL),
132+
133+
#ifdef VERTIV_WITH_IETF_BEEPER_FALLBACK
134+
/* IETF MIB fallback */
135+
snmp_info_default("ups.beeper.status", ST_FLAG_STRING, SU_INFOSIZE, "1.3.6.1.2.1.33.1.9.8.0", "", SU_FLAG_UNIQUE, ietf_beeper_status_info),
136+
#if 0
137+
snmp_info_default("beeper.disable", 0, 1, "1.3.6.1.2.1.33.1.9.8.0", "1", SU_TYPE_CMD, NULL),
138+
snmp_info_default("beeper.enable", 0, 1, "1.3.6.1.2.1.33.1.9.8.0", "2", SU_TYPE_CMD, NULL),
139+
#endif
140+
snmp_info_default("beeper.mute", 0, 1, "1.3.6.1.2.1.33.1.9.8.0", "3", SU_TYPE_CMD, NULL),
141+
#endif /* VERTIV_WITH_IETF_BEEPER_FALLBACK */
142+
143+
/* Shutdown / Restart Control
144+
* NOTE: Other sources suggest
145+
* "ups.delay.shutdown" => VERTIV_BASEOID ".3.3.5.1.0"
146+
* "ups.delay.start" => VERTIV_BASEOID ".3.3.5.2.0"
147+
*/
148+
snmp_info_default("ups.delay.shutdown", ST_FLAG_RW, 1.0, VERTIV_VAL_OID ".5814", "", SU_TYPE_TIME | SU_FLAG_OK, NULL),
149+
snmp_info_default("ups.delay.start", ST_FLAG_RW, 1.0, VERTIV_VAL_OID ".5816", "", SU_TYPE_TIME | SU_FLAG_OK, NULL),
150+
151+
/* end of structure. */
152+
snmp_info_sentinel
153+
};
154+
155+
static alarms_info_t vertiv_alarms[] = {
156+
{ VERTIV_ALM_OID ".4168", "OB", "Battery Discharging" },
157+
{ VERTIV_ALM_OID ".4162", "LB", "Battery Low" },
158+
{ VERTIV_ALM_OID ".5806", "OVER", "Output Overload" },
159+
{ VERTIV_ALM_OID ".6182", "RB", "Replace Battery" },
160+
{ VERTIV_ALM_OID ".4233", "FAULT", "Inverter Failure" },
161+
{ VERTIV_ALM_OID ".4310", "OT", "Over Temperature" },
162+
{ VERTIV_ALM_OID ".4215", "OFF", "UPS Output Off" },
163+
{ NULL, NULL, NULL }
164+
};
165+
166+
mib2nut_info_t vertiv = {
167+
"vertiv",
168+
VERTIV_MIB_VERSION,
169+
VERTIV_PWRSTATUS_OID,/* Optional Power Status OID */
170+
VERTIV_ID_OID, /* Model Name OID */
171+
vertiv_mib,
172+
VERTIV_BASEOID, /* SysOID fingerprint */
173+
vertiv_alarms
174+
};

drivers/vertiv-mib.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/* vertiv-psi5-mib.h - Driver for Vertiv Liebert PSI5 UPS
2+
*
3+
* Copyright (C)
4+
* 2026 jawz101 <jawz101@users.noreply.github.com> + Gemini
5+
*
6+
* This program is free software; you can redistribute it and/or modify
7+
* it under the terms of the GNU General Public License as published by
8+
* the Free Software Foundation; either version 2 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU General Public License
17+
* along with this program; if not, write to the Free Software
18+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19+
*
20+
*/
21+
22+
#ifndef VERTIV_PSI5_MIB_H
23+
#define VERTIV_PSI5_MIB_H
24+
25+
#include "main.h"
26+
#include "snmp-ups.h"
27+
28+
extern mib2nut_info_t vertiv;
29+
30+
#endif /* VERTIV_PSI5_MIB_H */

0 commit comments

Comments
 (0)