电能量测量 Cluster(ElectricalEnergyMeasurement)
Cluster ID: 0x0091 |
所在 Endpoint: 通常在电气设备端点(如智能插座、电能表、充电桩)
ElectricalEnergyMeasurement 负责记录设备随时间累积的电能消耗(或输出)。 与实时测量瞬时功率的 ElectricalPowerMeasurement(0x0090) 不同, 这个 Cluster 关注的是「一共用了多少电」和「这段时间用了多少电」。 两者通常共存于同一个 Endpoint,前者像车速表,后者像里程表。
所有能量值的单位都是 mWh(毫瓦时),类型为 int64。
设备返回 12345678,实际电能是 12,345.678 Wh 即 12.35 kWh。
展示时需要做单位换算:除以 1000 得 Wh,再除以 1000 得 kWh。
这个 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 是 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 两两组合,决定了设备能提供哪些属性和事件:
设备必须至少支持 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:智能插座用电统计面板
- 检查
FeatureMap (0xFFFC)确认设备支持的计量模式(CUME / PERE / IMPE / EXPE) - 订阅
CumulativeEnergyMeasured (0x00)事件,实时跟踪累计用电量的变化 - 读取
CumulativeEnergyImported (0x0001)获取当前总用电量,除以 1,000,000 转换为 kWh - 如果支持 PERE,同时订阅
PeriodicEnergyMeasured (0x01)事件,用每个周期的数据绘制用电曲线图 - 结合当地电价计算费用:
费用 = kWh x 电价(元/kWh) - 配合 ElectricalPowerMeasurement(0x0090)在界面上同时显示「当前功率」和「累计用电」
场景 2:光伏储能系统的双向电能监控
- 确认设备 FeatureMap 包含 IMPE + EXPE(双向计量)+ CUME + PERE(双模式)
- 读取
CumulativeEnergyImported (0x0001)获取从电网购入的总电量 - 读取
CumulativeEnergyExported (0x0002)获取回馈电网的总发电量 - 计算净用电量:
净用电 = Imported - Exported;负值表示该设备是净发电方 - 订阅
PeriodicEnergyMeasured (0x01)事件,按周期统计「这一小时发了多少电、用了多少电」 - 读取
CumulativeEnergyReset (0x0005)确认累计数据的起算时间,避免跨设备或跨周期的数据混淆