內文大多來自 使用樹莓派監測控管UPS設備/Network UPS Tools/Linux [2023年最新] - Kyle’s Blog (KodeLab),該文章寫的非常好,請大家至原文閱讀,以下為整理的筆記

NUT 以及他的好朋友們

NUT 元件

元件說明
nut-driver與 UPS 溝通的驅動程式
nut-server能透過 nut-driver 獲得資訊後傳遞給 client
nut-client (nut-monitor)能連上 nut-server 獲取 UPS 資訊,然後控制本機關機等操作
nut-cgi簡易的網頁介面,顯示 UPS 狀態

NUT 指令

指令說明
upsdNUT Server 的 deamon
upsdrvctlNUT Server 上的 UPS 驅動程式
upsc簡易版的 UPS Client,可以快速連上本地或網路上的 NUT Server 查看 UPS 狀態
upsmon監看 UPS 與關機控制的程式
upscmd對 UPS 下達指令,例如開始電池測試、關閉蜂鳴器…等
upslog查看 UPS 狀態紀錄

NUT 設定檔

設定檔說明
nut.confNUT 運作模式等基本設定
ups.confNUT 的 UPS Driver 要連線的 UPS 的設定
upsd.confNUT 的 UPS Daemon 的設定
upsd.usersnut-server 使用者的帳密
upsmon.confnut-monitor 的設定
upssched.confNUT 排程
hosts.confNUT CGI Server 要監控的端點

設定 NUT Server

筆者安裝的環境是 Raspberry Pi 3B+,UPS 型號是 CP1500PFCLCDa TW,搭配串接另一台 Synology NAS UPS Server

安裝 NUT UPS Server

# 安裝 nut 後會一併安裝 nut-server 跟 nut-client 等程式。
$ sudo apt install -y nut
# 或是 Fedora 系列的
$ sudo dnf install -y nut

抓取連線的 UPS

將 UPS 的 USB 連接線插入電腦中

$ lsusb
# Bus 001 Device 005: ID 0764:0601 Cyber Power System, Inc. PR1500LCDRT2U UPS
# Bus 001 Device 004: ID 0424:7800 Microchip Technology, Inc. (formerly SMSC)
# Bus 001 Device 003: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
# Bus 001 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
# Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ sudo nut-scanner -U
# Scanning USB bus.
# [nutdev1]
# 	driver = "usbhid-ups"
#	port = "auto"
#	vendorid = "0764"
#	productid = "0601"
#	product = "CP1500PFCLCDa TW"
#	serial = "CXXXX2000111"
#	vendor = "CPS"
#	bus = "001"

設定 UPS 連線

sudo nano /etc/nut/ups.conf,將設定加入到檔案末

/etc/nut/ups.conf
[server_ups]
  driver = usbhid-ups
  port = auto
  vendorid = 0764
  productid = 0601
  pollinterval = 5
  desc = "Server Cluster UPS"
  serial = CXXXX2000111
  • 1:UPS 的名字,可以自己取
  • 2-58:依照前步驟 sudo nut-scanner -U 顯示的內容填入
  • 6:可不填入,範例的意思是每五秒拉一次訊息
  • 7:UPS 的描述,內容可自行填入

根據 Synology 論壇 的提醒, 若 Synology NAS 需要連線此 NTU Server,行 1 必須設定為 [ups]

完成後,執行 sudo upsdrvctl restart 重啟驅動

設定 NUT 模式

sudo nano /etc/nut/nut.conf,將 none 改為 netserver

/etc/nut/nut.conf
MODE=netserver

MODE 還有:單機模式 standalone、僅連線 ups server 的 netclient

完成後執行 sudo systemctl restart nut-server 重啟服務

設定 NUT 網路

sudo nano /etc/nut/upsd.conf,將設定加入到檔案末

/etc/nut/upsd.conf
LISTEN 0.0.0.0 3493

3493 是預設 port,0.0.0.0 代表允許任何 IP 連入,若要增加安全性可以稍作修改

設定 NUT 帳號

sudo nano /etc/nut/upsd.users,將設定加入到檔案末

/etc/nut/upsd.users
[admin]
	password = your_admin_password
	actions = SET
	instcmds = ALL
 
[upsmon]
	password = your_password
	upsmon primary
  • 1:admin 可以改成自己喜歡的帳號名,這個是使用 upscmd 控制 UPS 的時候會使用到的帳號
  • 6:upsmon 是給 nut-monitor 使用的帳號
  • 8:電源不足時,secondary 會先關機,primary 後作動,因為他是最主要的系統。舊版本可能稱為 masterslave

根據 Synology 論壇 的提醒, 若 Synology NAS 需要連線此 NTU Server,必須新增一組帳號密碼如下:

/etc/nut/upsd.users
[monuser]
  password = secret
  upsmon secondary

完成後執行 sudo systemctl restart nut-server 重啟服務

設定 NUT CGI Server

因為筆者使用 Raspberry Pi 跑 NUT,不想要浪費寶貴的計算資源,決定使用 nut-cgi 和 cgi 用的網頁伺服器 lighttpd

$ sudo apt install nut-cgi lighttpd

sudo nano /etc/nut/hosts.conf,將設定加入到檔案末

/etc/nut/hosts.conf
MONITOR server_ups@localhost "Server Cluster UPS"
MONITOR [email protected] "Network Device UPS"
  • 2:筆者有另一台 UPS 接在 Synology NAS 上,故填入兩行

設定完成後可以讓 cgi server 跑起來

$ sudo lighttpd-enable-mod cgi
$ sudo service lighttpd force-reload

這時候進入 http://your_ip/cgi-bin/nut/upsstats.cgi 就能看到簡潔有利的畫面了 NUT CGI Home Page NUT CGI Info Page

不喜歡那麼簡陋畫面的話,還有 Brandawg93/PeaNUTrshipp/webNUTBeardedTek-com/nutui 可以選擇

使用 NUT

查看 UPS 狀態

使用 upsc 即可查看狀態,upsc ups_name@host。Ex: upsc server_ups@localhost

UPS 資訊

名稱說明數值範例
battery.charge目前電池電量(%)100
battery.charge.warning電池低電量警告閾值(%)20
battery.charge.low電池低電量保護閾值(%)10
battery.runtime預估電池剩餘供電時間(秒)3525
battery.type電池類型PbAcid
battery.voltage電池電壓27.6
battery.voltage.nominal標準電壓值24
device.type設備類型(NUT 可以檢測 UPS 以外的一些電源設備)ups
driver.name驅動名稱usbhid-ups
driver.parameter.port與 UPS 的通訊埠auto
driver.version驅動版本2.7.4
input.frequency輸入的交流電頻率60
input.voltage輸入到 UPS 的電壓(V)115.0
input.frequency輸入到 UPS 的交流電頻率
input.transfer.high電壓上限,超過時會啟動穩壓保護136
input.transfer.low電壓下限,低於時會啟動穩壓保護88
output.voltage目前輸出給用電設備的電壓115.0
ups.mfrUPS 製造商CPS
ups.modelUPS 型號CP1500PFCLCD
ups.vendoridUPS 製造商 ID0764
ups.productidUPS 型號 ID0501
ups.loadUPS 負載 (%)10
ups.temperatureUPS 溫度
ups.statusUPS 狀態,常見有 OL(正常)、OB(使用電池)、OB(低電量)、RB(電池測試)、CHRG(電池充電)OL
ups.beeper.statusUPS 蜂鳴器是否啟動enabled
ups.test.resultUPS 自我測試結果:No test initiated、In progress、Aborted、Done and passed…等Done and passed

控制 UPS

使用 upscmd 即可控制 UPS,下 -l 可以看自己能對 UPS 做什麼事,ex: upscmd -u admin -p password -l ups@localhost

帳號是稍早寫在 /etc/nut/upsd.users 中的, 若是連線到 Synology NAS 的 UPS,帳號密碼分別是 monusersecret

關閉 UPS 蜂鳴器的範例:upscmd -u monuser -p secret [email protected] beeper.disable

UPS 日誌

upslog 可以用來查看 ups 日誌

$ sudo upslog -s server_ups -i 5 -l -
# Network UPS Tools upslog 2.8.0
# logging status of server_ups to - (5s intervals)
# Init SSL without certificate database
# 20240617 215506 100 117.0 13 [OL] NA NA
# 20240617 215511 100 117.0 13 [OL] NA NA
# 20240617 215513 100 117.0 13 [OL] NA NA
  • -i 5:每五秒一次
  • -l -:輸出到 STDOUT
  • 輸出格式:yyyyMMdd HHmmss 電池電量 輸入電壓 負載(%) [供電狀態] UPS溫度 輸入頻率

設定 NUT Client

這裡 client 指的是遠端機器,跟上方 NUT Server 不同台

安裝 NUT Client

$ sudo apt install -y nut-client

設定 NUT 模式

sudo nano /etc/nut/nut.conf,將 none 改為 netclient

/etc/nut/nut.conf
MODE=netclient

確認連線正常

先使用 upsc 連線看看,確認中間通訊沒有被防火牆擋住

$ upsc [email protected]
# Init SSL without certificate database
# battery.charge: 100
# battery.charge.low: 10
# battery.charge.warning: 20
# battery.mfr.date: CPS
# battery.runtime: 3525
# .......(略)

設定 NUT 監控的機器

sudo nano /etc/nut/upsmon.conf,將設定加入到檔案末

/etc/nut/upsmon.conf
MONITOR [email protected] 1 upsmon your_password secondary
  • upsmon 以及 your_password 改成您的帳號及密碼,該值是在 upsd.users 中設定的
  • 語法解釋:MONITOR <system> <powervalue> <username> <password> ("primary"|"secondary")
    • <system>:語法是 <upsname>@<hostname>[:<port>]
    • <powervalue>:通常為 1
    • primary 代表會最後關機,因為他是最主要的系統,會先讓 secondary 先關機
  • 還有很多設定,upsmon.conf 中的註解寫的非常清楚
    • SHUTDOWNCMD:關機要執行的指令
    • NOTIFYCMD:發生事件要執行的指令
    • NOTIFYFLAG:發生什麼事件要做什麼事情,語法:NOTIFYFLAG <notify type> <flag>[+<flag>][+<flag>] ...
      • <notify type>
        • ONLINE:UPS 在線上,即市電恢復時會觸發
        • ONBATT:UPS 使用電池供電,即市電中斷時會觸發
        • LOWBATT:UPS 低電量時會觸發
        • FSD:UPS 正在被關閉 (Forced Shutdown)
        • COMMOK:與 nut-server 成功建立連接時觸發
        • COMMBAD:與 nut-server 建立連接失敗(或斷線)時觸發
        • SHUTDOWN:UPS 發出關機指令觸發
        • REPLBATT:UPS 需要更換電池時觸發
        • NOCOMM:無法與 UPS 建立連接 (UPS未就緒) 時觸發
      • <flag>
        • SYSLOG:只在 syslog 中紀錄
        • WALL:在終端上提示 (/bin/wall)
        • EXEC:執行 NOTIFYCMD 指定的命令,並傳遞相關事件
        • IGNORE:忽略該事件

設定完成後重啟服務 upsmon -c reload,並且可以用 ps 查看服務是否正常執行

$ upsmon -c reload
$ ps -ef | grep upsmon
# root     1143160       1  0 11:22 ?        00:00:00 /lib/nut/upsmon start
# nut      1143161 1143160  0 11:22 ?        00:00:02 /lib/nut/upsmon start
# root     1250473 1242800  0 22:00 pts/0    00:00:00 grep upsmon