Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
USBHID-UPS(8)			   NUT Manual			   USBHID-UPS(8)

NAME
     usbhid-ups - Driver for USB/HID UPS equipment

SYNOPSIS
     usbhid-ups -h

     usbhid-ups -a UPS_NAME [OPTIONS]

	 Note

	 This man page only documents the hardware-specific features of the usb-
	 hid-ups  driver.  For	information  about  the core driver, see nutups-
	 drv(8).

SUPPORTED HARDWARE
     usbhid-ups brings USB/HID UPS monitoring to NUT on all platforms supporting
     USB through libusb. It should detect any UPS that uses the HID Power Device
     Class, but the amount of data will vary depending on the  manufacturer  and
     model.

     At the present time, usbhid-ups supports:

     *	 the newer Eaton USB models,

     *	 all MGE USB models,

     *	 all Dell USB models,

     *	 all AMETEK Powervar UPM models,

     *	 some APC models,

     *	 some Belkin models,

     *	 some Cyber Power Systems models,

     *	 some Powercom models,

     *	 some PowerWalker models,

     *	 some TrippLite models.

     For  a  more  complete  list, refer to the NUT hardware compatibility list,
     available in the NUT source distribution as data/driver.list, or on the NUT
     website.

     You may use the explore driver option to gather information from HID  UPSes
     which  are  not  yet supported, to help add such support; see below for de-
     tails.

     This driver is known to work on:

     *	 most Linux systems,

     *	 FreeBSD (beta stage) and maybe other *BSD,

     *	 Darwin / Mac OS X,

     *	 Solaris 10 and illumos-based distributions.

EXTRA ARGUMENTS
     This driver also supports the following optional settings:

     port = string
	 Required option for all NUT drivers. Some value must be set,  typically
	 auto for drivers that handle USB connections.

	     Note
	     This  could  be  a device filesystem path like /dev/usb/hiddev0 but
	     current use of libusb API precludes knowing and  matching	by  such
	     identifiers.  They  may also be inherently unreliable (dependent on
	     re-plugging and enumeration order). At this time the  actual  value
	     is ignored, but syntactically some port configuration must still be
	     there.

     It is possible to control multiple UPS units simultaneously by running sev-
     eral  instances of this driver, provided they can be uniquely distinguished
     by setting some combination of the vendor,  product,  vendorid,  productid,
     serial,  bus and/or device options detailed below. For devices or operating
     systems that do not provide sufficient  information,  the	allow_duplicates
     option can be of use (limited and risky!)

     vendorid  = regex, productid = regex, vendor = regex, product = regex, ser-
     ial = regex
	 Select a specific UPS, in case there is more  than  one  connected  via
	 USB. Each option specifies an extended regular expression (see regex(7)
	 for  more  information  on  regular  expressions), which must match the
	 UPS's entire respective vendor/product/serial string values (minus  any
	 surrounding whitespace), or the whole 4-digit hexadecimal code for ven-
	 dorid and productid.

	 Try  lsusb(8) or running this NUT driver with -DD command-line argument
	 for finding out the strings to match.

	 Examples:

	 *   -x vendor="Foo.Corporation.*"

	 *   -x vendorid="051d*" (APC)

	 *   -x product=".*(Smart|Back)-?UPS.*"

     bus = regex
	 OPTIONAL, NOT RECOMMENDED.

	 Select a UPS on a specific USB bus or group of buses. The argument is a
	 regular expression that must match the bus name where the UPS	is  con-
	 nected   (e.g.   bus="002"  or  bus="00[2-3]")  as  seen  on  Linux  in
	 /sys/bus/usb/devices or lsusb(8); including leading zeroes.

	     Note
	     Bus numbers are not guaranteed  by  the  OS  to  be  stable  across
	     re-boots,	kernel driver reloads or device re-plugging (e.g. chang-
	     ing visible population of USB hubs).

     device = regex
	 OPTIONAL, NOT RECOMMENDED.

	 Select a UPS on a specific USB device or group of devices. The argument
	 is a regular expression that must match the device name where	the  UPS
	 is  connected (e.g.  device="001" or device="00[1-2]") as seen on Linux
	 in /sys/bus/usb/devices or lsusb(8); including leading zeroes.

	     Note
	     Device numbers are not guaranteed by the OS  to  be  stable  across
	     re-boots or device re-plugging.

     busport = regex
	 OPTIONAL, NOT RECOMMENDED.

	 If  supported	by the hardware, OS and libusb on the particular deploy-
	 ment, this option should allow to specify physical port numbers  on  an
	 USB  hub, rather than logical device enumeration values, and in turn --
	 this should be less volatile across reboots or re-plugging.  The  value
	 may  be  seen	in  the USB topology output of lsusb -tv on systems with
	 that tool, for example.

	     Note
	     This option is not practically supported by  some	NUT  builds  (it
	     should be ignored with a warning then), and not by all systems that
	     NUT can run on.

     allow_duplicates
	 OPTIONAL, NOT RECOMMENDED.

	 If you have several UPS devices which may not be uniquely identified by
	 the  options  above  (e.g.  only VID:PID can be discovered there), this
	 flag allows each driver instance where it is  set  to	take  the  first
	 match if available, or proceed to try another.

	 Normally  the	driver initialization would abort at this point claiming
	 "Resource busy" or similar error, assuming that the otherwise	properly
	 matched device is unique -- and some other process already handles it.

	     Warning
	     This  feature  is	inherently non-deterministic! The association of
	     driver instance name to actual device may vary between runs!

	     If you only care to know that at least one of your no-name UPSes is
	     online, this option can help.

	     If you must really know which one, it will not!

     usb_set_altinterface = bAlternateSetting
	 Force redundant call to usb_set_altinterface(),  especially  if  needed
	 for devices serving multiple USB roles where the UPS is not represented
	 by the interface number 0 (default).

     usb_config_index,	 usb_hid_rep_index,  usb_hid_desc_index,  usb_hid_ep_in,
     usb_hid_ep_out
	 Force use of specific interface, endpoint, descriptor index  etc.  num-
	 bers,	rather than defaulting to 0 (rarely other values in certain dri-
	 vers for some devices known to use non-zero numbers).	Specified  as  a
	 hexadecimal number.

	 As a rule of thumb for usb_hid_desc_index discovery, you can see larger
	 wDescriptorLength  values  (roughly  600+ bytes) in reports of lsusb or
	 similar tools.

     LIBUSB_DEBUG = INTEGER
	 Run-time troubleshooting of USB-capable NUT  drivers  can  involve  not
	 only  raising	the common NUT debug verbosity (e.g. using the DEBUG_MIN
	 setting in ups.conf(5) or protocol commands to change the  driver.debug
	 value), but may also benefit from LibUSB specific debugging.

	 For  the  latter,  you can set the LIBUSB_DEBUG driver option; alterna-
	 tively you can classically export the environment variable LIBUSB_DEBUG
	 before starting a NUT driver program (may be set and "exported" in dri-
	 ver init script or service method, perhaps via nut.conf(5)), to  a  nu-
	 meric value such as 4 ("All messages are emitted").

	 For  more  details,  including  the currently supported values for your
	 version of the library, see e.g.:

	 *   https://libusb.sourceforge.io/api-1.0/

	 *   https://libusb.sourceforge.io/api-1.0/group__libusb__lib.html

     subdriver=regex
	 Select the USB HID subdriver for the device manually,	where  automatic
	 match by device attributes alone does not suffice (e.g. new devices for
	 which	no vendorid/productid pair was built into any driver -- but com-
	 mon USB HID support is anticipated, or for different-capability devices
	 with same interface chips, notably "phoenixtec/liebert" and "mge").

	 Run the driver program with the --help option to see the exact list  of
	 subdriver values it would currently recognize.

	     Note
	     This option first checks for exact matches to subdriver identifica-
	     tion  strings,  such  as  "TrippLite  HID 0.85" (which are prone to
	     bit-rot), and if there  was  no  exact  match  --	retries  with  a
	     case-insensitive extended regular expression.

	     Note
	     When  using  this	option, it is mandatory to also specify the ven-
	     dorid and productid matching parameters.

     lowbatt=num
	 Set the percentage at which the UPS will consider the battery charge as
	 critically low, possibly resulting in a forced  shutdown  (FSD)  situa-
	 tion.

	 This value is typically dictated by the UPS device, although there is a
	 fallback default value of 30 (in percent). Overriding this value can be
	 helpful  when	the  UPS  sets this value to a lower percentage than in-
	 tended.

     offdelay=num
	 Set the timer before the UPS is turned off after the kill power command
	 is sent (via the -k switch).

	 The default value is 20 (in seconds), or 60 for  CPS  devices.  Usually
	 this  must be lower than ondelay, but the driver will not warn you upon
	 startup if it isn't.

	 Note that many Cyber Power Systems (CPS) models tend to divide this de-
	 lay by 60 and round down, so the minimum advisable value is 60 to avoid
	 powering off immediately after NUT sends the shutdown	command  to  the
	 UPS. More details below.

     ondelay=num
	 Set  the timer for the UPS to switch on in case the power returns after
	 the kill power command had been sent, but before the actual switch off.
	 This ensures the machines connected to the UPS are, in all  cases,  re-
	 booted after a power failure.

	 The  default  value is 30 (in seconds), or 120 for CPS devices. Usually
	 this must be greater than offdelay, but the driver will  not  warn  you
	 upon  startup if it isn't. Some UPSes will restart no matter what, even
	 if the power is (still) out at the moment this timer elapses.	In  that
	 case, you could see whether setting ondelay = -1 in ups.conf helps.

	 Note  that  many  CPS	models tend to divide this delay by 60 and round
	 down, so the minimum advisable value is 120 to allow a short delay  be-
	 tween when the UPS shuts down, and when the power returns. According to
	 support  statement (for at least some CPS models), "our UPS systems are
	 unable to set up power on delay".

     pollfreq=num
	 Set polling frequency for full updates, in  seconds.  Compared  to  the
	 quick	updates performed every "pollinterval" (the latter option is de-
	 scribed in ups.conf(5)), the "pollfreq" interval  is  for  polling  the
	 less-critical	variables.  The  default value is 30 (in seconds), or 12
	 sec for CPS devices.

	     Note
	     This setting is different from a POLLFREQ	supported  by  upsmon(8)
	     (for details see its upsmon.conf(5)).

     pollonly
	 If  this  flag  is  set, the driver will not use Interrupt In transfers
	 during the shorter "pollinterval" cycles (not recommended,  but  needed
	 if these reports are broken on your UPS).

     winhid
	 If this flag is set on Windows builds, use the experimental native Win-
	 dows HID backend instead of libusb.

	 This backend currently follows a read-focused scope. It supports device
	 discovery  and  matching by identifiers such as vendorid and productid,
	 input/feature	reads,	and  interrupt-report  fallback  handling.  Fea-
	 ture-report  writes are not implemented in this phase, so writable set-
	 var/instcmd operations may be unavailable.

	 This option is ignored on non-WIN32 builds.

     interrupt_pipe_no_events_tolerance=num
	 Set the tolerance for how many times in a row could we have "Got 0  HID
	 objects"  when  using USB interrupt mode? This may normally be due to a
	 device having nothing urgent to report, so the default value is -1  and
	 this  situation  is not handled in any way specially. However with some
	 devices this was seen in conjunction with a  frozen  controller,  where
	 only  a  driver  reconnection	restored  the  data  exchange  (e.g. APC
	 BXnnnnMI) -- in such cases you may want to use a  reasonable  non-nega-
	 tive value here.

     onlinedischarge_battery
	 If  this  flag  is  set, the driver will treat OL+DISCHRG status as of-
	 fline/on-battery.

	 For most devices this combination means calibration or similar  mainte-
	 nance; however some UPS models (e.g. CyberPower UT series) emit OL+DIS-
	 CHRG  when  wall  power is lost -- and need this option to handle shut-
	 downs.

     onlinedischarge
	 DEPRECATED, old name for onlinedischarge_battery described above.

     onlinedischarge_calibration
	 If this flag is set, the driver will treat OL+DISCHRG status  as  cali-
	 bration.  Some  UPS models (e.g. APC were seen to do so) report OL+DIS-
	 CHRG when they are in calibration mode. This usually  happens	after  a
	 few  seconds  reporting  an  OFF  state  as well, while the hardware is
	 switching to on-battery mode.

	     Note
	     If it takes so long on your device that a shutdown gets issued, you
	     may want to look at upsmon option OFFDURATION used  to  filter  out
	     temporary	values	of  "administrative OFF" as not a loss of a feed
	     for the powered load.

     onlinedischarge_log_throttle_sec=num
	 Set the minimum frequency (in seconds) at which warnings would be emit-
	 ted for an otherwise not handled OL+DISCHRG device status  combination.
	 Negative values disable sequentially repeated messages (when this state
	 appears and persists).

	 If  the  device does not report battery.charge, the default value is 30
	 seconds (fairly frequent, in case the	UPS-reported  state  combination
	 does reflect a bad power condition and so the situation is urgent).

	 If it does report battery.charge, by default the repeated notifications
	 would	only be logged if this charge is different from when the message
	 was emitted previously (e.g. when the battery is really discharging).

	 If both this option is set, and battery.charge is  correctly  reported,
	 either of these rules allow the notification to be logged.

     onlinedischarge_log_throttle_hovercharge=num
	 See  details  in  onlinedischarge_log_throttle_sec  and  battery.charge
	 based log message throttling description above. This option adds a con-
	 cept of UPS "hovering" a battery charge at some level deemed  safe  for
	 its  chemistry, and not forcing it to be fully charged all the time. As
	 long as the current value of battery.charge remains at  or  above  this
	 threshold  percentage	(default 100), the OL+DISCHRG message logging is
	 not triggered by variations of the charge.

     lbrb_log_delay_sec=num
	 Set to delay status-setting (and log messages) about device entering LB
	 or LB+RB state.

	 Some APC  BXnnnnMI  device  models  or  firmware  versions  (reportedly
	 2023-2024),  or  APC  BVKnnnnM2  device  models,  or APC BKnnnnM2-CH (a
	 China-market-only model), frequently  report  "low  battery",	"replace
	 battery",  and "all ok" states changing rapidly within a couple of sec-
	 onds, sometimes (but not always)  preceded  by  OL+DISCHRG  (presumably
	 calibration).

	 This setting lets the driver ignore short-lived states and only pay at-
	 tention  if they persist longer than this setting (and the device power
	 state is OL).

     lbrb_log_delay_without_calibrating
	 Set to apply lbrb_log_delay_sec even if device is not calibrating.

     disable_fix_report_desc
	 Set to disable fix-ups for broken USB encoding, etc. which we apply  by
	 default on certain models (vendors/products) which were reported as not
	 following  the  protocol strictly. This flag allows to disable the fea-
	 ture in particular device configurations.

	 It is	always	possible  that	the  vendors  eventually  release  fixed
	 firmware,  or re-use identifiers by which we match suspected broken de-
	 vices for unrelated products, so processing these fix-ups  would  be  a
	 waste of time there.

	 It  is  also  always possible that NUT fix-ups cause issues on some de-
	 vices, whether due to NUT bugs or because the vendor protocol implemen-
	 tation is broken in more than one place.

     powercom_sdcmd_byte_order_fallback
	 Original PowerCOM HID subdriver code (until version 0.7) sent UPS shut-
	 down and stayoff commands in a wrong byte order, than what is needed by
	 actual devices seen in the field in 2024. The byte order  is  fixed  to
	 satisfy  new  devices by default since version 0.71. Just in case there
	 are different firmwares out there with opposite behaviors,  we  provide
	 this  toggle  to  use old behavior in a particular deployment. Maybe it
	 was just a bug and nobody needs this fall-back...

     powercom_sdcmd_discrete_delay
	 Some devices (Raptor and Smart KING Pro  series)  follow  the	protocol
	 where we can not set arbitrary value of shutdown delay in seconds (like
	 in  other  powercom UPSes), but must use values only from the "Table of
	 possible delays for Shutdown commands" specified in the protocol  docu-
	 ment.	This  option causes the driver to convert delays between seconds
	 (in standard NUT variables) and nearest indexed entry from that table.

     explore
	 With this option, the driver will connect to any device, including ones
	 that are not yet supported. This must always be combined with the "ven-
	 dorid" option. In this mode, the driver will not do anything useful ex-
	 cept for printing debugging information (typically used with -DD).

     maxreport
	 With this option, the driver activates  a  tweak  to  workaround  buggy
	 firmware  returning  invalid HID report length. Some APC Back-UPS units
	 are known to have this bug.

     interruptonly
	 If this flag is set, the driver will not poll UPS.  This  also  implies
	 using of INPUT flagged objects. Some Powercom units need this option.

     interruptsize=num
	 Limit	the number of bytes to read from interrupt pipe. For some Power-
	 com units this option should be equal to 8.

     waitbeforereconnect=num
	 The driver automatically tries to reconnect to the  UPS  on  unexpected
	 error.  This parameter (in seconds) allows it to wait before attempting
	 the reconnection. The default value is 0.

	     Note
	     For instance, it was found that Eaton MGE Ellipse Max 1500  FR  UPS
	     firmware  stops responding every few hours, which causes usbhid-ups
	     driver to detect an libusb insufficient memory error; in this case,
	     when the usbhid-ups driver tries to reconnect too early, the activ-
	     ity sometimes led the UPS firmware to crash and turn off  the  load
	     immediately! Setting this parameter to 30 seconds solved this prob-
	     lem (while 20 seconds were not enough).

INSTALLATION
     This  driver  may	be  not built by default. You can build it by installing
     prerequisites and using configure --with-usb=yes. Note that  it  will  also
     install other USB drivers.

     You  also	need to install manually the legacy hotplug files (libhidups and
     libhid.usermap, generally in /etc/hotplug/usb/), or the udev file	(nut-us-
     bups.rules, generally in /etc/udev/rules.d/) to address the permission set-
     tings   problem.	For   more   information,   refer  to  the  scripts/hot-
     plug/README.adoc or scripts/udev/README.adoc files in NUT sources.

IMPLEMENTATION
   Selecting a specific UPS
     As mentioned above, the driver ignores the "port" value in ups.conf.

     Unlike previous versions of this driver, it is now possible to control mul-
     tiple UPS units simultaneously with instances of  this  driver  running  in
     parallel, provided they can be distinguished by setting some combination of
     the device-matching options.

     For example:

	 [mge]
		 driver = usbhid-ups
		 port = auto
		 vendorid = 0463
	 [tripplite]
		 driver = usbhid-ups
		 port = auto
		 vendorid = 09ae

     To  monitor  devices using the same vendor and product identification (e.g.
     two pieces of the same model), you would need to  find  a	reliable  unique
     matching criteria:

     *	 The serial number is the best option, if populated.

     *	 Link-level  bus/device/busport may be unreliable (due to re-enumeration
	 on a whim by the operating system).

     *	 If nothing else helps, allow_duplicates may be an option in some cases.

   USB Polling and Interrupt Transfers
     The usbhid-ups driver has two polling intervals. The "pollinterval" config-
     uration option controls what can be considered the "inner loop", where  the
     driver  polls and waits briefly for "interrupt" reports. The "pollfreq" op-
     tion is for less frequent updates of a larger set of values, and  as  such,
     we   recommend  setting  that  interval  to  several  times  the  value  of
     "pollinterval".

     Many UPSes will respond to a USB Interrupt In  transfer  with  HID  reports
     corresponding to values which have changed. This saves the driver from hav-
     ing  to  poll each value individually with USB Control transfers. Since the
     OB and LB status flags are important for a clean shutdown, the driver  also
     explicitly  polls	the  HID paths corresponding to those status bits during
     the inner "pollinterval" time period. The "pollonly" option can be used  to
     skip the Interrupt In transfers if they are known not to work.

KNOWN ISSUES AND BUGS
   UPS reports 65535 sec (or 18:12:15) of battery.runtime capability
     From  a number of reports, it seems that some devices either can not report
     more than a 16-bit unsigned value in the standard field for  remaining  run
     time (vendor extended fields may exist but be unknown to the mapping tables
     in  your  current	NUT  driver build), or return -1 for error and that gets
     treated as an unsigned 16-bit 65535 value.

     According to some issue discussions, passing a battery  test  (calibration)
     can help the UPS re-estimate the time more correctly.

     This  problem  may  also  be linked to a very lightly loaded large-capacity
     UPS. In some cases vendor documentation explicitly states that runtime cal-
     culation is not reliable with loads under e.g. 10%.

   Repetitive timeout and staleness
     Some models tends to be unresponsive with the  default  polling  frequency.
     The result is that your system log will have lots of messages like:

	 usb 2-1: control timeout on ep0in
	 usb 2-1: usbfs: USBDEVFS_CONTROL failed cmd usbhid-ups rqt 128 rq 6 len 256
	 ret -110

     In  this  case,  simply  modify  the  general parameter "pollinterval" to a
     higher value (such as 10 seconds). This should solve the issue.

     Note that if you increase "pollinterval" beyond 10 or 15 seconds, you might
     also want to increase "pollfreq" by the same factor.

     With certain devices and operating systems, notably MGE/Eaton USB Vendor ID
     (0x0463) on some versions of the Linux kernel, you might encounter poor in-
     teraction with the "USB HID quirk" mechanism, which  precludes  Linux  from
     seeing  the  device as a hid-generic first, to hand it over to a NUT driver
     later. For more details, see the NUT FAQ document.  This  particular  quirk
     can be tuned with a kernel boot parameter (via GRUB etc.):

	 usbhid.quirks=0x0463:0xffff:0x08

     Conversely,  some hardware controllers may "fall asleep" when not contacted
     for too long; CPS devices are commonly associated with such  behaviour.  In
     this  case,  consider enabling pollonly flag and/or keeping pollfreq and/or
     pollinterval small.

   Got EPERM: Operation not permitted upon driver startup
     You have forgotten to install the hotplug files, as explained  in	the  IN-
     STALLATION  section  above.  Don't forget to restart hotplug so that it ap-
     plies these changes.

   Unattended shutdowns
     The hardware which was used for development of this driver is  almost  cer-
     tainly  different	from what you have, and not all manufacturers follow the
     USB HID Power Device Class specifications to the letter. You don't want  to
     find  out	that yours has issues here when a power failure hits your server
     room and you're not around to manually restart your servers.

     If you rely on the UPS to shutdown your systems in case  of  mains  failure
     and  to restart them when the power returns, you must test this. You can do
     so by running upsmon -c fsd. With the mains present, this should bring your
     systems down and then cycle the power to restart them again. If you do  the
     same  without  mains  present, it should do the same, but in this case, the
     outputs shall remain off until mains power is applied again.

   UPS cuts power too soon
     Note that many Cyber Power Systems (CPS) models tend to divide offdelay  by
     60  and round down, so the minimum advisable value is 60 (seconds) to avoid
     powering off immediately after NUT sends the shutdown command to the UPS.

     For many Cyberpower UPSs, offdelay must be set to	0  for	normal	behavior
     (the load is restored when AC power returns). Setting offdelay above 0 will
     restart  the  UPS load regardless of whether or not power has returned, and
     setting offdelay below 0 will disable the	auto-power-on  function  of  the
     UPS, keeping the load off even when power returns.

   UPS does not set battery.charge.low but says OK
     Note  that many Cyber Power Systems (CPS) models tend to allow only certain
     values for battery.charge.low and anything outside of the	set  of  allowed
     values are rounded or ignored.

     A shell loop like this can help you map out the allowed values:

	 for i in `seq 90 -1 0`; do echo "set to $i"; \
	     upsrw -s battery.charge.low=$i -u * -p * cps-big; \
	     sleep 1; upsc cps-big battery.charge.low; echo ""; \
	 done

     For  example,  for  CPS  PR1000LCDRTXL2U model, the only allowed values are
     [60,55,50,45,40,35,30,25,20] and in some cases, your  UPS	may  effectively
     not support a value of 10 for the battery.charge.low setting.

HISTORY
     This  driver, formerly called newhidups, replaces the legacy hidups driver,
     which only supported Linux systems.

AUTHORS
     Originally sponsored by MGE UPS SYSTEMS.

     Now sponsored by Eaton http://opensource.eaton.com

     *	 Arnaud Quette

     *	 Peter Selinger

     *	 Arjen de Korte

SEE ALSO
   The core driver
     nutupsdrv(8)

   Internet resources
     The NUT (Network UPS Tools) home page: https://www.networkupstools.org/

Network UPS Tools 2.8.5.	   08/04/2026			   USBHID-UPS(8)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=usbhid-ups&sektion=8&manpath=FreeBSD+Ports+15.1.quarterly>

home | help