Apcupsd's Support for USB UPSes


Apcupsd version 3.9.4 or later (development version to be released as 3.10.1) provides direct support for USB UPSes on Linux systems. To run apcupsd with a USB UPS, you need the following things:
  • A USB UPS (for example APC's BackUPS 350 CS)
  • Apcupsd version 3.9.4 or higher
  • Version 2.4.5 or later of the Linux kernel
  • Alan Cox's patch to your kernel. If you have kernel 2.4.5, you must have patch ac12 or later. For later versions of the kernel, any ac patch should do.

Connecting a Serial port UPS to a USB port

If you would like to free up your serial port and connect your existing serial port UPS to a USB port, it is possible if you have one of the later kernels. You simply get a serial to USB adaptor that is supported by the kernel, plug it in and make one minor change to your apcupsd.conf file and away you go. Thanks to Joe Acosta for this out to me.

The device that Joe and I are using is IOgear guc232a USB 2 serial adaptor. There may be other adaptors that work equally well. If you know of one, please let us know.

At my site, running RedHat 7.1 with kernel 2.4.9-12, I simply changed my /etc/apcupsd/apcupsd.conf configuration line to be:

DEVICE /dev/ttyUSB0

Depending on whether or not you have hotplug working, you may need to explicitly load the kernel modules usbserial and

pl2303. In my case, this was not necessary.

Getting and Building a Kernel

Please note that a number of Linux packagers are including Alan Cox's patches in their standard releases. This is true for RedHat 7.1 and 7.2 if you have the latest kernel updates. As a consequence before getting and building your own kernel, if you are already running a 2.4.5 kernel or later, please check whether or not it already has the necessary USB updates. This can be done by creating the device files and running the USB test program as described below.

For some very brief instructions on how to get and build your kernel, see the Kernel Configuration section of this manual. More information on configurating a kernel can be found in the kernel-HOWTO do.

Making the Device Files

Once you have your kernel installed and working, you need to define the hiddev device files. This can be done by invoking the script in <apcupsd-src>/examples/make-hiddev, which does the following:
mkdir -p /dev/usb/hid
mknod /dev/usb/hid/hiddev0 c 180 96
mknod /dev/usb/hid/hiddev1 c 180 97
mknod /dev/usb/hid/hiddev2 c 180 98
mknod /dev/usb/hid/hiddev3 c 180 99
mknod /dev/usb/hid/hiddev4 c 180 100
mknod /dev/usb/hid/hiddev5 c 180 101
mknod /dev/usb/hid/hiddev6 c 180 102
mknod /dev/usb/hid/hiddev7 c 180 103
mknod /dev/usb/hid/hiddev8 c 180 104
mknod /dev/usb/hid/hiddev9 c 180 105
mknod /dev/usb/hid/hiddev10 c 180 106
mknod /dev/usb/hid/hiddev11 c 180 107
mknod /dev/usb/hid/hiddev12 c 180 108
mknod /dev/usb/hid/hiddev13 c 180 109
mknod /dev/usb/hid/hiddev14 c 180 110
mknod /dev/usb/hid/hiddev15 c 180 111

Installing the HIDDEV Header File

Once you have built the kernel, you must put a copy of hiddev.h into /usr/include. Use the following:
cd /usr/src<kernel-source-directory>/
cp include/linux/hiddev.h /usr/include/linux/

Building the Test Program

Next, we recommend that you build and run the hid-ups test program. To build it enter:
cd <apcupsd-src>/examples
make hid-ups
There should be no errors.

Now assuming that everything has gone well to this point and that you have connected your USB UPS, enter:
It should print a sample report of the information that it has obtained from your UPS. CAUTION! Do not run two copies of this program at the same time, or your kernel will freeze.

The report that is printed should look very similar to the report in <src>/hid-ups.rpt.

If the program reports that the device was not found ensure that all the appropriate modules are loaded as described in the Kernel Configuration section of this manual, then unplug your UPS and plug it back in. This should permit the kernel to recognize the UPS.

Building and Installing apcupsd

If you have gotten this far successfully, the last step should go fairly easily. You need a beta version 3.9.4 or later of apcupsd. Follow the instructions in the Installation Chapter of this manual, being sure to include the following options (in addition to any others you need) on the ./configure line:
  ./configure \
  --with-serial-dev=/dev/usb/hid/hiddev[0-9] \
  --with-upstype=usb \
  --with-upscable=usb \
  --enable-pthreads \


First, please rememeber this is beta software. It is not yet complete and there are sure to be some problems. However, as of October 2001, it has be successfully running with an APC BackUPS 350 CS for two and a half months on kernel 2.4.5-ac12.

Known Bugs

If either you disconnect the UPS or it disconnects because of some electrical problem, it will most certainly reconnect with a different device number. Apcupsd will detect this and reconnect properly. However, at the moment, it does not release the old device (serial port) lock file and create a new one.

If you disconnect the UPS and plug in a different one or a different model, it will continue to run, but the static data such as the UPS name, model, serial number, and firmware will not be updated. This will be corrected in a future version.

You should not run two USB UPSes on the same machine. If you do and they both disconnect at the same time, apcupsd is very likely to confuse the two due to the change in device names described above.

Currently (3.9.4) there is no code to power off the UPS. This will be forthcoming in a subsequent release. In the mean time, the UPS will normally power itself down one to two minutes after the machine is shutdown.

The UPS has an internal set of timers and remaining capacity counters, which it uses to determine when to shutdown. These are not currently completely integrated with the equivalent apcupsd counters (BATTERYLEVEL and MINUTES) basically because I (Kern) am not sure what the "right" way to do it is. As a consequence, apcupsd will shutdown on the first limit that triggers (either an apcupsd limit, or the UPSes limits).

The UPS internal counter equivalent to BATTERYLEVEL can be found in the hid-ups report and is RemainingCapacityLimit, which is typically factory set to 10 percent. In addition, the Low Battery signal is normally given by the UPS when less than 2 minutes of run time remain.

I've made some important changes to the master/slave code on 3.9.3, and have just recently noticed that they sometimes disconnect and cannot reconnect, so I recommend not to use versions 3.9.3 or earlier for master/slave configurations that are critical. Hopefully this is fixed in apcupsd version 3.9.4.

I have also tested apcupsd on kernel version 2.4.7-ac1, and it works fine. However, Samba NMB services failed to start on this kernel, probably because I have an older Samba version. As a consequence, for the moment, I have reverted to using kernel 2.4.5-ac12.

Version 3.9.3 only builds if USB support is enabled -- a problem with #ifdefing that needs fixing.