4. 遥测数据模型设计

储能站接入 MQTT 遥测时,最先遇到的往往不是网络问题,而是“同一个物理量在不同设备里叫法不同、单位不同、精度不同”。如果不在接入前定义统一的数据模型,后续的实时监控、告警判断、历史存储和跨站对比都会陷入混乱。本节要解决的核心问题是:如何为储能站定义一套可落地、可校验、可扩展的遥测测点规范,使 MQTT 上报的数据在语义、类型、量纲和时间上保持一致。

一、测点命名:从“设备视角”转向“对象—属性”视角

储能站中常见的设备包括电池簇(BC)、电池模组(BM)、储能变流器(PCS)、电池管理系统(BMS)、能量管理系统(EMS)、液冷机组、消防主机、电表等。若直接沿用厂家点表,会出现 BatVolt1、簇电压、BC_Voltage 等多种写法。统一命名应遵循“对象标识 + 属性名”的结构,并固定分隔符与大小写规则。

推荐采用小写字母加下划线的形式,例如:bc_01_voltage、bc_01_current、bc_01_soc、pcs_01_active_power、pcs_01_dc_voltage、station_grid_frequency。其中 bc_01 表示 1 号电池簇,pcs_01 表示 1 号变流器,station 表示站级公共量。属性名应使用行业通用英文缩写,如 voltage、current、soc、soh、temperature、active_power、reactive_power、frequency。命名中不出现空格、中文、单位符号和特殊字符,避免 MQTT 主题与数据库字段解析时出错。

对于多簇、多 PCS 的站点,对象标识必须可扩展。例如 1 号簇的 3 号模组温度可命名为 bc_01_bm_03_temperature,这样既保留了层级关系,又便于用通配符订阅,如 station/telemetry/bc_01/#。命名一旦确定,应写入点表模板并作为接入验收的强制项。

二、数据类型与精度:让数值在传输和存储中不失真

MQTT 载荷通常使用 JSON,JSON 中的数字没有整数与浮点之分,但接收端解析后需要明确类型。建议按物理量性质划分:电压、电流、功率、频率、温度、SOC、SOH 等连续量使用浮点数;告警状态、开关状态、工作模式使用整数枚举或布尔值;累计电量、循环次数使用整数。浮点数在 JSON 中直接写数值,不要加引号,避免接收端再做一次字符串转换。

精度应与传感器分辨率和业务需求匹配。例如电池簇电压可保留 1 位小数,单位 V;簇电流保留 1 位小数,单位 A;SOC 保留 1 位小数,单位 %;温度保留 1 位小数,单位 ℃;有功功率保留 2 位小数,单位 kW。若原始数据精度更高,可在网关侧按“四舍五入”统一到约定小数位,避免同一测点在不同时间出现 3.14159 和 3.14 两种形态,影响历史曲线和阈值比较。

三、单位规范:统一量纲,避免“数值正确但含义错误”

单位必须与测点绑定,并在点表中显式声明。储能站常见单位包括 V、A、kW、kWh、Hz、℃、%、s。需要特别注意的是功率与电量:PCS 有功功率用 kW,电池簇累计充电量、放电量用 kWh;若厂家点表用 W 或 MWh,必须在接入层换算,不能把原始值直接写入统一模型。温度统一用 ℃,不混用 K 或 ℉。频率统一用 Hz,保留 2 位小数。

单位换算应在网关或边缘计算层完成,并记录换算系数。例如厂家上报有功功率为 W,统一模型要求 kW,则换算系数为 0.001;厂家上报温度为 0.1℃ 整数,统一模型要求 ℃,则换算系数为 0.1。换算后的值再按精度规则取整。这样,上层应用只面对一套量纲,不需要为每个厂家写特殊分支。

四、时间戳规范:区分采集时间、上报时间与接收时间

遥测数据的时间属性至少包含三个层次:采集时间(设备或传感器实际采样时刻)、上报时间(网关发出 MQTT 消息的时刻)、接收时间(平台收到消息的时刻)。统一模型应以采集时间作为业务时间基准,因为网络延迟和断线重连会导致上报时间与接收时间偏离实际采样时刻。采集时间建议使用 UTC 毫秒时间戳,字段名统一为 ts,值为 13 位整数,例如 1735689600000。若设备只能提供本地时间字符串,应在网关侧转换为 UTC 毫秒时间戳,并保留原始时区信息作为可选字段。

对于同一帧上报多个测点的情况,建议共用同一个 ts,表示这些测点属于同一次采集快照。若设备各测点采集时刻不同,则每个测点单独携带 ts。平台存储时以 ts 建立时间索引,查询和降采样都基于该字段,避免用接收时间导致曲线错位。

储能站遥测数据模型:命名—类型—单位—时间戳 设备原始点表 BatVolt1 / 簇电压 PCS_P / 有功功率 SOC_1 / 荷电状态 Temp3 / 模组温度 Time / 本地时间 命名不统一 单位混杂 时间格式各异 统一遥测模型 bc_01_voltage pcs_01_active_power bc_01_soc bc_01_bm_03_temperature ts (UTC 毫秒) 对象_属性 类型/精度固定 单位显式声明 MQTT 上报 JSON 示例 { "bc_01_voltage": 1332.5, "bc_01_current": -45.2, "bc_01_soc": 78.6, "bc_01_bm_03_temperature": 28.4, "pcs_01_active_power": 250.00, "pcs_01_dc_voltage": 1330.0, "ts": 1735689600000 } 主题:station/telemetry/bc_01 QoS 1,保留消息 false 命名:对象_属性;类型:连续量浮点、状态量整数;单位:V/A/kW/kWh/Hz/℃/%;时间:UTC 毫秒 ts

五、点表模板与校验规则

为了让规范可执行,应维护一份点表模板,至少包含以下字段:统一测点名、中文描述、设备类型、对象标识、属性名、数据类型、单位、精度、换算系数、采集周期、是否告警、备注。接入新设备时,先填写点表,再由网关按模板生成 MQTT 主题和 JSON 字段。平台侧对每条上报消息做校验:测点名是否在点表中、类型是否匹配、单位是否一致、ts 是否为 13 位整数且与当前时间偏差不超过允许范围。校验不通过的消息应进入异常队列并记录原因,而不是直接丢弃。

建议将点表以 CSV 或 YAML 形式纳入版本管理,每次变更记录修改人、时间和影响范围。这样当现场出现“某测点突然没有数据”时,可以快速判断是设备侧停采、网关换算错误,还是点表变更导致订阅主题不匹配。

六、一个可参考的接入示例

假设某储能站 1 号电池簇的 BMS 通过 Modbus 上报:簇电压 13325(单位 0.1V)、簇电流 -452(单位 0.1A)、SOC 786(单位 0.1%)、3 号模组温度 284(单位 0.1℃)。网关按点表换算后,得到统一模型值:bc_01_voltage = 1332.5 V、bc_01_current = -45.2 A、bc_01_soc = 78.6 %、bc_01_bm_03_temperature = 28.4 ℃,并附加采集时间戳 ts = 1735689600000。随后网关以主题 station/telemetry/bc_01 发布 JSON 消息。平台收到后,先校验点名和类型,再按 ts 写入时序数据库。若后续要查询 1 号簇最近 5 分钟电压曲线,只需按测点名和时间范围检索,不需要关心原始 Modbus 寄存器地址和换算系数。

这套模型的价值在于:命名让数据可被机器识别,类型和精度让数据可被稳定计算,单位让数据可被正确解释,时间戳让数据可被准确排序和回溯。四者缺一不可,共同构成储能站 MQTT 遥测接入的数据底座。