N.U.T - UPS Monitoring via PfSense / Grafana

Server owners love electricity, that's why I'll tell you how I monitor my UPS to prevent my servers from shutting down the hard way.
N.U.T (Network UPS Tools) is a good choice to unify multiple brands UPS for monitoring.

I didn't want my hypervisor to assume this role, so I made some research and I saw a PfSense package for N.U.T.

My UPS is a small EATON UPS - MODEL ECO 800.

And it has an USB type B port on the back.
I connect the UPS to my PfSense box (WatchGUARD XTM 525, running PfSense)

PfSense

Package installation

Go to the package manager and search for the nut package


Install it

Configuration

The configuration is quite easy, you just need to go to the settings page of N.U.T, and choose the right driver.

To know which driver you need, the N.U.T team did a hardware compatibility list : https://networkupstools.org/stable-hcl.html
Here's the research for my model

And ... We give a name to the UPS (placard in my case) configure the correct driver, we define the UPS type as USB

After this, we get back to the UPS status page to see the result

Deeper exploitation

Now, our Firewall know the charge of the UPS, that's pretty nice, but, we could make something more personnal

The installation of N.U.T come with a command line tool called upsc, it displays all the information about your UPS.

upsc [ups_name]@ip_of_the_nut_server

Now, we format the data for exploitation

Grafana integration

For this part, I assume that you have already did a configuration of telegraf in PfSense (if not, refer to my previous guide : https://blog.lbdg.me/pfsense-monitoring/ )

I write a very simple script

filename : ups.sh, localized in /usr/local/etc
#!/bin/sh

charge=$(upsc placard@127.0.0.1|grep 'battery.charge:' | cut -d ' ' -f 2)
load=$(upsc placard@127.0.0.1| grep 'ups.load:' | cut -d ' ' -f2)

echo "ups,ups_name=placard,host=10.0.0.1 charge=$charge,load=$load"

Here's the script in action :

I unplugged the UPS to show you the charge decrease

I create an input filter in telegraf

Configuration add to /usr/local/etc/telegraf.conf
[[inputs.exec]]

        interval = "2s"
        commands = [
                "/usr/local/etc/ups.sh"
        ]

        data_format = "influx"

I reload the Telegraf agent and ... Data are coming in InfluxDB, here's a visual representation of the data with Grafana

Zabbix integration

I also have a Zabbix server and I wanted to send a command when the charge of the UPS is lower than a certain percentage.

I use remote commands to extract the data I need

I create 3 items

Here's the result

I create a trigger, if the ups.status is different than OL (On Line) and ... You can see a problem "battery connexion"

And a mail notification