让华为 UPS2000-H 变得更加智能

  • ~4.58K 字
  • 次阅读
  • 条评论
  1. 1. 背景
    1. 1.1. 购买原因
    2. 1.2. 管理需求
  2. 2. 选择工具
    1. 2.1. 调整代码
  3. 3. 连接配置
    1. 3.1. nut 配置
    2. 3.2. HA 配置
    3. 3.3. 群晖配置
  4. 4. 后记

背景

购买原因

首先不得不提一嘴的就是我为什么会买 UPS2000-H 10kVA 这个 UPS 。

华为 UPS2000-H 10kVA 和一个电池包

  1. 手里的 GPU 服务器使用了两个 3000W 的电源供电。虽然实际上耗不了那么多(甚至快一年了也没开几次机),但为了确保它不会出现电力不足的问题,就还是留足了供电的余量,使用了 10kVA 的机型。
  2. 在家造个数据中心一文中提到,由于我们家是三相入户,为了确保服务器负载能均匀分配到每一相、避免单相电流太大将中性点拉偏的情况,需要一个能够支持三相输入的 UPS 。又由于使用的设备都是单相供电的设备,所以需要一个输出是单相的设备。
  3. 在选择设备的时候咨询过供应商,他们表示确实有一些可选的产品,从小品牌到大品牌的都有。由于之前已经有过被垃圾 UPS 坑害的经历,见到没听说过的品牌就会有先入为主的坏印象,所以就还是在大品牌的产品线里挑选。购买的时候并没有考虑智能化的需求,供应商又表示华为的价格比其他品牌(比如APC)便宜一些,所以也没怎么仔细考虑就确定了这个型号。

除了一些小小的问题(需要自己改电池包接线,电池包没有空开)之外,整体的安装部署体验也都是比较流畅优秀的。

管理需求

一般的 UPS 配置完成后也不会去动它,特殊情况下的准备(维修开关、急停按钮)也通过硬件完成了连接配置,主要希望能采集运行时的状态,记录历史数据以方便之后的核查,并可以辅助服务器自动关机等处理。

UPS 会定期进入自动放电测试模式,出于提示的目的它的蜂鸣器会响起。想要了解它具体的告警原因,就需要使用手机客户端 NetEco 连接上它进行查询。如果能有一个更直接的状态面板,也能省下些许的工夫。

这个 UPS 支持安装许多种型号的选配卡用于辅助管理,但我找了很多地方都没找到经销商,供应商也表示没有了解过,估计只有走官方支持渠道才能购买到,所以就打消了这个念头。

选择工具

华为有官方的管理软件 iManager NetEco 1000U ,但我不确定它是否适用于这个产品线,并且它只支持 Windows 系统,只是为了监测的话需要浪费不少资源,有些得不偿失。

之前使用垃圾 UPS 的时候没有任何支持资料,到处收集信息时稍微有了解到 nut 这个开源解决方案可以提供一个通用的数据接口,并且了解到群晖的 NAS 后台使用的也是这个工具来连接管理 UPS , Home Assistant 也支持使用它连接到 UPS 读取参数,所以就考虑以它为基础来提供支持。

简单的查询发现其实早在 2021 年就有大佬为它提供了些许支持,但可惜的是测试发现它并不支持 UPS2000-H 系列的产品。幸运的是,原开发者提到了华为官方提供了一份 Modbus 协议文档可以用来参考;顺着这个思路,我顺利地获得了这个系列产品的文档。

至此,准备工作已经就绪,剩下要做的就是以此为基础来提供一个定制化的驱动了。

调整代码

整体的代码框架无需改动,主要工作是:

  1. 修改机器型号与数量识别逻辑
  2. 添加三相输入相关的配置参数
  3. 修改不同的寄存器地址和处理逻辑

其中, 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
2
3
4
5
6
7
8
9
10
11
12
13
./configure --with-modbus \
--with-user=nut --with-group=nut \
--datadir=/usr/share/nut \
--sysconfdir=/etc/nut \
--includedir=/usr/include \
--with-statepath=/run/nut \
--with-pidpath=/run/nut \
--with-altpidpath=/run/nut \
--with-drvpath=/lib/nut \
--with-udev-dir=/lib/udev \
--with-systemdsystemunitdir=/lib/systemd/system \
--with-systemdshutdowndir=/lib/systemd/system-shutdown \
--with-drivers=huawei-ups2000h

为了避免与已有的 huawei-ups2000 驱动冲突,此处使用的驱动代号最后特别追加了一个 h 字母。

连接配置

首先使用 UPS 附带的 USB 线将它连接到运行 nut 的服务器。我手中的这个型号自带一条 USB Type-A 对 Type-A 的线,一端接在背后的 USB 接口处,另一端接在运行 nut 的服务器上。

由于需要连接 UPS 并连接 HA 和 NAS ,所以需要对 nut 进行一些配置。此处记录一下具体的配置细节,方便您如果有需要的话可以参考。

nut 配置

nut 部分主要分为三步骤:连接 UPS 、监听来自外部的请求、配置给群晖使用的用户。

Debian 系的 nut 配置文件放置在 /etc/nut/ 目录下。

  1. 连接 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 的描述。这一行可以任意修改。
  2. 需要调整 nut 的运行模式为网络服务器模式。编辑 nut.conf 文件,找到以 MODE= 开始的行,修改成这样:

    nut.conf
    1
    MODE=netserver

    如果该行为唯一的且前有 # 注释符号,请删除掉注释符号。

  3. nut 默认只监听来自本机的请求。要想监听其他请求,需要修改 upsd.conf 文件,添加如下内容:

    upsd.conf
    1
    LISTEN 0.0.0.0 3493

    此处的 0.0.0.0 表示所有可能的 IP 地址,即完全暴露于网络。如果您的网络环境不安全,请进行相关的调整。 3493 为 nut 服务运行的默认端口,如果没有特殊需要请不要修改它。

  4. 为了让群晖连接到 nut ,需要为它创建一个默认配置中的用户。编辑 upsd.users 文件,添加如下内容:

    upsd.users
    1
    2
    3
    [monuser]
    password = secret
    upsmon secondary

    请确保用户名和密码与样例中的一致。

修改完成后,您可能需要重启相关的服务进程以应用变更。

HA 配置

HomeAssistant 应该会自动检测到 nut 服务,并提示可以添加集成。 nut 允许匿名连接,您只需要设置主机地址为您的 nut 服务器即可。

默认情况下一些参数会被禁用,您可以手动启用它们。

将 UPS 连接到 HA 经由 nut

可以简单配置一些图表来辅助可视化,例如这样:

HA 中 UPS 相关的可视化面板

群晖配置

群晖的配置不是那么直观,它默认情况下不支持自定义的 nut 服务器,所以实际上我们需要使用它的 Synology 不断电系统服务器 功能。

前往 控制面板 - 硬件和电源 - 不断电系统 配置页面,勾选 启用 UPS 支持 后, 在 网络不断电系统服务器 IP 地址 输入框处输入您的 nut 服务器 IP ,再应用就可以尝试连接。

如果连接失败并且 启用 UPS 支持 前的钩子消失了,那么说明是和 nut 服务器通讯失败。此时请检查您的 nut 监听设置是否正确,用户名和密码设置是否正确,网络请求是否可达。
如果连接失败但钩子并没有消失,说明通讯成功,但是找不到 ups 。请确认您的 nut 设置的 ups 的标识符是否为 [ups] ,且检查 nut 是否成功与 UPS 建立了连接。

将 UPS 连接到 群晖 NAS 经由 nut

后记

其实这个实现并不完善,我没法确定 nut 会在什么情况下发出设备关闭指令,有搜到说法是处于 OBLB 同时出现的模式下,但由于 LB 的检测信号位和 UPS2000 的通用驱动不同,我是在告警部分添加了这样一个状态,无法确认它是否能正常生效(总不可能为了这点小事把电池放光)。同时关于状态变更与告警部分的配置非常简陋,实际上这个 UPS 支持非常精细的状态和告警数据,但我实在懒得折腾了就没再继续处理。

目前的状况是接入成功了但没有执行测试,如果以后有什么配置变化我会再继续在这篇文章里更新的。如果只是代码上的改动的话,那就直接看仓库好了。

分享这一刻
让朋友们也来瞅瞅!