====== 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;