电能量测量 Cluster(ElectricalEnergyMeasurement)

Cluster ID: 0x0091  |  所在 Endpoint: 通常在电气设备端点(如智能插座、电能表、充电桩)

ElectricalEnergyMeasurement 负责记录设备随时间累积的电能消耗(或输出)。 与实时测量瞬时功率的 ElectricalPowerMeasurement(0x0090) 不同, 这个 Cluster 关注的是「一共用了多少电」和「这段时间用了多少电」。 两者通常共存于同一个 Endpoint,前者像车速表,后者像里程表。

能量单位:毫瓦时(mWh)

所有能量值的单位都是 mWh(毫瓦时),类型为 int64。 设备返回 12345678,实际电能是 12,345.678 Wh 即 12.35 kWh。 展示时需要做单位换算:除以 1000 得 Wh,再除以 1000 得 kWh。

累计 vs 周期

这个 Cluster 有两种计量模式,由 Feature 决定:
累计(Cumulative):从某个起点开始,持续累加的总电能,类似电表读数,只增不减(除非重置)。
周期(Periodic):每个测量周期内消耗的电能,周期结束后归零重新计算,适合统计「过去一小时用了多少电」。

数据结构

ElectricalEnergyMeasurement 使用两个核心 Struct 来承载数据。 理解这两个结构体是读懂整个 Cluster 的基础。

EnergyMeasurementStruct(电能测量数据)

每一次能量读数都用这个结构体表示。它包含能量值和对应的时间范围。

字段 类型 必选 说明
Energy int64 是 电能值,单位 mWh(毫瓦时)。累计模式下只增不减,周期模式下每周期重置
StartTimestamp epoch_s 否 测量区间的起始 UTC 时间(秒级 Unix 时间戳)
EndTimestamp epoch_s 否 测量区间的结束 UTC 时间(即最新更新时间)
StartSystime systime_ms 否 测量区间的起始系统时间(毫秒,设备本地单调时钟)
EndSystime systime_ms 否 测量区间的结束系统时间(毫秒)
Timestamp vs Systime

时间字段提供两套来源:Timestamp 是 UTC 墙钟时间(需要设备同步过 NTP), Systime 是设备启动后的单调递增时钟(不依赖网络,但重启会归零)。 设备至少提供其中一套;如果两套都有,优先使用 Timestamp。

CumulativeEnergyResetStruct(累计重置信息)

记录累计电能值上次被重置的时间。用于判断当前累计读数的起算时间。

字段 类型 说明
ImportedResetTimestamp epoch_s 输入侧累计值上次重置的 UTC 时间
ExportedResetTimestamp epoch_s 输出侧累计值上次重置的 UTC 时间
ImportedResetSystime systime_ms 输入侧累计值上次重置的系统时间
ExportedResetSystime systime_ms 输出侧累计值上次重置的系统时间

属性详解

ElectricalEnergyMeasurement 共有 6 个应用属性。点击属性 ID 可跳转到详细说明。

ID 名称 类型 所需特性 说明
0x0000 Accuracy MeasurementAccuracyStruct 无(必选) 测量精度描述
0x0001 CumulativeEnergyImported EnergyMeasurementStruct IMPE & CUME 累计输入电能(用电量)
0x0002 CumulativeEnergyExported EnergyMeasurementStruct EXPE & CUME 累计输出电能(发电量)
0x0003 PeriodicEnergyImported EnergyMeasurementStruct IMPE & PERE 当前周期输入电能
0x0004 PeriodicEnergyExported EnergyMeasurementStruct EXPE & PERE 当前周期输出电能
0x0005 CumulativeEnergyReset CumulativeEnergyResetStruct CUME 累计值重置时间信息

Accuracy(测量精度)

描述这个电能计量设备的测量精度和量程范围。使用 MeasurementAccuracyStruct 结构体, 包含测量类型(固定为 ElectricalEnergy)、量程上下限、以及不同区间的精度描述。 这是唯一的必选属性,所有实现此 Cluster 的设备都必须上报。

  • 类型: MeasurementAccuracyStruct
  • 读写: 只读
  • 必选: 是

CumulativeEnergyImported(累计输入电能)

从设备开始计量(或上次重置)到现在,设备从电网输入(消耗)的总电能。 这就是日常所说的「总用电量」,类似家用电表的读数。值只增不减,除非通过重置操作归零。

  • 类型: EnergyMeasurementStruct,Nullable
  • 所需特性: IMPE(ImportedEnergy)+ CUME(CumulativeEnergy)
  • 换算: energy / 1000 = Wh,energy / 1000000 = kWh

CumulativeEnergyExported(累计输出电能)

设备向电网输出(反馈)的累计总电能。 适用于光伏逆变器、储能系统等能向电网回馈电力的设备。普通家用电器不会上报此属性。

  • 类型: EnergyMeasurementStruct,Nullable
  • 所需特性: EXPE(ExportedEnergy)+ CUME(CumulativeEnergy)

PeriodicEnergyImported(周期输入电能)

当前测量周期内设备输入(消耗)的电能。每个周期结束后自动重置。 适合统计「过去一小时用了多少电」「今天用了多少电」等场景。 周期长度由设备实现决定,通过 StartTimestamp / EndTimestamp 可以计算。

  • 类型: EnergyMeasurementStruct,Nullable
  • 所需特性: IMPE(ImportedEnergy)+ PERE(PeriodicEnergy)

PeriodicEnergyExported(周期输出电能)

当前测量周期内设备向电网输出(反馈)的电能。与 PeriodicEnergyImported 对称, 用于有发电能力的设备统计周期内的发电量。

  • 类型: EnergyMeasurementStruct,Nullable
  • 所需特性: EXPE(ExportedEnergy)+ PERE(PeriodicEnergy)

CumulativeEnergyReset(累计重置信息)

记录累计电能值上次被重置的时间。通过这个属性可以知道 CumulativeEnergyImported / CumulativeEnergyExported 是从什么时候开始累计的。如果设备从未被重置过,此属性为 null。

  • 类型: CumulativeEnergyResetStruct,Nullable
  • 所需特性: CUME(CumulativeEnergy)

事件(Events)

ElectricalEnergyMeasurement 没有命令(纯只读 Cluster),但定义了两个重要事件。 设备通过事件主动通知 App 电能数据的更新, 比定时轮询属性更高效,尤其适合需要实时跟踪用电量变化的场景。

ID 名称 优先级 所需特性 说明
0x00 CumulativeEnergyMeasured INFO CUME 累计电能更新
0x01 PeriodicEnergyMeasured INFO PERE 周期电能更新

CumulativeEnergyMeasured(累计电能更新事件)

当设备的累计电能值发生变化时触发。事件数据中包含最新的累计输入和/或输出电能。

字段类型说明
EnergyImported EnergyMeasurementStruct 最新的累计输入电能(可选,取决于 IMPE 特性)
EnergyExported EnergyMeasurementStruct 最新的累计输出电能(可选,取决于 EXPE 特性)

PeriodicEnergyMeasured(周期电能更新事件)

每个测量周期结束时触发。事件数据中包含该周期内的输入和/或输出电能。 适合 App 在收到此事件后将数据追加到历史记录中,形成用电曲线图。

字段类型说明
EnergyImported EnergyMeasurementStruct 本周期输入电能(可选,取决于 IMPE 特性)
EnergyExported EnergyMeasurementStruct 本周期输出电能(可选,取决于 EXPE 特性)

Feature 位图

ElectricalEnergyMeasurement 通过 FeatureMap(0xFFFC)声明设备支持哪些计量能力。 四个 Feature 两两组合,决定了设备能提供哪些属性和事件:

Bit 0
IMPE(ImportedEnergy) 支持测量输入电能(消耗) —— 绝大多数设备都有此特性
Bit 1
EXPE(ExportedEnergy) 支持测量输出电能(发电/回馈) —— 光伏、储能设备使用
Bit 2
CUME(CumulativeEnergy) 支持累计计量 —— 提供从起点到当前的总电能
Bit 3
PERE(PeriodicEnergy) 支持周期计量 —— 提供每个周期内的电能消耗
Feature 组合规则

设备必须至少支持 IMPE 或 EXPE 其中之一(总得测量某个方向的电能), 同时至少支持 CUME 或 PERE 其中之一(总得有一种计量模式)。 典型的智能插座通常只有 IMPE + CUME(Bit 0 + Bit 2 = FeatureMap = 5), 而光伏逆变器可能四个全开(FeatureMap = 15)。

与 ElectricalPowerMeasurement 的关系

Matter 把电气测量拆成了两个 Cluster,各司其职:

ElectricalPowerMeasurement(0x0090) ElectricalEnergyMeasurement(0x0091)
测量对象 瞬时功率(Power) 累积电能(Energy)
单位 mW(毫瓦) mWh(毫瓦时)
类比 汽车的速度表 —— 现在多快 汽车的里程表 —— 一共走了多远
典型读数 「当前功率 150W」 「本月用电 45.3 kWh」
数据获取 读取属性(实时值) 订阅事件(累计/周期更新)

两者通常共存于同一 Endpoint。App 界面上可以同时展示实时功率(来自 0x0090)和累计用电量(来自 0x0091), 前者适合实时监控,后者适合用电统计和费用计算。

示例数据

一个支持 IMPE + CUME + PERE 特性的智能插座的 ElectricalEnergyMeasurement Cluster 读取结果:

{
  // --- ElectricalEnergyMeasurement Cluster(Endpoint 1)---

  // --- 测量精度 ---
  "0x0000": {                    // Accuracy(MeasurementAccuracyStruct)
    "measurementType": 1,        // ElectricalEnergy
    "measured": true,
    "minMeasuredValue": 0,
    "maxMeasuredValue": 100000000000,  // 100,000 kWh
    "accuracyRanges": [{
      "rangeMin": 0,
      "rangeMax": 100000000000,
      "fixedMax": 5000           // 最大固定误差 5000 mWh = 5 Wh
    }]
  },

  // --- 累计电能(需要 IMPE + CUME 特性)---
  "0x0001": {                    // CumulativeEnergyImported
    "energy": 12345678,          // 12,345,678 mWh = 12,345.678 Wh ≈ 12.35 kWh
    "startTimestamp": 1700000000,// 2023-11-14T22:13:20Z(开始计量时间)
    "endTimestamp": 1700086400   // 2023-11-15T22:13:20Z(最新更新时间)
  },

  // --- 周期电能(需要 IMPE + PERE 特性)---
  "0x0003": {                    // PeriodicEnergyImported
    "energy": 543210,            // 543,210 mWh = 543.21 Wh ≈ 0.54 kWh(本周期用电)
    "startTimestamp": 1700082800,// 周期开始时间
    "endTimestamp": 1700086400   // 周期结束时间(1 小时周期)
  },

  // --- 累计重置信息(需要 CUME 特性)---
  "0x0005": {                    // CumulativeEnergyReset
    "importedResetTimestamp": 1700000000  // 上次重置累计值的时间
  }
}

CumulativeEnergyMeasured 事件数据示例:

{
  // CumulativeEnergyMeasured 事件 —— 累计电能更新通知
  "eventId": "0x00",
  "priority": "INFO",
  "data": {
    "energyImported": {
      "energy": 12345678,          // 12,345.678 Wh
      "startTimestamp": 1700000000,
      "endTimestamp": 1700086400
    }
    // energyExported 省略(此设备不支持反向输出)
  }
}
单位换算代码参考

处理设备返回的电能值时的关键逻辑:

{`// 设备返回 energy = 12345678 (mWh)
val rawEnergy: Long? = 12345678    // Nullable,可能为 null
val wattHours = rawEnergy?.let { it / 1000.0 }     // → 12,345.678 Wh
val kilowattHours = rawEnergy?.let { it / 1_000_000.0 }  // → 12.346 kWh

// 显示时处理 null + 选择合适单位
val display = kilowattHours?.let {
    if (it < 1.0) String.format("%.1f Wh", it * 1000)  // 小于 1 kWh 显示 Wh
    else String.format("%.2f kWh", it)
} ?: "--"`}

常见场景

场景 1:智能插座用电统计面板
  1. 检查 FeatureMap (0xFFFC) 确认设备支持的计量模式(CUME / PERE / IMPE / EXPE)
  2. 订阅 CumulativeEnergyMeasured (0x00) 事件,实时跟踪累计用电量的变化
  3. 读取 CumulativeEnergyImported (0x0001) 获取当前总用电量,除以 1,000,000 转换为 kWh
  4. 如果支持 PERE,同时订阅 PeriodicEnergyMeasured (0x01) 事件,用每个周期的数据绘制用电曲线图
  5. 结合当地电价计算费用:费用 = kWh x 电价(元/kWh)
  6. 配合 ElectricalPowerMeasurement(0x0090)在界面上同时显示「当前功率」和「累计用电」
场景 2:光伏储能系统的双向电能监控
  1. 确认设备 FeatureMap 包含 IMPE + EXPE(双向计量)+ CUME + PERE(双模式)
  2. 读取 CumulativeEnergyImported (0x0001) 获取从电网购入的总电量
  3. 读取 CumulativeEnergyExported (0x0002) 获取回馈电网的总发电量
  4. 计算净用电量:净用电 = Imported - Exported;负值表示该设备是净发电方
  5. 订阅 PeriodicEnergyMeasured (0x01) 事件,按周期统计「这一小时发了多少电、用了多少电」
  6. 读取 CumulativeEnergyReset (0x0005) 确认累计数据的起算时间,避免跨设备或跨周期的数据混淆