目次

RaspberrypiにUPSを監視させる

やりたいこと

RaspberryPiでUPS(APC Smart-UPS LCDシリーズ)を監視
停電時にローカルネットワーク下のマシンを全てシャットダウンさせる
apcupsdを使えばクソ高いネットワークカードを購入する必要はない

UPS

UPSのファームウエアを最新にして、動作モードをMODBUSに変更しないとだめ
http://apcupsd.cvs.sourceforge.net/viewvc/apcupsd/apcupsd/ReleaseNotes?pathrev=Release-3_14_11
http://www.on-sky.net/~hs/index.cgi?date=20140813

ますたー

APC Smart-UPS LCD以降は独自プロトコルのせいで
apcupsd最新版(3.14.13以上)でなければUSB接続で監視できない
rasbianでapt-getしておちてくるのは3.14.12なので自分でmakeしようと思ったがなんかエラーでてよくわからないから
archlinuxのarmv7h用パッケージ解凍して無理やりいれる
http://us.mirror.archlinuxarm.org/armv7h/community/apcupsd-3.14.13-3-armv7h.pkg.tar.xz

apcups.confのUPS設定部分はこれ。これより下の方は適当

UPSCABLE usb
UPSTYPE usb
DEVICE
BATTERYLEVEL 残りバッテリー%になったらシャットダウン
MINUTES 残りバッテリー分になったらシャットダウン
TIMEOUT 0

/etc/init.d/apcupsつくって起動でーもんスクリプト書く。deb拾ってきていれてもいいか。
sysv-rc-conf apcups onで自動起動
するはずだったがしない。イミフメイだから/etc/init.d/rc.localにかいてごまかす
一定条件になるとUPS電源落とすように設定
本来であればこれもinit.dに記述すべきだがやっぱり動かない
なのでapccontrolのシャットダウン処理部分にapcupsd –killpowerいれこみ
さらにpowerfailファイルがないと動かないのでonbatteryでtouchさせる
offbatteryでは消す。

停電→onbattery→ups shutdown→pi shutdown

復電時にはUPS再起動に伴ってpi自動起動
さらにpiからwol飛ばしNAS起動させる
このためにcroneでwakeuplan常に飛ばし続けるが停電時、条件そろうと再起動ループしてしまう
対策としてpowerfailの有無(あればバッテリー駆動、なければAC駆動)で分岐処理させて対応

すれいぶ

うぃんどうずもlinuxもmacもmakeしろ
synology nasはこれ起動スクリプトにする

#!/bin/sh
# startup scripts for APCUPSD.

apcupsd_enable=${apcupsd_enable:-YES}
apcupsd_program=${apcupsd_program:-/opt/sbin/apcupsd}
apcupsd_flags=${apcupsd_flags:-"--kill-on-powerfail"}
apcupsd_pidfile=${apcupsd_pidfile:-/var/run/apcupsd.pid}
apcupsd_lockfile=${apcupsd_pidfile:-/var/spool/lock/apcupsd.lock}
case  in
start)
case "${apcupsd_enable}" in
[Yy][Ee][Ss])
rm -f /var/run/powerfail
rm -f /var/run/nologin
if [ -f ${apcupsd_program} ]; then
echo -n " apcupsd"
${apcupsd_program} ${apcupsd_flags} || return="  Failed."
touch ${apcupsd_lockfile}
fi
;;
esac
;;
stop)
PID=$(pidof apcupsd)
kill $PID || return="  Failed."
rm -f ${apcupsd_pidfile}
;;

restart)
 stop
 sleep 5
 start
;;

status)
/opt/sbin/apcaccess status
;;

*)
echo "usage:  {start|stop|restart|status}" 1>&2
;;
esac

exit 0;