背景
购买原因
首先不得不提一嘴的就是我为什么会买 UPS2000-H 10kVA 这个 UPS 。
- 手里的 GPU 服务器使用了两个 3000W 的电源供电。虽然实际上耗不了那么多(甚至快一年了也没开几次机),但为了确保它不会出现电力不足的问题,就还是留足了供电的余量,使用了 10kVA 的机型。
- 在在家造个数据中心一文中提到,由于我们家是三相入户,为了确保服务器负载能均匀分配到每一相、避免单相电流太大将中性点拉偏的情况,需要一个能够支持三相输入的 UPS 。又由于使用的设备都是单相供电的设备,所以需要一个输出是单相的设备。
- 在选择设备的时候咨询过供应商,他们表示确实有一些可选的产品,从小品牌到大品牌的都有。由于之前已经有过被垃圾 UPS 坑害的经历,见到没听说过的品牌就会有先入为主的坏印象,所以就还是在大品牌的产品线里挑选。购买的时候并没有考虑智能化的需求,供应商又表示华为的价格比其他品牌(比如APC)便宜一些,所以也没怎么仔细考虑就确定了这个型号。
除了一些小小的问题(需要自己改电池包接线,电池包没有空开)之外,整体的安装部署体验也都是比较流畅优秀的。
管理需求
一般的 UPS 配置完成后也不会去动它,特殊情况下的准备(维修开关、急停按钮)也通过硬件完成了连接配置,主要希望能采集运行时的状态,记录历史数据以方便之后的核查,并可以辅助服务器自动关机等处理。
UPS 会定期进入自动放电测试模式,出于提示的目的它的蜂鸣器会响起。想要了解它具体的告警原因,就需要使用手机客户端 NetEco 连接上它进行查询。如果能有一个更直接的状态面板,也能省下些许的工夫。
这个 UPS 支持安装许多种型号的选配卡用于辅助管理,但我找了很多地方都没找到经销商,供应商也表示没有了解过,估计只有走官方支持渠道才能购买到,所以就打消了这个念头。
选择工具
华为有官方的管理软件 iManager NetEco 1000U ,但我不确定它是否适用于这个产品线,并且它只支持 Windows 系统,只是为了监测的话需要浪费不少资源,有些得不偿失。
之前使用垃圾 UPS 的时候没有任何支持资料,到处收集信息时稍微有了解到 nut 这个开源解决方案可以提供一个通用的数据接口,并且了解到群晖的 NAS 后台使用的也是这个工具来连接管理 UPS , Home Assistant 也支持使用它连接到 UPS 读取参数,所以就考虑以它为基础来提供支持。
简单的查询发现其实早在 2021 年就有大佬为它提供了些许支持,但可惜的是测试发现它并不支持 UPS2000-H 系列的产品。幸运的是,原开发者提到了华为官方提供了一份 Modbus 协议文档可以用来参考;顺着这个思路,我顺利地获得了这个系列产品的文档。
至此,准备工作已经就绪,剩下要做的就是以此为基础来提供一个定制化的驱动了。
调整代码
整体的代码框架无需改动,主要工作是:
- 修改机器型号与数量识别逻辑
- 添加三相输入相关的配置参数
- 修改不同的寄存器地址和处理逻辑
其中, nut 可以使用的的变量定义请参见官方文档中的内容。
由于其参数非常详细,支持的可能性与扩展性非常丰富,而我只是需要采集一些我用得到的数据,并非官方技术支持人员,所以我只选择了一些我需要使用到的情形进行适配,并没有对所有参数进行完整支持。如果您与我的使用场景一致,您可以参考我的解决方案;如果您想扩展更多丰富的支持,欢迎您随时在我的代码基础上进行进一步的扩展。
我的代码托管在 feat/huawei-ups2000h
分支,您可以使用如下的命令取得它:
1 | git clone https://github.com/Candinya/nut.git -b feat/huawei-ups2000h |
修改版的驱动为 drivers/huawei-ups2000h.c
文件,您也可以在线预览。
由于支持并不完善,因而暂无推送至上游的打算。如果您有更为完整通用的支持计划,欢迎在此基础上进行修改,记得保留作者声明即可。
值得注意的是, nut 对非 ASCII 字符的支持不佳。所以如果您需要启用某些参数或修改某些内容,请避免在代码中直接使用中文字符串。
至于具体的构建和安装流程,您可以参考原开发者的知乎文章。
我使用的是树莓派安装 Debian 作为 UPS 服务器(它同时也跑着 HA )也能运行,所以一般可以不用担心会有兼容性上的问题。
我手中的这台 UPS2000-H 产品使用的串口转换芯片并非 Exar 或 CH341 ,其在 lsusb
下的标识为 STMicroelectronics Virtual COM Port
,表现为使用 cdc_acm 驱动的形如 /dev/ttyACM0
的串口设备,是无需额外驱动可以直接通讯的。
我在构建时使用了 make
来构建所有内容,再单独将驱动拷入应用目录。我使用的配置方案为:
1 | ./configure --with-modbus \ |
为了避免与已有的 huawei-ups2000
驱动冲突,此处使用的驱动代号最后特别追加了一个 h 字母。
连接配置
首先使用 UPS 附带的 USB 线将它连接到运行 nut 的服务器。我手中的这个型号自带一条 USB Type-A 对 Type-A 的线,一端接在背后的 USB 接口处,另一端接在运行 nut 的服务器上。
由于需要连接 UPS 并连接 HA 和 NAS ,所以需要对 nut 进行一些配置。此处记录一下具体的配置细节,方便您如果有需要的话可以参考。
nut 配置
nut 部分主要分为三步骤:连接 UPS 、监听来自外部的请求、配置给群晖使用的用户。
Debian 系的 nut 配置文件放置在 /etc/nut/
目录下。
连接 UPS 需要修改
ups.conf
,添加如下内容:ups.conf 1
2
3
4[ups]
driver = huawei-ups2000h
port = /dev/ttyACM0
desc = "Huawei UPS2000-H 10kVA"其中各部分的定义如下:
[ups]
为 UPS 的标识,用于在多个 UPS 的场景中区分不同的 UPS 。从配置角度来讲该项可以为任何内容,但群晖只认ups
,如果您有给群晖使用的需求请确保它只能是这样。driver = huawei-ups2000h
为连接 UPS 使用的驱动。如果您使用的不是本文中提到的这个型号,请根据您的实际需求进行调整。port = /dev/ttyACM0
为 UPS 使用的端口。如果您无法确认,您可以比较连接 UPS 前后的/dev/tty*
列表变化来确定具体是哪一个。desc = "Huawei UPS2000-H 10kVA"
为 UPS 的描述。这一行可以任意修改。
需要调整 nut 的运行模式为网络服务器模式。编辑
nut.conf
文件,找到以MODE=
开始的行,修改成这样:nut.conf 1
MODE=netserver
如果该行为唯一的且前有
#
注释符号,请删除掉注释符号。nut 默认只监听来自本机的请求。要想监听其他请求,需要修改
upsd.conf
文件,添加如下内容:upsd.conf 1
LISTEN 0.0.0.0 3493
此处的
0.0.0.0
表示所有可能的 IP 地址,即完全暴露于网络。如果您的网络环境不安全,请进行相关的调整。3493
为 nut 服务运行的默认端口,如果没有特殊需要请不要修改它。为了让群晖连接到 nut ,需要为它创建一个默认配置中的用户。编辑
upsd.users
文件,添加如下内容:upsd.users 1
2
3[monuser]
password = secret
upsmon secondary请确保用户名和密码与样例中的一致。
修改完成后,您可能需要重启相关的服务进程以应用变更。
HA 配置
HomeAssistant 应该会自动检测到 nut 服务,并提示可以添加集成。 nut 允许匿名连接,您只需要设置主机地址为您的 nut 服务器即可。
默认情况下一些参数会被禁用,您可以手动启用它们。
可以简单配置一些图表来辅助可视化,例如这样:
群晖配置
群晖的配置不是那么直观,它默认情况下不支持自定义的 nut 服务器,所以实际上我们需要使用它的 Synology 不断电系统服务器
功能。
前往 控制面板
- 硬件和电源
- 不断电系统
配置页面,勾选 启用 UPS 支持
后, 在 网络不断电系统服务器 IP 地址
输入框处输入您的 nut 服务器 IP ,再应用就可以尝试连接。
如果连接失败并且 启用 UPS 支持
前的钩子消失了,那么说明是和 nut 服务器通讯失败。此时请检查您的 nut 监听设置是否正确,用户名和密码设置是否正确,网络请求是否可达。
如果连接失败但钩子并没有消失,说明通讯成功,但是找不到 ups 。请确认您的 nut 设置的 ups 的标识符是否为 [ups]
,且检查 nut 是否成功与 UPS 建立了连接。
后记
其实这个实现并不完善,我没法确定 nut 会在什么情况下发出设备关闭指令,有搜到说法是处于 OB
和 LB
同时出现的模式下,但由于 LB
的检测信号位和 UPS2000 的通用驱动不同,我是在告警部分添加了这样一个状态,无法确认它是否能正常生效(总不可能为了这点小事把电池放光)。同时关于状态变更与告警部分的配置非常简陋,实际上这个 UPS 支持非常精细的状态和告警数据,但我实在懒得折腾了就没再继续处理。
目前的状况是接入成功了但没有执行测试,如果以后有什么配置变化我会再继续在这篇文章里更新的。如果只是代码上的改动的话,那就直接看仓库好了。