BW55Tで快適商用電源周波数モニタリングライフ

Posted: 2022/08/03
Category: 知性

電力不足で突然停電とか御免なのでUPSを買った。OMRON BW55Tという機種で、ざっくり17000円ぐらいの至って普通な正弦波出力のUPSだ。

APC買うのはなんか癪だったのと、ユタカ電機はLinuxで雑に使えるかが不明すぎて怖かったのでOMRONにした。 接点出力でシャットダウンとかでもまあ十分だろうけど、電源バックアップと同時に商用電源の周波数監視もやりたいのである程度賢いインターフェースで繋がってくれるならそれに越したことはない。

OMRONのUPSがLinux機の自動シャットダウンに対応しているとは言っても付属の謎ソフトを入れる気は全くない。Network UPS Tools (nut) というapcupsd的なものがOMRONのUPSに対応しているらしく、BW55Tそのものの設定例は出てこないが旧製品?のBYシリーズとかの設定例がそれなりにあったので行けるだろうと踏んで選定した。

結果としては満足に動くようになったので、メモとして設定を残しておく。設定後1ヶ月半ぐらい放置してからこの記事を書いているので、いろいろ抜け漏れがあるかもしれないが、何か気づいたことがあればそのうち追記する。

サーバの脇で静かに頑張るUPSくん

目次

前提

各種インストール+udevルール投入

最終的に/dev/upsから/dev/bus/usb下の適当なバスにリンク張れてて、適当なバスにnutグループから書き込めそうな感じになればOK

BW55T以外を使う場合はidVendor/idProductをlsusbで良い感じに調べて置き換えてね

$ sudo apt install nut prometheus
$ echo 'ATTR{idVendor}=="0590", ATTR{idProduct}=="00d0", MODE="664", GROUP="nut", SYMLINK+="ups", TAG+="systemd", ENV{SYSTEMD_ALIAS}+="/sys/subsystem/ups/devices/ups"' | sudo tee /etc/udev/rules.d/50-nut-ups.rules
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger
$ ls -la /dev/ups
lrwxrwxrwx 1 root root 15  6月 28 16:23 /dev/ups -> bus/usb/003/004
$ ls -la `realpath /dev/ups`
crw-rw-r-- 1 root nut 189, 259  8月  3 02:08 /dev/bus/usb/003/004

Network UPS Tools

設定ぶち込み

注記なき場合、当該ファイルの内容を丸ごと示したとおりに置き換える

ups.conf

BW55T以外を使う場合はvendorid/productidをlsusbで良い感じに調べて置き換えてね

[bw55t]
        driver = blazer_usb
        port = /dev/ups
        desc = "Omron BW55T"
        vendorid = 0590
        productid = 00d0
        subdriver = ippon
        default.battery.voltage.high = 13.6
        default.battery.voltage.low = 11.6

# Set maxretry to 3 by default, this should mitigate race with slow devices:
#maxretry = 3
ondelay = 0

upsd.users

SUPER_PASSWORD は適当に置き換えること

[upsmon]
password = SUPER_PASSWORD
upsmon master

upsmon.conf

SUPER_PASSWORD は適当に置き換えること

# 末尾に追記
MONITOR bw55t@localhost 1 upsmon SUPER_PASSWORD master

動作チェック

nutの設定を投入したらnut-server再起動してupscコマンドでテスト

電圧とか取れてそうならOK

$ sudo systemctl restart nut-server.service
$ upsc bw55t
Init SSL without certificate database
battery.charge: 100
battery.voltage: 13.60
battery.voltage.high: 13.6
battery.voltage.low: 11.6
device.type: ups
driver.name: blazer_usb
driver.parameter.ondelay: 0
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/ups
driver.parameter.productid: 00d0
driver.parameter.subdriver: ippon
driver.parameter.synchronous: no
driver.parameter.vendorid: 0590
driver.version: 2.7.4
driver.version.internal: 0.12
input.frequency: 50.0
input.voltage: 104.5
input.voltage.fault: 0.0
output.voltage: 104.4
ups.beeper.status: disabled
ups.delay.shutdown: 30
ups.delay.start: 0
ups.load: 26
ups.productid: 00d0
ups.status: OL BYPASS
ups.temperature: 31.1
ups.type: offline / line interactive
ups.vendorid: 0590

Prometheus

思いつきでセットアップしたのをそのまま使っているためホスト直だったりDocker上で動いてたりいろいろめちゃくちゃ。

Prometheus本体はホスト直、exporter類はDockerコンテナ上というポリシーで既になんとなく動いてしまっているので今回もその通りにする。

/etc/prometheus/prometheus.conf

# scrape_configs: を探し、以下のように項目を追加する

scrape_configs:
  - job_name: nut-exporter
    metrics_path: /ups_metrics
    scrape_interval: 10s
    static_configs:
      - targets: ['localhost:9199']
        labels:
          ups: "bw55t"

  - job_name: ...

/etc/systemd/system/nut-exporter.service

nut_exporter のDockerイメージを良い感じにpullしてきて起動させるまでを全部systemd unitでやる。

ExecStart行の SUPER_PASSWORD はupsd.users等で設定したパスワードに書き換えること。いろいろめんどいので --net host で動かしてるが気になるなら良い感じにしてください

NUT_EXPORTER_VARIABLESは渡さないと電源周波数とかが取れなくてちょっと悲しい

[Unit]
Description=nut-exporter
Requires=docker.service network.target nut-server.service
After=docker.service network.target nut-server.service
[Service]
TimeoutStartSec=0
Restart=always
ExecStartPre=-/usr/bin/docker rm nut-exporter
ExecStartPre=-/usr/bin/docker pull druggeri/nut_exporter
ExecStart=-/usr/bin/docker run --net host --name nut-exporter --env NUT_EXPORTER_VARIABLES=battery.charge,battery.voltage,battery.voltage.nominal,input.voltage,input.voltage.nominal,ups.load,ups.status,input.frequency,output.voltage,ups.temperature --env NUT_EXPORTER_USERNAME=upsmon --env NUT_EXPORTER_PASSWORD=SUPER_PASSWORD druggeri/nut_exporter
ExecStop=-/usr/bin/docker kill nut-exporter
[Install]
WantedBy=multi-user.target

動作チェック

$ sudo systemctl daemon-reload
$ sudo systemctl start nut-exporter
$ sudo systemctl enable nut-exporter
$ sudo systemctl restart prometheus

Grafana

Prometheusが起動したらデータは取れてるはずなんで、Grafanaで取れたデータが見えれば完璧に動いたと言えるはずだ。

PromQLで network_ups_tools_input_voltage{ups="bw55t"} とクエリを突っ込んでやれば、UPSに供給されている商用電源の電圧が取れるはずなのであとは好き勝手にグラフをダッシュボードに追加していけば最強の電源監視環境が完成する。

network_ups_tools_ までクエリを入力しても何も出ないようなら何かがおかしいので頑張って直そう

大した精度はない値でも記録が見られると満足感がある

自動シャットダウン

aptで入れた状態でまあまあ良い感じにしてくれるような設定が入ってる気がする。 /etc/nut/upsmon.confSHUTDOWNCMD とかの記述があるんでその辺りを調整するとよさそう。

自分の環境では、aptで入れたそのままの設定ではUPSの電池切れは検知できてるのにシャットダウンコマンドの勢いが足らないせいでdaemon終了待ちとかどうでもいいことをやり、その間にバッテリーが息絶えて電源が雑に切れてしまった。何の意味もねえ…

SHUTDOWNCMD "/sbin/poweroff -f" とかに置き換えてみたけど、フル充電から完全放電まで30分ぐらいバックアップが保ってしまう 1 せいでテストがだるいので試してない。 新品状態でなら30分保つことがわかったので、30分間でなんとかすることにして気にしない方針とした。

余談

Prometheus入れようと思ったらBootstrapがラリった

結論: /usr/share/nodejs/bootstrap/ を消し飛ばす

$ sudo apt install prometheus
...
処理中にエラーが発生しました:
 /tmp/apt-dpkg-install-s0xnWM/03-libjs-bootstrap4_4.6.0+dfsg1-4_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
$ sudo apt autoremove libjs-bootstrap4
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
パッケージ 'libjs-bootstrap4' はインストールされていないため削除もされません
これらを直すためには 'apt --fix-broken install' を実行する必要があるかもしれません。
以下のパッケージには満たせない依存関係があります:
 prometheus : 依存: libjs-bootstrap4 しかし、インストールされようとしていません
E: 未解決の依存関係です。'apt --fix-broken install' を実行してみてください (または解法を明示してください)$ sudo apt install libjs-bootstrap4
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
libjs-bootstrap4 (4.6.0+dfsg1-4) を展開しています...
dpkg: アーカイブ /var/cache/apt/archives/libjs-bootstrap4_4.6.0+dfsg1-4_all.deb の処理中にエラーが発生しました (--unpack):
 '/usr/share/nodejs/bootstrap/dist/css/bootstrap-grid.css.dpkg-new' をオープンできません: No such file or directory
処理中にエラーが発生しました:
 /var/cache/apt/archives/libjs-bootstrap4_4.6.0+dfsg1-4_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
$ sudo rm -r /usr/share/nodejs/bootstrap/
$ sudo apt install libjs-bootstrap4
# 何事もなく入る クソ
$ sudo apt install prometheus

  1. Ryzen 5 3500, RAM 32GB, HDD4発(SATAx3, SASx1), RAIDカード(D2616-A22)と10GNIC(Mellanox ConnectX-3)それぞれ1枚ずつといった具合のPCをバックアップした場合 ↩︎