HOWTO - UPS Status Email Alerts with Monit and apcupsd

Started by gfeiner, May 14, 2021, 03:04:04 AM

Previous topic - Next topic
If you use the apcupsd package and you want to receive email alerts when the status of your UPS changes, then read on.  The information presented here will allow to you receive an email alert anytime the UPS status is anything other than "ONLINE".  This howto could be applied to any of the information presented by the apcupsd's apcaccess command.  The steps I describe below were performed on OPNsense v21.1.5

Install the apcupsd package:

  • From shell, run "pkg install apcupsd"
  • Modify /usr/local/etc/apcupsd/apcupsd.conf as appropriate for your UPS model
  • Create the file /etc/rc.conf.d/apcupsd and put this line in it: pcupsd_enable="YES"
  • From shell, run "service apcupsd start"
  • From shell, run "service apcupsd status". This should result in saying that apcupsd is running
  • From shell, run "apcaccess". If your apcupsd conf file is correct, you should get output regarding your UPS with the STATUS line saying "ONLINE"
My UPS is a APC BackUps Pro 1350, connected via USB cable to Opnsense. The portions of apcupsd.conf that I set are:

  • UPSNAME APC1350S
  • UPSCABLE smart
  • UUPSTYPE usb
  • I left DEVICE blank
  • UPOLLTIME 60
  • ONBATTERYDELAY 6
  • BATTERYLEVEL 10
  • MINUTES 5


Next you need a shell script that queries the UPS using the apcaccess command and then passes that information to Monit. The script code below makes two calls to apcaccess. The first call is just to gather all output from the apcaccess command so it will be passed to Monit. The 2nd call to apcaccess parses the output for the value of the STATUS line. The rest of the code checks the value of the STATUS line from the apcaccess output and if it is anything other than ONLINE, the script will return non-zero status (failure) to Monit, otherwise it returns zero (OK).

#!/bin/sh

/usr/local/sbin/apcaccess
STATUS=`/usr/local/sbin/apcaccess -p STATUS`
OK='ONLINE'
if [ $STATUS != $OK ]; then
echo $STATUS
exit 1
else
exit 0
fi


  • Place the code above in a file and copy the file to /usr/local/opnsense/scripts/OPNsense/Monit
  • Make sure your file has executable permission

Now we need to configure Monit. The first step is to configure your email account information:

  • Navigate to Services->Monit->Settings
  • Click on the General Settings tab
  • Enter your email server/account information
  • Select "Enable Monit"
  • Click Save

Next we need to configure Monit to send a email notification anytime there is a failure status:

  • Click on the Alert Setting tab
  • Click the plus sign to add a new alert
  • Select Enable Alert
  • Place the email address you want to receive the alert at in the Recipient box
  • In the Events dropdown, select "Status failed"
  • In the "Mail format" box put "From: xxx" where xxx is the email address where the message will originate (the same email account you put in the General Settings tab
  • Click Save

Finally we need to tie the apcaccess status script in to Monit:

  • Click on the Service Settings tab
  • Click the plus sign
  • Select "Enable service checks"
  • Set Name to something descriptive like UPSStatusCheck
  • Set Type to Custom
  • In the Path box put: /usr/local/opnsense/scripts/OPNsense/Monit/xxx where xxx is the name of your script file
  • Leave Start and Stop blank
  • For Test select NonZeroStatus
  • Leave Depends set to NothingSelected
  • Click Save


Everything should be working at this point. Navigate to Services->Monit->Status. After the poll period on the General Settings tab has passed, you should see the output from the apcaccess command.  Please note that how quickly you are notified of UPS status changes depends on your Monit Polling Interval and the apcupsd polling interval.


Thanks it works! But, my question is: could“t be easier to add this possibility to "pass" all the system notification to Monit and send them via email? On pfSense it was sufficient to install apcupsd, then in system embedded setting enable system email notification (not only apcupsd) and you will get the email when power goes down, immediately without polling time, in the same instant you see the message via SSH...