---
aliases: UPS设置
atlas: "[[Atlas/Omnivore|Omnivore]]"
created: 2024-02-22 23:22:09
id: 099f24a3-2f06-4ed7-b66a-4c031525c8a7
modified: 
tags:
  - OpenWrt
title: OpenWRT 软路由 UPS 教程 - 基于山特 TG-BOX 850
---

| [🌐 Omnivore](https://omnivore.app/me/open-wrt-ups-tg-box-850-18dd024f82f) | [🌐 Original](https://www.luqijian.com/2023/01/08/openwrt-with-ups-tutorial-based-on-santak-tg-box-850/) |
| ---- | ---- |

# 高亮批注

> <font color="yellow">自从开始搭建自己的 NAS 服务器后，偶尔会遇到突然断电的情况。不管是手误不小心点到米家 APP 上的智能插座的开关，还是公寓电费用完时的突然断电，都足以让人提心吊胆。</font> [🌐](https://omnivore.app/me/open-wrt-ups-tg-box-850-18dd024f82f#6281dadc-8b06-408b-a9a7-2e0504e76ea4) 

> [!NOTE]
> adadawa

> <font color="yellow">其实这一步可以省略，因为我的群晖里安装了 `vm-tools`，可以接收宿主机的命令，也就是通过 ESXI 来关机。</font> [🌐](https://omnivore.app/me/open-wrt-ups-tg-box-850-18dd024f82f#172379f8-7191-435f-9f62-c3213dfcb8fe) 

> [!NOTE]
> awdwafwaf

# 网页原文

## [NAS](https://www.luqijian.com/category/technology/nas/) / [技术](https://www.luqijian.com/category/technology/) / [软路由](https://www.luqijian.com/category/technology/%e8%bd%af%e8%b7%af%e7%94%b1/)・2023 年 1 月 8 日 **[0](https://www.luqijian.com/2023/01/08/openwrt-with-ups-tutorial-based-on-santak-tg-box-850/#respond)** 

## 前言

==自从开始搭建自己的 NAS 服务器后，偶尔会遇到突然断电的情况。不管是手误不小心点到米家 APP 上的智能插座的开关，还是公寓电费用完时的突然断电，都足以让人提心吊胆。==  
我的这台 NAS 其实相对算稳定的，突然断电过好几次，期间只因此出了两三次问题。如群晖无法引导需要重装系统之类。  
虽然群晖的系统设计比较优秀，重装系统并不会导致数据丢失，但是毕竟得花费不少时间恢复系统，有时候甚至需要重建存储池（并不会丢失数据）。而且毕竟是 NAS，数据安全第一。于是便买了台山特的 UPS，型号是 **TG-BOX 850**。

## 山特 Santak TG-BOX 850 UPS 简介

[ ![](https://proxy-prod.omnivore-image-cache.app/0x0,sZy7QaqpQPaZgo1L4GSDUBbBudKcIn8tvjmVTyiaybmQ/https://picture.luqijian.com/uploads/big/027f713fe382e6e92c75e93e185be682.png) ](https://picture.luqijian.com/uploads/big/027f713fe382e6e92c75e93e185be682.png) 
* 首先这是一款后备式的 UPS，也就是说其平时处于蓄电池充电状态，在停电时逆变器紧急切换到工作状态，将电池提供的直流电转变为稳定的交流电输出。因此，这类 UPS 存在一个切换时间的问题，不过一般切换时间达到了毫秒级别，对于家用 NAS 或计算机来说已经足够使用。  
[ ![](https://proxy-prod.omnivore-image-cache.app/0x0,sn5yCNzmcbDa8_5tZ96CkKWOFK3Oi0mjNz-eum-_nxpA/https://picture.luqijian.com/uploads/big/153579fedb9621af8e6ec2319126339d.png) ](https://picture.luqijian.com/uploads/big/153579fedb9621af8e6ec2319126339d.png)
* 它具有即插即用型 USB 通讯接口，可以用来与电脑、NAS、软路由等连接，在紧急断电时通知这类设备，进而可以实现自动关机的功能。相比于无通讯接口的 UPS 来说，实现了无人值守的自动关机。这点对于我的使用场景来说还是相当重要的，毕竟我不可能时时刻刻待在家里，坐在 NAS 旁边待停电后给它关机。
* 较大的功率支持。TG-BOX 850 最大不间断电源功率达到了 850VA/510W，虽然我的 NAS 满载时功率也就 100 多 W，但是 8 盘位且本身机箱硬盘仓背板不支持交错启动，加上 CPU 和显卡等，启动时的瞬时功率还是比较高的。并且为了日后的扩展需求，功率大点总归没错。
* 电池容量大。我的 NAS 上黑群晖虚拟机跑了不少服务，导致开关机时间会比较长，完整的关机时间大概在 6 分钟左右，这就要求 UPS 有着较长的续航来撑过这 6 分钟。而这款 UPS 在 100W 输出时可以续航 24 分钟，200W 输出时也可以续航 10.5 分钟，对于我的需求是绰绰有余了。
* 全部输出接口均有防雷支持，同时还有一组 RJ45 防止电话线 / 网线的防浪涌接口，最大限度防止设备受到电力波动影响。
* 除了一组 **2x 双孔 + 3x 三孔 支持不间断供电 + 防雷保护** 的输出插座外，它还另附一组   **2x 双孔 + 3x 三孔 仅支持防雷保护** 的输出插座，总输出功率可以达到 2000VA，即使是当作普通插线板来用也是非常不错的。
* 它还自带四个 5V/2A 的 USB 充电口，用来给一些低功耗设备供电，这四个口也是防雷的，只用 USB 的话可以把它当作一个超大号充电宝。

## 我的需求分析

我买这台 UPS 的主要目的是给 NAS 用，实现停电自动关机。但是我的 NAS 物理机装的是 ESXI 8.0 的虚拟化环境，群晖、Ubuntu、Windows 等都是同时运行在 ESXI 之上的虚拟机。这样就带来了问题。这台 UPS 本身是支持群晖的，可以直接用 USB 连接到群晖来实现相关功能。虽然群晖本身可以在 USB 连接 UPS 后充当一个网络 UPS 服务器来通知同网络中其它设备，但是群晖是跑在虚拟机上的，固然可以设置让 ESXI 在收到群晖 UPS 服务器的断电通知后延时一段时间等群晖关掉后再关机，不过这个延时的时间谁也说不准。  
而正好我的局域网里还有一台设备可以充当这个角色，那就是被我刷了 OpenWRT 用作软路由的树莓派 4B。这样我可以将 UPS 直接连接到树莓派，然后在树莓派上开启 UPS 服务器来通知 NAS 上的所有虚拟机以及 ESXI 本身，然后树莓派自己关机。并且树莓派 4B 功耗不高，和 NAS 一起插到 UPS 上也不会对续航有什么可感知的影响。  
整个 UPS 供电及通信网络拓扑如下图所示。  
[](https://picture.luqijian.com/uploads/big/97b32845493540991c1e392e1b02cba6.png)

[ ![](https://proxy-prod.omnivore-image-cache.app/0x0,syCKc28cLQuJND6rrQ7Aw8jdhFs3LhBtSeJg76IhK-RU/https://picture.luqijian.com/uploads/small/97b32845493540991c1e392e1b02cba6@2x.png) ](https://picture.luqijian.com/uploads/big/97b32845493540991c1e392e1b02cba6.png) 

## OpenWRT 配置

Linux 上实现和 UPS 之间通信主要依靠 **[NUT(Network UPS Tools)](https://networkupstools.org/)** 软件来实现。在 OpenWRT 上，除了基础的 nut-common 相关库和 nut-driver 驱动外，NUT 主要又由三个部分组成: nut-server、nut-upsmon、nut-web-cgi。其中 net-server 负责直接同 UPS 进行通信，提供 UPS 服务器功能，用于通知局域网设备；nut-upsmon 负责和 net-server 进行通信，相当于一个 nut-client，用于树莓派本机自动关机；nut-web-cgi 负责对外提供 API 程序和监控网页。另外还有 nut-upsc 可以直接命令行操作 UPS 等。  
对于这款 UPS，可以使用标准的 usbhid 协议来进行通信，所以需要安装 nut-driver-usbhid-ups 驱动包。

1. 首先，我们连接好 UPS 电源和 USB 数据线，使用 SSH 连接到软路由，通过 opkg 安装相关软件:  
```sql  
opkg update && opkg install nut nut-common nut-driver-usbhid-ups nut-server nut-upsmon nut-web-cgi nut-upsc  
```
2. 然后进行 nut-server 的配置，配置文件路径为 `/etc/config/nut_server`，将其内容修改为：  
```routeros  
config driver 'ups'  
    option driver usbhid-ups  
    option port 3493  
    option vendorid 0463  
config user  
    option username monuser  
    option password secret  
    option upsmon master  
config listen_address  
    option address 0.0.0.0  
    option port 3493  
config upsd upsd  
```  
然后重启一下 nut-server 服务：  
```jboss-cli  
/etc/init.d/nut-server reload  
```  
> 这里设置了一台名为 `ups` 的 UPS，其驱动程序为 `usbhid-ups`，UPS 服务器端口为 `3493`，制造商 ID 为 `0463`，UPS 服务器用户名为 `monuser`，UPS 服务器密码为 `secret`，UPS 监控模式为 `master` 主机模式，并且 UPS 服务器监听在设备的所有 IP 即 `0.0.0.0` 上，最后通过 `upsd` 来启动 UPS 通信程序。

> 需要注意的是，如果你需要把群晖连接到这台 UPS 服务器的话，这里的 `UPS名称`、`用户名`、`密码`、`模式`、`端口`**均不能修改**，这是因为群晖的开发者偷了个懒，UPS 设置只能设置服务器 IP 地址，UPS 名称和用户名、密码、端口等均写死到系统固件了（群晖其实也是通过 nut client 实现的，可以通过命令行修改，但没必要），因此，这里就按群晖的规范来书写。
> 
> 其实 NUT 本身是不能正确识别山特 UPS 的部分信息的，不过因为**山特**和   **Eaton** 之间有比较暧昧的关系，山特 UPS 的 USB 通信 `VendorID` 值 `0463` 其实对应的是 **Eaton**，最终我们在其他客户端软件中识别到的也会是 Eaton，也算是变相实现了。

1. 接着我们设置一下 nut-web-cgi，配置文件路径为 `/etc/config/nut_cgi`，将其内容修改为：  
```cmake  
config host  
option uspsname ups  
option hostname localhost  
option displayname "TG-BOX-850"  
```  
然后重启一下 nut-web-cgi 服务：  
```jboss-cli  
/etc/init.d/nut-cgi reload  
```  
> 这里 UPS 名称按之前 nut-server 的设置改为 `ups`，`hostname` 改为本机 `localhost` 即可，显示名称 `displayname` 可以自定义。
2. 然后设置一下 nut-upsmon 来实现树莓派的自动关机，配置文件路径为 `/etc/config/nut_monitor`，将其内容修改为：  
```routeros  
config 'upsmon' upsmon  
config master  
    option upsname ups  
    option hostname localhost  
    option username monuser  
    option password secret  
```  
然后重启一下 nut-upsmon 服务：  
```jboss-cli  
/etc/init.d/nut-monitor reload  
```  
> 这里的 UPS 名称、用户名、密码均按 nut-server 的设置填写即可，主机名也是 `localhost`。其实 upsmon 有一些相关配置项，比如通过 `shutdowncmd` 来设置关机命令等。不过这些设置项的默认值已经够用，这里我们不填保持默认设置即可。相关选项可以参考 [OpenWRT 的官方 Wiki](https://openwrt.org/docs/guide-user/services/ups/software.nut#config%5Fupsmon%5Fupsmon)。
3. 大功告成，此时给 UPS 断电来模拟停电的话，树莓派也会自己关机。

## 群晖配置

群晖的设置相对简单，图形化界面并且没什么太多可选项。  
这里以我的 NAS 现在运行的最新版的 `DSM 7.1.1-42962 Update 2` 系统为例，我们只需要进入群晖 DSM 网页端的`控制面板-硬件和电源-不断电系统`中，打开`启用UPS支持`选项，选择 UPS 类型为 `Synology不断电系统服务器`，然后设置 DiskStation 进入待机模式之前的时间为 `5秒`或者保留默认和服务器设置相同即可，然后再填入网络不断电系统服务器 IP 地址为软路由的 IP，点击应用即可。  
如果群晖没有提示任何错误，此时我们点击页面上的设备信息，就可以看到群晖获取到的 UPS 服务器信息了。可以看到，这里识别到的 UPS 厂商为 `EATON`。  
[](https://picture.luqijian.com/uploads/big/c68d2761a97be2c3315feedf0c7ad9b7.png)

[ ![](https://proxy-prod.omnivore-image-cache.app/0x0,sZ-8yYMuTWPLlpK3mLF9tApXvo-N0pvJeATLAX1H-GNM/https://picture.luqijian.com/uploads/small/c68d2761a97be2c3315feedf0c7ad9b7@2x.png) ](https://picture.luqijian.com/uploads/big/c68d2761a97be2c3315feedf0c7ad9b7.png) 

> ==其实这一步可以省略，因为我的群晖里安装了== `==vm-tools==`==，可以接收宿主机的命令，也就是通过 ESXI 来关机。==
> 
> ## ESXI 配置
> 
> ESXI 监听 nut-server 需要通过 NutClient-ESXI 插件来实现。
> 
> 1. 首先我们[下载插件](https://rene.margar.fr/download/1665/?tmstv=1673116778)到桌面，通过 scp 推送到 ESXI 宿主机：  
> ```angelscript  
> scp ~\Desktop\NutClient-ESXi-2.8.0-2.4.1-offline_bundle.zip root@192.168.50.100:/tmp  
> ```  
> 记得将命令中的包路径和 IP 地址替换为你下载的路径和你自己的 ESXI 宿主机地址。

1. 然后使用 SSH 登录到 ESXI 宿主机，运行如下命令安装插件：  
```angelscript  
esxcli software vib install -d /tmp/NutClient-ESXi-2.8.0-2.4.1-offline_bundle.zip  
```  
等待一会儿后返回安装结果：  
```yaml  
Installation Result  
Message: Install succeed.  
Reboot Required: false  
VIBs Installed: Margar_bootbank_upsmon_2.8.0-2.4.1  
VIBs Removed:  
VIBs Skipped:  
```  
安装成功。
2. 此时我们登录 ESXI 网页端，进入`管理-系统-高级设置`，在右上角的搜索框内输入 nut 来筛选出 nut 相关设置选项。  
[](https://picture.luqijian.com/uploads/big/c2c4c6457fafc6db7de03d5dcc59e7e1.png)  
[ ![](https://proxy-prod.omnivore-image-cache.app/0x0,s84leeoWtFv41tXCOCJ_nn4yEmkW6zOBcwzcwq883u9w/https://picture.luqijian.com/uploads/small/c2c4c6457fafc6db7de03d5dcc59e7e1@2x.png) ](https://picture.luqijian.com/uploads/big/c2c4c6457fafc6db7de03d5dcc59e7e1.png)
3. 分别把 `UserVars.NutUpsName`、`UserVars.NutUser`、`UserVars.NutPassword` 三个选项改为之前 OpenWRT 中 nut-server 设置的 UPS 名称、用户名、密码即可，其他选项可以保持默认，也可以根据需要自定义。
4. 然后进入`管理-服务`中，找到 **NutClient** 选项，将其策略设置为`随主机启动和停止`，然后启动该服务。  
[](https://picture.luqijian.com/uploads/big/6d67b1df70f79b86d1c495d92afba85c.png)  
[ ![](https://proxy-prod.omnivore-image-cache.app/0x0,s2PA67unpglE9W4BaqJsUbNP5wcsVTQJJVnIzwezz-Ug/https://picture.luqijian.com/uploads/small/6d67b1df70f79b86d1c495d92afba85c@2x.png) ](https://picture.luqijian.com/uploads/big/6d67b1df70f79b86d1c495d92afba85c.png)
5. 最后进入`管理-系统-自动启动`中，设置 ESXI 的启动和关机策略。  
最上方的编辑设置里是宿主机的启动和关机策略，首先启用该选项，启动延迟（宿主机启动多久后开始启动客户机）根据自己的需要修改。停止操作选择`关机`而不要选择`关闭电源`，这样以来只要客户机上安装有 vm-tools，宿主机会发送关机命令给客户机，让其自动关机。`等待检测信号`指宿主机是否检测客户机有没有完成关机，设置为`是`时，宿主机会等待客户机关机后再关机，设置为`否`后，宿主机只等待`停止延迟`选项设置的时间后便自动关机。建议两个设置均根据自身情况设置好，以防万一。  
然后针对每个客户机设置好对应的启动和关机策略即可，这里根据自己客户机开关机的实际情况设置。我的设置是开启`等待检测信号`的同时，也设置好停止延迟，防止出现问题。  
[](https://picture.luqijian.com/uploads/big/eccacd7e28894392c9a60254d4c59d0b.png)  
[ ![](https://proxy-prod.omnivore-image-cache.app/0x0,sXBx6xWgGYh6YgrWR_gxY24BISOD57tkIMkeq58jzbCc/https://picture.luqijian.com/uploads/small/eccacd7e28894392c9a60254d4c59d0b@2x.png) ](https://picture.luqijian.com/uploads/big/eccacd7e28894392c9a60254d4c59d0b.png)

## 测试

到这里所有设备就都设置好了，我们可以进行一场模拟演练。  
进入 ESXI 的任务监控后，断开 UPS 的供电线，可以发现，任务里依次出现了各个客户机的关机任务，最终客户机依次关机后，ESXI 宿主机自动关机，软路由也正常关机。  
大功告成。

## 附录：将 UPS 监控集成到 HomeAssistant

我在软路由上还运行了 HomeAssistant 来监控所有的智能家居设备，而 HomeAssistant 是有官方 NUT 插件的，如图所示，可以很方便的连接到 NUT 服务器。  
[](https://picture.luqijian.com/uploads/big/d725daa93d57c0fe46c1a4bfbed8bf1a.png)

[ ![](https://proxy-prod.omnivore-image-cache.app/0x0,s_dNtga-Vvdk0vYEePGXoZsOurPBV7kwJCun-3YG_gTg/https://picture.luqijian.com/uploads/small/d725daa93d57c0fe46c1a4bfbed8bf1a@2x.png) ](https://picture.luqijian.com/uploads/big/d725daa93d57c0fe46c1a4bfbed8bf1a.png)

[](https://picture.luqijian.com/uploads/big/d725daa93d57c0fe46c1a4bfbed8bf1a.png)  
连接完成后，我们便可以创建一个 UPS 监控面板了，即使出门在外，也可以随时掌握家中设备的供电情况。  
[](https://picture.luqijian.com/uploads/big/a7cade40d3077dfcaae9dab38e6a23d0.png)

[ ![](https://proxy-prod.omnivore-image-cache.app/0x0,sMrjWfRxJhTM8Tldc1NTI0OnBZ8MKphsLV6sFLdP3fXA/https://picture.luqijian.com/uploads/small/a7cade40d3077dfcaae9dab38e6a23d0@2x.png) ](https://picture.luqijian.com/uploads/big/a7cade40d3077dfcaae9dab38e6a23d0.png) 