This post covers the steps I followed to get the Network UPS Tools project software, referred to as NUT for the rest of this post, running on one of my Gentoo machines in support of a CyberPower Systems OR1500LCDRT2U UPS. I am hoping the tasks below are repeatable for other UPS devices as I need to repeat the tasks below on a MintBox Mini 2 which is using another model of UPS. OR1500LCDRT2U

Software Installation

I already installed the UPS in rack, connected it to my Gentoo machine via provided USB cable. A quick search on the Gentoo Wiki, turned up this guide to installing NUT which I used while installing and creating this post. The configurations below at time also draw heavily from NUT Introduction to Network UPS Tools Configuration Examples particularly with regard to heartbeat monitoring setup Chapter 6.

The NUT software is available through the Gentoo Portage system so I installed it in the usual way using emerge. I had already installed NUT before I thought to capture the command output. Output from the fresh install was similar to, but not exactly as below.

$ sudo emerge -a sys-power/nut

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R    ] sys-power/nut-2.7.4-r6::gentoo  USE="cgi snmp (split-usr) ssl tcpd ups_drivers_al175 ups_drivers_apcsmart ups_drivers_apcsmart-old ups_drivers_apcupsd-ups ups_drivers_bcmxcp ups_drivers_bcmxcp_usb ups_drivers_belkin ups_drivers_belkinunv ups_drivers_bestfcom ups_drivers_bestfortress ups_drivers_bestuferrups ups_drivers_bestups ups_drivers_blazer_ser ups_drivers_blazer_usb ups_drivers_clone ups_drivers_clone-outlet ups_drivers_dummy-ups ups_drivers_etapro ups_drivers_everups ups_drivers_gamatronic ups_drivers_genericups ups_drivers_isbmex ups_drivers_ivtscd ups_drivers_liebert ups_drivers_liebert-esp2 ups_drivers_masterguard ups_drivers_metasys ups_drivers_mge-shut ups_drivers_mge-utalk ups_drivers_microdowell ups_drivers_nutdrv_qx ups_drivers_oldmge-shut ups_drivers_oneac ups_drivers_optiups ups_drivers_powercom ups_drivers_powerpanel ups_drivers_rhino ups_drivers_richcomm_usb ups_drivers_riello_ser ups_drivers_riello_usb ups_drivers_safenet ups_drivers_solis ups_drivers_tripplite ups_drivers_tripplite_usb ups_drivers_tripplitesu ups_drivers_upscode2 ups_drivers_usbhid-ups ups_drivers_victronups usb xml zeroconf -ipmi (-selinux) -ups_drivers_netxml-ups -ups_drivers_nut-ipmipsu -ups_drivers_snmp-ups" 0 KiB

Total: 1 package (1 reinstall), Size of downloads: 0 KiB

Would you like to merge these packages? [Yes/No]    
>>> Verifying ebuild manifests
>>> Emerging (1 of 1) sys-power/nut-2.7.4-r6::gentoo
>>> Installing (1 of 1) sys-power/nut-2.7.4-r6::gentoo
>>> Jobs: 1 of 1 complete                           Load avg: 3.43, 2.48, 2.13

 * Messages for package sys-power/nut-2.7.4-r6:
 * Log file: /var/log/portage/elog/sys-power:nut-2.7.4-r6:20210121-115042.log 

 * Please note that NUT now runs under the 'nut' user.                
 * NUT is in the uucp group for access to RS-232 UPS.                                          
 * However if you use a USB UPS you may need to look at the udev or                            
 * hotplug rules that are installed, and alter them suitably.                                  
 *                                                                                             
 * You are strongly advised to read the UPGRADING file provided by upstream.                   
 *                                                                                             
 * Please note that upsdrv is NOT automatically started by upsd anymore.                       
 * If you have multiple UPS units, you can use their NUT names to                              
 * have a service per UPS:                                                                     
 * ln -s /etc/init.d/upsdrv /etc/init.d/upsdrv.$UPSNAME                                        
 *                                                                                             
 * If you want apcupsd to power off your UPS when it                                           
 * shuts down your system in a power failure, you must
 * add nut.powerfail to your shutdown runlevel: 
 *                                             
 * rc-update add nut.powerfail shutdown
 *                                             
 * CGI monitoring scripts are installed in /usr/share/nut/cgi.
 * copy them to your web servers ScriptPath to activate (this is a
 * change from the old location).
 * If you use lighttpd, see lighttpd_nut.conf in the documentation.
 *                                             
 * You are strongly advised to read the UPGRADING file provided by upstream.

>>> Auto-cleaning packages...

>>> No outdated packages were found on your system.

 * GNU info directory index is up-to-date.
$

Configuration

Scan for UPS

  • Does NUT see the UPS? Seems that the answer is yes.
sudo nut-scanner
Scanning USB bus.
No start IP, skipping SNMP
Scanning XML/HTTP bus.
No start IP, skipping NUT bus (old connect method)
Scanning NUT bus (avahi method).
[nutdev1]
        driver = "usbhid-ups"
        port = "auto"
        vendorid = "0764"
        productid = "0601"
        product = "OR1500LCDRT2U"
        vendor = "CPS"
        bus = "011"
$ 

Add NUT User to USB Group

My UPS is attached to computer by USB cable, so nut user needs to be added to usb group for things to work properly.

$ sudo usermod -a -G usb nut

NUT.CONF

The UPS is directly connected to this machine, and this is the machine where I am running NUT, so I am going to edit /etc/nut/nut.conf and set the mode to ‘'’standalone’’’ for now. I use Vim to edit things, but you can use any text editor to make changes to the files below.

sudo vim /etc/nut/nut.conf
FILE /etc/nut/nut.conf
Setting MODE=standalone

UPS.CONF

Create an /etc/nut/ups.conf describing the UPS and how to control it. Compatibility guidance here. Before making changes I backed up the example file by moving it to a new name. I then used the output of nut-scanner to create a base for the new file. Finally I opened the new file in my text editor, trimming out the noise and changing the name of the UPS device, until what I was left with was information in the table. The [heartbeat] section is from 6.1 of NUT Introduction to Network UPS Tools.

$ sudo mv  /etc/nut/ups.conf /etc/nut/ups.conf_example
$ sudo sh -c 'nut-scanner >/etc/nut/ups.conf'
$ sudo vim /etc/nut/ups.conf

[OR1500LCDRT2U]
        driver = "usbhid-ups"
        port = "auto"
        vendorid = "0764"
        productid = "0601"
        product = "OR1500LCDRT2U"
        vendor = "CPS"
        bus = "011"
        desc = "CyberPower OR1500LCDRT2U 1500 VA 900 W 8 Outlets Smart App LCD UPS"

[heartbeat]
        driver = "dummy-ups"
        port = "heartbeat.conf"
        desc = "Watch over NUT."

UPSD.USERS

At least one user needs to be configured for upsmon to launch. upsd creates a TCP connection which upsmon uses to check the status of the UPS. I set two accounts, one for upsmon to use, and an admin account to manage the UPS. I stripped all the comments from the example file and just left the entries as follows below.

sudo vim /etc/nut/upsd.users
[upsmon]
        password = upsmonpassword
        upsmon master
[admin]
        password = adminpassword
        actions = SET
        instcmds = ALL

UPSMON.CONF

This is the file which controls how monitoring of the UPS works. Edit it with a text editor to apply the setting you require. The provided example file is heavily commented, and what I wound up with below is essentially default, though I opted not to mess with certificates at this time. I will probably revisit that decision after I am happy things are working as I want, but for now I am using the values in the table below. Monitor dummy line from 6.3 of NUT Introduction to Network UPS Tools is for heartbeat monitoring.

sudo mv /etc/nut/upsmon.conf /etc/nut/upsmon.conf_example
sudo vim /etc/nut/upsmon.conf

RUN_AS_USER root
MONITOR OR1500LCDRT2U@127.0.0.1 1 upsmon upsmonpassword master
MONITOR dummy@127.0.0.1 0 upsmon upsmonpassword master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
NOTIFYCMD /usr/sbin/upssched
POLLFREQ 5
POLLFREQALERT 1
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower

NOTIFYMSG ONLINE	"UPS %s on line power"
NOTIFYMSG ONBATT	"UPS %s on battery"
NOTIFYMSG LOWBATT	"UPS %s battery is low"
NOTIFYMSG FSD		"UPS %s: forced shutdown in progress"
NOTIFYMSG COMMOK	"Communications with UPS %s established"
NOTIFYMSG COMMBAD	"Communications with UPS %s lost"
NOTIFYMSG SHUTDOWN	"Auto logout and shutdown proceeding"
NOTIFYMSG REPLBATT	"UPS %s battery needs to be replaced"
NOTIFYMSG NOCOMM	"UPS %s is unavailable"
NOTIFYMSG NOPARENT	"upsmon parent process died - shutdown impossible"

NOTIFYFLAG ONLINE	EXEC
NOTIFYFLAG ONBATT	EXEC
NOTIFYFLAG LOWBATT	SYSLOG+WALL
NOTIFYFLAG FSD		SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK	SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD	SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN	SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT	SYSLOG+WALL+EXEC
NOTIFYFLAG NOCOMM	SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT	SYSLOG+WALL

RBWARNTIME 43200

NOCOMMWARNTIME 600

FINALDELAY 5

UPSSCHED.CONF

This file is where operations are defined which will be carried out on the basis of upsmon findings as to the current conditions for the UPS. As above, so below. Edit with text editor to suit needed responses. My initial setup in table below is effectively direct transcription from Gentoo Wiki guide entry, then additions were made and some slight modifications as per 6.4 of NUT Introduction to support heartbeat checking.

sudo vim /etc/nut/upssched.conf

CMDSCRIPT /usr/bin/upssched-cmd
PIPEFN /var/lib/nut/upssched/upssched.pipe
LOCKFN /var/lib/nut/upssched/upssched.lock

# Restart timer which completes only if the dummy-ups heart beat
# has stopped.  See timer values in heartbeat.conf
AT ONBATT heartbeat@127.0.0.1 CANCEL-TIMER heartbeat-failure-timer
AT ONBATT heartbeat@127.0.0.1 START-TIMER  heartbeat-failure-timer 660

AT ONBATT OR1500LCDRT2U@127.0.0.1 START-TIMER onbatt 300
AT ONLINE OR1500LCDRT2U@127.0.0.1 CANCEL-TIMER onbatt online
AT LOWBATT * EXECUTE onbatt
AT COMMBAD * START-TIMER commbad 30
AT COMMOK * CANCEL-TIMER commbad commok
AT NOCOMM * EXECUTE commbad
AT SHUTDOWN * EXECUTE powerdown
AT REPLBATT * EXECUTE replacebatt

Make path the store scheduling control files and make sure nut user can create and remove files in the directory.

$ sudo mkdir -p /var/lib/nut/upssched
$ sudo chown nut:nut /var/lib/nut/upssched
$ 

UPSSCHED-CMD

This is the file which takes actions at the behest up upsmon. Change up as need with a text editor. Though not reflected in the code block bellow, I commented out the mail statements and added notify-send commands, which will let me see the action being invoked but not fill up my email in box whilst testing. The script below is heavily modified based on NUT Introduction to Network UPS Tools and my own needs.

sudo vim /usr/bin/upssched-cmd

#! /bin/bash
#
# This script should be called by upssched via the CMDSCRIPT directive.
# 
# Here is a quick example to show how to handle a bunch of possible
# timer names with the help of the case structure.
#
# This script may be replaced with another program without harm.
#
# The first argument passed to your CMDSCRIPT is the name of the timer
# from your AT lines.

# modified to support heartbeat response
logger -i -t upssched-cmd Calling upssched-cmd $1

# email notification addresses
EMAIL_TO="chuck@example.com"
EMAIL_FROM="upssched-cmd@${HOSTNAME:-nut}.example.com"

UPS="OR1500LCDRT2U"
STATUS=$( upsc $UPS ups.status )
CHARGE=$( upsc $UPS battery.charge )
CHMSG="[$STATUS]:$CHARGE%"

case $1 in
        onbatt)
		MSG="$UPS, $CHMSG - power failure - save your work!"
		MSG1="Hello, upssched-cmd reports power failure for $UPS"
        	MSG2="Current status: $CHMSG \n\n$0 $1"
		MSG3="UPS $UPS is on battery."
		#echo -e "$MSG1 $MSG2" | mail -r "$EMAIL_FROM" \
		#     -s "$MSG. Currently $CHMSG" "$EMAIL_TO"
                logger -t upssched-cmd "$MSG $MSG3"
		notify-send -u critical "$MSG $MSG3"
                # For example, uncommenting, you can stop some power-hog services
                systemctl stop salt-minion
                #rc-service xmr-stak stop
                ;;
        online)
		MSG="$UPS, $CHMSG - power supply had been restored."
		MSG1="Hello, upssched-cmd reports supply restored to $UPS"
        	MSG2="Current status: $CHMSG \n\n$0 $1"
		#echo -e "$MSG1 $MSG2" | mail -r "$EMAIL_FROM" \
		#     -s "$MSG. Currently $CHMSG" "$EMAIL_TO"
                logger -t upssched-cmd "$MSG"
		notify-send -u critical "$MSG"
                # For example, uncommenting, you can restart useful power-hog services
                systemctl start salt-minion
                #rc-service xmr-stak start
                ;;
        commbad)
	        MSG="Communications lost with $UPS."
		MSG1="Hello, upssched-cmd reports comminication lost with $UPS"
        	MSG2="Current status: $CHMSG \n\n$0 $1"
		#echo -e "$MSG1 $MSG2" | mail -r "$EMAIL_FROM" \
		#     -s "$MSG. Currently $CHMSG" "$EMAIL_TO"
                logger -t upssched-cmd "$MSG"
		notify-send -u critical "$MSG"
                ;;
        commok)
	        MSG="Communications established with $UPS."
		MSG1="Hello, upssched-cmd reports comminication established with $UPS"
        	MSG2="Current status: $CHMSG \n\n$0 $1"
		#echo -e "$MSG1 $MSG2" | mail -r "$EMAIL_FROM" \
		#     -s "$MSG. Currently $CHMSG" "$EMAIL_TO"
                logger -t upssched-cmd "$MSG"
		notify-send -u critical "$MSG"
                ;;
	lowbatt)
	        MSG="$UPS low battery.  Power down now!."
		MSG1="Hello, upssched-cmd $UPS battery low. Power down now!"
        	MSG2="Current status: $CHMSG \n\n$0 $1"
		#echo -e "$MSG1 $MSG2" | mail -r "$EMAIL_FROM" \
		#     -s "$MSG. Currently $CHMSG" "$EMAIL_TO"
                logger -t upssched-cmd "$MSG"
		notify-send -u critical "$MSG"
		salt pc* system.poweroff
		salt mitchell* system.poweroff
		salt mc1* system.poweroff
		salt monolith* system.poweroff
		salt xu4-cloud* system.poweroff
		salt trisquel* systemctl.poweroff
		salt velma* systemctl.poweroff
		;;
	heartbeat-failure-timer)
		MSG="NUT heart beat fails. $CHMSG"
		# Email to sysadmin
		MSG1="Hello, upssched-cmd reports NUT heartbeat has failed."
		MSG2="Current status: $CHMSG \n\n$0 $1"
		MSG3="\n\n$( ps -elf | grep -E 'ups[dms]|nut'|grep -v cupsd )"
		echo -e "$MSG1 $MSG2 $MSG3" | mail -r "$EMAIL_FROM" \
                     -s "NUT heart beat fails. Currently $CHMSG" "$EMAIL_TO"
        powerdown)
	        MSG="$UPS Powering down."
		MSG1="Hello, upssched-cmd $UPS is shutting down."
        	MSG2="Current status: $CHMSG \n\n$0 $1"
		#echo -e "$MSG1 $MSG2" | mail -r "$EMAIL_FROM" \
		#     -s "$MSG. Currently $CHMSG" "$EMAIL_TO"
                logger -t upssched-cmd "$MSG"
		notify-send -u critical "$MSG"
                ;;
        replacebatt)
	        MSG="Replace Batteries $UPS"
		MSG1="Hello, upssched-cmd reports battery replacement needed for $UPS."
        	MSG2="Current status: $CHMSG \n\n$0 $1"
		#echo -e "$MSG1 $MSG2" | mail -r "$EMAIL_FROM" \
		#     -s "$MSG. Currently $CHMSG" "$EMAIL_TO"
                logger -t upssched-cmd "The UPS needs new battery"
		notify-send -u normal "$MSG"
                ;;
	*)
		logger -t upssched-cmd "Unrecognized command: $1"
		notify-send -u critical "The UPS was sent an unrecognized command."
		;;
esac
logger -i -t upssched-cmd $MSG

Services

This is where I need to set aside the Gentoo Wiki guide on NUT. I have embraced Systemd as my init system and the rest of the guidance on the wiki is related to OpenRC managed services. Upon review of /lib/systemd/system, it does appear that some fairly basic systemd service files are installed for NUT. There are three files installed nut-server.service, nut-monitor.service, and nut-driver.service__. I enabled nut-server and nut-monitor, started nut-server which seems to take care of starting everything needed. Again the provided files are basic, but looks like they will do until I start trying to manage multiple UPS devices from the same system.

$ cd /lib/systemd/system
$ sudo systemctl enable nut-server.service
Created symlink /etc/systemd/system/multi-user.target.wants/nut-server.service → /lib/systemd/system/nut-server.service.
$ sudo systemctl enable nut-monitor.service
Created symlink /etc/systemd/system/multi-user.target.wants/nut-monitor.service → /lib/systemd/system/nut-monitor.service.
$ sudo systemctl start nut-server

$ sudo systemctl status nut-server
● nut-server.service - Network UPS Tools - power devices information server
     Loaded: loaded (/lib/systemd/system/nut-server.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2021-01-23 12:21:19 CST; 1h 46min ago
    Process: 132480 ExecStart=/usr/sbin/upsd (code=exited, status=0/SUCCESS)
   Main PID: 132481 (upsd)
      Tasks: 1 (limit: 28833)
     Memory: 676.0K
        CPU: 242ms
     CGroup: /system.slice/nut-server.service
             └─132481 /usr/sbin/upsd

Jan 23 12:21:19 setback upsd[132480]: listening on 127.0.0.1 port 3493
Jan 23 12:21:19 setback upsd[132480]: listening on ::1 port 3493
Jan 23 12:21:19 setback upsd[132480]: listening on 127.0.0.1 port 3493
Jan 23 12:21:19 setback upsd[132480]: Connected to UPS [heartbeat]: dummy-ups-heartbeat
Jan 23 12:21:19 setback upsd[132480]: Connected to UPS [OR1500LCDRT2U]: usbhid-ups-OR1500LCDRT2U
Jan 23 12:21:19 setback upsd[132480]: listening on ::1 port 3493
Jan 23 12:21:19 setback upsd[132480]: Connected to UPS [heartbeat]: dummy-ups-heartbeat
Jan 23 12:21:19 setback upsd[132480]: Connected to UPS [OR1500LCDRT2U]: usbhid-ups-OR1500LCDRT2U
Jan 23 12:21:19 setback upsd[132481]: Startup successful
Jan 23 12:21:19 setback systemd[1]: Started Network UPS Tools - power devices information server.

$ sudo systemctl status nut-monitor
● nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller
     Loaded: loaded (/lib/systemd/system/nut-monitor.service; enabled; vendor preset: disabled)
     Active: inactive (dead) since Sat 2021-01-23 08:38:40 CST; 5h 33min ago
    Process: 117775 ExecStart=/usr/sbin/upsmon (code=exited, status=0/SUCCESS)
   Main PID: 117775 (code=exited, status=0/SUCCESS)
        CPU: 8ms

Jan 23 08:38:40 setback systemd[1]: Started Network UPS Tools - power device monitor and shutdown controller.
Jan 23 08:38:40 setback upsmon[117775]: fopen /var/run/upsmon.pid: No such file or directory
Jan 23 08:38:40 setback upsmon[117775]: UPS: OR1500LCDRT2U@127.0.0.1 (master) (power value 1)
Jan 23 08:38:40 setback upsmon[117775]: Using power down flag file /etc/killpower
Jan 23 08:38:40 setback upsmon[117787]: Startup successful
Jan 23 08:38:40 setback systemd[1]: nut-monitor.service: Succeeded.

$ sudo systemctl status nut-driver
● nut-driver.service - Network UPS Tools - power device driver controller
     Loaded: loaded (/lib/systemd/system/nut-driver.service; static)
     Active: active (running) since Sat 2021-01-23 12:21:19 CST; 1h 53min ago
    Process: 132456 ExecStart=/usr/sbin/upsdrvctl start (code=exited, status=0/SUCCESS)
      Tasks: 2 (limit: 28833)
     Memory: 1.4M
        CPU: 1.273s
     CGroup: /system.slice/nut-driver.service
             ├─132459 /lib64/nut/usbhid-ups -a OR1500LCDRT2U
             └─132479 /lib64/nut/dummy-ups -a heartbeat

Jan 23 12:21:17 setback systemd[1]: Starting Network UPS Tools - power device driver controller...
Jan 23 12:21:18 setback upsdrvctl[132457]: Using subdriver: CyberPower HID 0.4
Jan 23 12:21:18 setback upsdrvctl[132457]: Network UPS Tools - Generic HID driver 0.41 (2.7.4)
Jan 23 12:21:18 setback upsdrvctl[132457]: USB communication driver 0.33
Jan 23 12:21:18 setback usbhid-ups[132459]: Startup successful
Jan 23 12:21:19 setback upsdrvctl[132456]: Network UPS Tools - UPS driver controller 2.7.4
Jan 23 12:21:19 setback dummy-ups[132479]: Startup successful
Jan 23 12:21:19 setback systemd[1]: Started Network UPS Tools - power device driver controller.

Testing

With the software now installed and working at least to a certain extent, it is time to test a fesw things, in preparation for the first pull the plug test.

Does NUT client see the UPS?

$ upsc -l
OR1500LCDRT2U
heartbeat

$ upsc -L
OR1500LCDRT2U: CyberPower OR1500LCDRT2U 1500 VA 900 W 8 Outlets Smart App LCD UPS
heartbeat: Watch over NUT.

What can NUT client see about the UPS?

battery.charge: 100
battery.charge.low: 10
battery.charge.warning: 20
battery.mfr.date: CPS
battery.runtime: 2517
battery.runtime.low: 300
battery.type: PbAcid
battery.voltage: 24.0
battery.voltage.nominal: 24
device.mfr: CPS
device.model: OR1500LCDRT2U
device.type: ups
driver.name: usbhid-ups
driver.parameter.bus: 011
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.product: OR1500LCDRT2U
driver.parameter.productid: 0601
driver.parameter.synchronous: no
driver.parameter.vendor: CPS
driver.parameter.vendorid: 0764
driver.version: 2.7.4
driver.version.data: CyberPower HID 0.4
driver.version.internal: 0.41
input.transfer.high: 140
input.transfer.low: 90
input.voltage: 121.0
input.voltage.nominal: 120
output.voltage: 121.0
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.delay.start: 30
ups.load: 36
ups.mfr: CPS
ups.model: OR1500LCDRT2U
ups.productid: 0601
ups.realpower.nominal: 900
ups.status: OL
ups.test.result: No test initiated
ups.timer.shutdown: -60
ups.timer.start: -60
ups.vendorid: 0764

What might happen if power was lost?

$ upsdrvctl -t shutdown
Network UPS Tools - UPS driver controller 2.7.4
*** Testing mode: not calling exec/kill
   0.000000
If you're not a NUT core developer, chances are that you're told to enable debugging
to see why a driver isn't working for you. We're sorry for the confusion, but this is
the 'upsdrvctl' wrapper, not the driver you're interested in.

Below you'll find one or more lines starting with 'exec:' followed by an absolute
path to the driver binary and some command line option. This is what the driver
starts and you need to copy and paste that line and append the debug flags to that
line (less the 'exec:' prefix).

   0.000074     Shutdown UPS: OR1500LCDRT2U
   0.000087     exec:  /lib64/nut/usbhid-ups -a OR1500LCDRT2U -k
   0.000096     Shutdown UPS: heartbeat
   0.000107     exec:  /lib64/nut/dummy-ups -a heartbeat -k