I have 2 CyberPower UPS units in my network cabinet (model #OR2200LCDRTXL2U)
I was looking for a way to monitor both UPS devices and send out an email in case either one loses external power.
CyberPower does provide a Remote Management card, but at $160 a piece, they’re pricey, and I would need 2 of these.
Instead, here’s a solution that wont run you over 50$
I had a spare Raspberry Pi 2 lying around, and doing some DuckDuck searches, I found several articles on how to setup monitoring for my UPS units using the Raspberry Pi unit.
Here are the steps:
Raspberry Pi setup
install appropriate distro on your Pi, in my case I’m using Lubuntu, but this should work with any Debian-based OS including Raspbian.
Place your Pi in your network cabinet and connect a Cat6 cable to your switch to obtain a LAN IP address (you can also do this via Wifi) — basically connect your Pi to the internet and be able to SSH to it to do configuration
Once this is done, plugin the 2 UPS units to your Pi using USB cables (see photo)
NUT-Client Configuration setup
SSH to your Pi as root and install the necessary packages that will connect to your UPS devices,
Here we are installing NUT packages (Network UPS Tools)
root@mrxpi:~# apt-get update && apt-get install nut nut-client nut-server
once installed, reboot the Pi, once rebooted, check if you can see your UPS devices,
root@mrxpi:~# lsusb
Bus 001 Device 050: ID 0764:0601 Cyber Power System, Inc. PR1500LCDRT2U UPS
Bus 001 Device 049: ID 0764:0601 Cyber Power System, Inc. PR1500LCDRT2U UPS
configure the /var/run/nut directory
root@mrxpi:~# mkdir /var/run/nut
root@mrxpi:~# chown nut:nut /var/run/nut
define your UPS devices,
vi /etc/nut/ups.conf
add the entires for your devices, here I am giving the description of each UPS and its position in my cabinet .
[cyberpower1]
driver = usbhid-ups
port = auto
desc = "CyberPower OR2200LCDRTXL2U-TOP"[cyberpower2]
driver = usbhid-ups
port = auto
desc = "CyberPower OR2200LCDRTXL2U-BOTTOM"
If your UPS model is different, see the driver list and choose appropriate driver
Start the NUT Client service
systemctl restart nut-client.service
restart Driver
root@mrxpi:~# upsdrvctl stop
root@mrxpi:~# upsdrvctl start
Test to see if you can see your UPS devices,
root@mrxpi ~# upsc cyberpower1@localhost
The command will return bunch of UPS information,
Init SSL without certificate database
battery.charge: 100
battery.charge.low: 10
battery.charge.warning: 20
battery.mfr.date: CPS
battery.runtime: 4710
battery.runtime.low: 300
battery.type: PbAcid
battery.voltage: 27.5
battery.voltage.nominal: 24
device.mfr: CPS
device.model: OR2200LCDRTXL2U
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.version: 2.7.2
driver.version.data: CyberPower HID 0.3
driver.version.internal: 0.38
input.transfer.high: 140
input.transfer.low: 90
input.voltage: 118.0
input.voltage.nominal: 120
output.voltage: 118.0
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.delay.start: 30
ups.load: 8
ups.mfr: CPS
ups.model: OR2200LCDRTXL2U
ups.productid: 0601
ups.realpower.nominal: 1650
ups.status: OL
ups.timer.shutdown: -60
ups.timer.start: -60
ups.vendorid: 0764
You can also check your 2nd UPS device the same way,
root@mrxpi ~# upsc cyberpower2@localhost
Configure NUT-Server and NUT-monitor
edit the NUT server file
vi /etc/nut/upsd.conf
add the following
LISTEN 127.0.0.1 3493
LISTEN <IP of your Rasp PI> # (in my case I'm using Raspberry LAN IP of 192.168.30.135)
LISTEN 192.168.30.135
Add UPS devices to monitor,
vi /etc/nut/upsmon.conf
MONITOR cyberpower1@<IP of Rasp PI> 1 upsmaster myPass123 master
MONITOR cyberpower2@<IP of Rasp PI> upsremote myPass123 slave
vi /etc/nuts/hosts.conf
add these lines
MONITOR cyberpower1@localhost “CyberPower OR2200LCDRTXL2U-TOP”
MONITOR cyberpower2@localhost “CyberPower OR2200LCDRTXL2U-BOTTOM”
Create Nut-Monitor service script
locate the Nut Monitor (lol) binary and get the path
which upsmon
create the systemd script
root@mrxpi# vi/etc/systemd/system/nut-monitor.service
[Unit]
Description=Network UPS Tools - power device monitor and shutdown controller
After=nut-server.service[Service]
ExecStart=/sbin/upsmon
PIDFile=/run/nut/upsmon.pid
Type=forking[Install]
WantedBy=multi-user.target
enable the monitor on reboot
systemctl enable nut-monitor
edit the monitoring mode
vi /etc/nut/nut.conf
MODE=netclient
set permissions & restart all services
sudo chown root:nut /etc/nut/*
sudo chmod 640 /etc/nut/*
systemctl nut-server restart
systemctl nut-client restart
Monitor UPS log
upslog -s cyberpower1@localhost -l -
unplug USB from Pi and watch to make sure log shows offline, replug it in and see it come back up,
root@mrxpi /e/nut# upslog -s cyberpower1@localhost -l -
Network UPS Tools upslog 2.7.2
logging status of cyberpower1@localhost to - (30s intervals)
Init SSL without certificate database
20190726 161546 100 118.0 8 [OL] NA NA20190726 161616 100 118.0 8 [OL] NA NA20190726 161646 NA NA NA [NA] NA NA
20190726 161716 100 118.0 8 [OL] NA NA
20190726 161746 100 118.0 8 [OL] NA NA
20190726 161816 100 119.0 8 [OL] NA NA
Configure Email alerts
for email alerts, I’m using Postfix, install it on the Pi if you dont have it,
this article describes the process of setting up Postfix + Gmail
Follow the guide to install and configure Postfix with Gmail.
My final postfix main.cf configuration looks like this,
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
data_directory = /var/lib/postfix
mail_owner = postfix
myhostname = mrxpi.company.com
myorigin = $myhostname
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost
unknown_local_recipient_reject_code = 550
mynetworks = 192.168.30.0/24
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
message_size_limit = 25600000
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.6.6/samples
readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
Test sending out email from your Pi and tail -f the mail log to see any messages,
# install mailutils
apt-get install mailutils
# test sending out email
mail -s "test pi" yourname@emailaddress.com < /dev/null
Follow the log in case any errors
tail -f /var/log/mail.log
once emailing works, move on to next part
Configure Monitoring Alerts
add Alerting conditions
vi /etc/nut/upsmon.conf
NOTIFYCMD /etc/nut/notifycmd.sh
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
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
create the shell script
vi /etc/nut/notifycmd.sh
#!/bin/bashTO='user@email.com'printf "Subject: UPS POWER SUPPLY ALERT: $NOTIFYTYPE\n\nUPS: $UPSNAME\r\nAlert type: $NOTIFYTYPE" | | mail -s "subject" $TO
add permissions
sudo chown root:nut /etc/nut/*
sudo chmod 755 /etc/nut/notifycmd.sh
restart all services
systemctl restart nut-server
systemctl restart nut-client
Your final files and permissions should look like this,
Heres the contents of each file,
cat /etc/nut/hosts.conf
MONITOR cyberpower1@localhost "CyberPower OR2200LCDRTXL2U-TOP"
MONITOR cyberpower2@localhost "CyberPower OR2200LCDRTXL2U-BOTTOM"
cat /etc/nut/notifycmd.sh
cat /etc/nut/notifycmd.sh#!/bin/bashTO='admin@company.com'printf "Subject: UPS POWER SUPPLY ALERT (Office cabinet): $NOTIFYTYPE\n\nUPS: $UPSNAME\r\nAlert type: $NOTIFYTYPE" | mail -s "subject" $TO
cat /etc/nut/nut.conf
MODE=netserver
cat /etc/nut/ups.conf
maxretry = 3[cyberpower1]
driver = usbhid-ups
port = auto
desc = "CyberPower OR2200LCDRTXL2U-TOP"
#pollinterval = 15[cyberpower2]
driver = usbhid-ups
port = auto
desc = "CyberPower OR2200LCDRTXL2U-BOTTOM"
#pollinterval = 15
cat /etc/nut/upsd.conf
LISTEN 127.0.0.1 3493
LISTEN 192.168.30.135 3493
cat /etc/nut/upsd.users
[admin]
password = spaceballs
actions = SET
instcmds = ALL[upsmon1]
password = spaceballs
upsmon master[upsmon2]
password = spaceballs
upsmon slave
cat /etc/nut/upsmon.conf
MONITOR cyberpower1@localhost 1 upsmon1 spaceballs masterMINSUPPLIES 1SHUTDOWNCMD "/sbin/shutdown -h +0"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpowerNOTIFYCMD /etc/nut/notifycmd.sh
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
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+WALLRBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5
the rest of files are default config settings.
Now test unplugging the UPS units from outlet, your Pi should send an email that looks like this
Subject: UPS POWER SUPPLY ALERT (Office cabinet): ONBATT
UPS: cyberpower1@localhost
Alert type: ONBATT