homebridge-accessory-apcupsd
Version:
An apcupsd accessory plugin for Homebridge: https://github.com/nfarina/homebridge
191 lines (143 loc) • 6.45 kB
Markdown
# homebridge-accessory-apcupsd
An [apcupsd](http://www.apcupsd.org/) accessory plugin for [Homebridge](https://github.com/nfarina/homebridge).
# Installation
Run these commands:
% sudo npm install -g homebridge
% sudo npm install -g homebridge-accessory-apcupsd
NB: If you install homebridge like this:
sudo npm install -g --unsafe-perm homebridge
Then all subsequent installations must be like this:
sudo npm install -g --unsafe-perm homebridge-accessory-apcupsd
# Install, Configure, and Test apcupsd
This plugin won't work until you have [apcupsd](http://www.apcupsd.org/) running in your network.
I found this
[tutorial](http://www.anites.com/2013/09/monitoring-ups.html#How%20to%20monitor%20a%20UPS%20with%20a%20Raspberry%20Pi)
enlightening.
If you are running [homebridge](https://github.com/nfarina/homebridge) on a different platform than `apcupsd`,
then you must edit `/etc/apcupsd/apcupsd.conf` and change
NISIP 127.0.0.1
to
NISIP 0.0.0.0
By default, the `apcupsd` server will listen on
NISPORT 3551
Also make sure you have
NETSERVER on
## Monitoring Multiple UPS Devices
By default,
a single UPS is monitored via the USB cable;
however,
you can monitor multiple UPS devices on the same platform,
but the configuration depends on the platform.
For example,
using the Debian [instructions](https://wiki.debian.org/apcupsd#Configuring_.28Multiple_UPS_Devices.29) on my system:
# lsusb
Bus 001 Device 006: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 001 Device 005: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
...
# udevadm info --attribute-walk --name=/dev/usb/hiddev0 | egrep 'manufacturer|product|serial'
ATTRS{manufacturer}=="American Power Conversion"
ATTRS{product}=="Back-UPS RS 1500G FW:865.L7 .D USB FW:L7 "
ATTRS{serial}=="4B1848P19501 "
...
# udevadm info --attribute-walk --name=/dev/usb/hiddev1 | egrep 'manufacturer|product|serial'
ATTRS{manufacturer}=="American Power Conversion"
ATTRS{product}=="Back-UPS RS 1500MS FW:952.e3 .D USB FW:e3 "
ATTRS{serial}=="3B1812X23721 "
...
# cat >> /etc/udev/rules.d/ups.rules <<EOF
KERNEL=="hiddev*", ATTRS{manufacturer}=="American Power Conversion", ATTRS{serial}=="3B1812X23721 ", OWNER="root", SYMLINK+="usb/ups-computers"
KERNEL=="hiddev*", ATTRS{manufacturer}=="American Power Conversion", ATTRS{serial}=="4B1848P19501 ", OWNER="root", SYMLINK+="usb/ups-monitors"
EOF
# udevadm trigger --verbose --sysname-match=hiddev*
# cd /etc/apcupsd
# mv apcupsd.conf apcupsd.conf.old
# cp apcupsd.conf.old apcupsd-computers.conf
# cp apcupsd.conf.old apcupsd-monitors.conf
# vi apcupsd-computers.conf
... change UPSNAME to computers
... change DEVICE to /dev/usb/ups-computers
... change EVENTSFILE to /var/log/apcupsd-computers.events
... change SCRIPTDIR ... (if set)
... change PWRFAILDIR ... (if set)
... change STATFILE ... (if set)
# vi apcupsd-monitors.conf
... change UPSNAME to monitors
... change DEVICE to /dev/usb/ups-monitors
... change EVENTSFILE to /var/log/apcupsd-monitors.events
... change SCRIPTDIR ... (if set)
... change PWRFAILDIR ... (if set)
... change STATFILE ... (if set)
... change NISPORT to 3552
The change to `NISPORT` is **very** important as it will change the port number that the instance listens on.
The tricky part is to have `apcupsd` invoked properly by whaterver system control facility you are using.
My system uses [systemctl](http://man7.org/linux/man-pages/man1/systemctl.1.html):
# cp /lib/systemd/system
# mv apcupsd.service apcupsd.service.old
# cat > apcupsd\@.service <<EOF
[Unit]
Description=UPS '%I' power management daemon
Documentation=man:apcupsd(8)
[Service]
ExecStartPre=/lib/apcupsd/prestart
ExecStart=/sbin/apcupsd -f /etc/apcupsd/apcupsd-%i.conf -P /var/run/apcupsd-%i.pid
Type=forking
KillMode=process
PIDFile=/var/run/apcupsd-%i.pid
[Install]
WantedBy=multi-user.target
EOF
# systemctl enable apcupsd@computers.service
# systemctl start apcupsd@computers.service
# systemctl enable apcupsd@monitors.service
# systemctl start apcupsd@monitors.service
# Configuration
Edit `~/.homebridge/config.json`, inside `"accessories": [ ... ]` add:
{ "accessory" : "apcupsd"
, "name" : "..."
, "location" : "a.b.c.d"
// optional, here are the defaults
, "subtype" : "battery"
, "options" : { "ttl": 600, "verboseP" : false }
, "model" : "..."
, "serialNo" : "..."
, "firmware" : "..."
}
## Location
The IP address (`"a.b.c.d"`) is where `apcupsd` is running.
The default port number is `3551`,
and can be changed by adding it to the `location` value, e.g., `"192.168.1.109:3552"`.
## Subtype
By default,
the plugin will report on the battery in the UPS (i.e., `"subtype" : "battery"`);
however, you can also have it report on the power instead (i.e., `"subtype" : "power"`).
If you want both reports,
create two accessories different values for `name` (obviously!),
but with the same `location` value:
{ "accessory" : "apcupsd"
, "name" : "... Battery"
, "location" : "a.b.c.d"
, "subtype" : "battery"
}
,
{ "accessory" : "apcupsd"
, "name" : "... Power"
, "location" : "a.b.c.d"
, "subtype" : "power"
}
Please note that the `power` subtype is **experimental**.
At present,
there's no mechanism to get Volt-Amperes from the UPS (`0` is always reported).
More importantly,
Kilowatt-Hours is based on sampling Watt-Seconds.
## Name, Model, Serial Number, and Firmware Revision
Although the plugin successfully retrieves these values from `apcusbd`,
the plugin can not provide the modified values.
A [PR](https://github.com/nfarina/homebridge/pull/2169) has been submitted with a possible fix.
Until then,
I suggest you run
% apcaccess
and add the values for `UPSNAME`, `MODEL`, `SERIALNO`, and `FIRMWARE` to the `config.json` file.
# Many Thanks
Many thanks to [ToddGreenfield](https://github.com/ToddGreenfield) author of
[homebridge-nut](https://github.com/ToddGreenfield/homebridge-nut).
Many thanks to [mapero](https://github.com/mapero) author of [apcaccess](https://github.com/mapero/apcaccess).