占用感应 Cluster(OccupancySensing)
Cluster ID: 0x0406 |
所在 Endpoint: 通常在 Endpoint 1(功能端点)
OccupancySensing 用于报告设备所在区域是否有人(或物体)存在。 传感器类型包括 被动红外(PIR)、超声波、物理接触和雷达。 这个 Cluster 是纯只读的 —— 只有属性,没有命令。App 通过订阅属性变化来获取占用状态的实时更新。
不同传感器类型的工作原理差异很大:PIR 靠检测人体热辐射变化,超声波通过反射波检测运动,物理接触依赖压力传感器,雷达则用微波信号穿墙检测。
OccupancySensorType 属性决定了设备支持哪组延迟/阈值参数,App 应根据传感器类型展示不同的配置界面。
属性总览
属性按功能分为四组:核心状态、PIR 传感器参数、超声波传感器参数、物理接触传感器参数。点击属性 ID 可跳转到详细说明。
| ID | 名称 | 类型 | 分组 | 说明 |
|---|---|---|---|---|
0x00 |
Occupancy | bitmap8 | 核心状态 | 当前占用状态位图 |
0x01 |
OccupancySensorType | enum8 | 核心状态 | 传感器类型 |
0x02 |
OccupancySensorTypeBitmap | bitmap8 | 核心状态 | 传感器类型位图(支持多种类型) |
0x03 |
HoldTime | uint16 | 核心状态 | 占用状态保持时间(秒) |
0x04 |
HoldTimeLimits | struct | 核心状态 | HoldTime 的可调范围 |
0x10 |
PIROccupiedToUnoccupiedDelay | uint16 | PIR 传感器 | PIR 占用→未占用延迟(秒) |
0x11 |
PIRUnoccupiedToOccupiedDelay | uint16 | PIR 传感器 | PIR 未占用→占用延迟(秒) |
0x12 |
PIRUnoccupiedToOccupiedThreshold | uint8 | PIR 传感器 | PIR 触发次数阈值 |
0x20 |
UltrasonicOccupiedToUnoccupiedDelay | uint16 | 超声波传感器 | 超声波 占用→未占用延迟(秒) |
0x21 |
UltrasonicUnoccupiedToOccupiedDelay | uint16 | 超声波传感器 | 超声波 未占用→占用延迟(秒) |
0x22 |
UltrasonicUnoccupiedToOccupiedThreshold | uint8 | 超声波传感器 | 超声波触发次数阈值 |
0x30 |
PhysicalContactOccupiedToUnoccupiedDelay | uint16 | 物理接触传感器 | 物理接触 占用→未占用延迟(秒) |
0x31 |
PhysicalContactUnoccupiedToOccupiedDelay | uint16 | 物理接触传感器 | 物理接触 未占用→占用延迟(秒) |
0x32 |
PhysicalContactUnoccupiedToOccupiedThreshold | uint8 | 物理接触传感器 | 物理接触触发次数阈值 |
核心状态(0x00 - 0x04)
所有 OccupancySensing 设备必须支持的属性,描述当前占用状态和传感器类型。
| ID | 名称 | 类型 | 读写 | 说明 |
|---|---|---|---|---|
0x00 |
Occupancy(占用状态) | bitmap8 | 只读 | bit 0(SensedOccupancy):1 = 已占用,0 = 未占用。其余 bit 保留 |
0x01 |
OccupancySensorType(传感器类型) | enum8 | 只读 | 设备使用的主要传感器类型(见下方枚举) |
0x02 |
OccupancySensorTypeBitmap(传感器类型位图) | bitmap8 | 只读 | 设备支持的所有传感器类型的位图(见下方位定义) |
0x03 |
HoldTime(保持时间) | uint16 | 读写 | 最后一次检测到占用后,状态保持「已占用」的秒数。防止状态在短暂离开时频繁翻转 |
0x04 |
HoldTimeLimits(保持时间范围) | struct | 只读 | 包含 HoldTimeMin、HoldTimeMax、HoldTimeDefault 三个字段,描述 HoldTime 的可调范围 |
Occupancy 的类型是 bitmap8,不是 bool。只有 bit 0(SensedOccupancy)表示占用状态,其余 bit 保留供未来使用。
读取时应做位运算:isOccupied = (Occupancy & 0x01) != 0,不要直接判断是否等于 1。
OccupancySensorTypeEnum 枚举值
OccupancySensorTypeBitmap 位定义
想象一个会议室人体传感器:有人短暂离开去接水,不希望灯立即关闭。
HoldTime 就是这个「缓冲期」—— 设置为 30 秒意味着最后一次检测到人之后,设备会再保持 30 秒的「已占用」状态,然后才切换到「未占用」。
App 可以让用户在 HoldTimeLimits 范围内自行调整这个值。
PIR 传感器参数(0x10 - 0x12)
仅当 OccupancySensorType 为 PIR(0)或 PIRAndUltrasonic(2)时才有意义。
控制 PIR 传感器状态切换的延迟和灵敏度。
| ID | 名称 | 类型 | 读写 | 说明 |
|---|---|---|---|---|
0x10 |
PIROccupiedToUnoccupiedDelay(占用→未占用延迟) | uint16 | 读写 | PIR 检测到占用消失后,延迟多少秒才切换到「未占用」。默认 0(立即切换) |
0x11 |
PIRUnoccupiedToOccupiedDelay(未占用→占用延迟) | uint16 | 读写 | PIR 检测到占用出现后,延迟多少秒才切换到「已占用」。用于过滤瞬间误触发 |
0x12 |
PIRUnoccupiedToOccupiedThreshold(触发阈值) | uint8 | 读写 | 在延迟时间内需要检测到多少次占用事件才触发切换。范围 1~254,默认 1 |
假设 PIRUnoccupiedToOccupiedDelay = 10,PIRUnoccupiedToOccupiedThreshold = 3:
传感器需要在 10 秒内检测到 3 次占用事件,才会从「未占用」切换到「已占用」。
这种组合能有效过滤宠物经过、窗帘飘动等误触发。
超声波传感器参数(0x20 - 0x22)
仅当 OccupancySensorType 为 Ultrasonic(1)或 PIRAndUltrasonic(2)时才有意义。
参数含义与 PIR 组完全对称。
| ID | 名称 | 类型 | 读写 | 说明 |
|---|---|---|---|---|
0x20 |
UltrasonicOccupiedToUnoccupiedDelay(占用→未占用延迟) | uint16 | 读写 | 超声波检测到占用消失后,延迟多少秒才切换到「未占用」。默认 0 |
0x21 |
UltrasonicUnoccupiedToOccupiedDelay(未占用→占用延迟) | uint16 | 读写 | 超声波检测到占用出现后,延迟多少秒才切换到「已占用」 |
0x22 |
UltrasonicUnoccupiedToOccupiedThreshold(触发阈值) | uint8 | 读写 | 延迟时间内需要检测到多少次占用事件才触发切换。范围 1~254,默认 1 |
物理接触传感器参数(0x30 - 0x32)
仅当 OccupancySensorType 为 PhysicalContact(3)时才有意义。
参数含义与 PIR 组完全对称。
| ID | 名称 | 类型 | 读写 | 说明 |
|---|---|---|---|---|
0x30 |
PhysicalContactOccupiedToUnoccupiedDelay(占用→未占用延迟) | uint16 | 读写 | 物理接触检测到占用消失后,延迟多少秒才切换到「未占用」。默认 0 |
0x31 |
PhysicalContactUnoccupiedToOccupiedDelay(未占用→占用延迟) | uint16 | 读写 | 物理接触检测到占用出现后,延迟多少秒才切换到「已占用」 |
0x32 |
PhysicalContactUnoccupiedToOccupiedThreshold(触发阈值) | uint8 | 读写 | 延迟时间内需要检测到多少次占用事件才触发切换。范围 1~254,默认 1 |
示例数据
一个典型 PIR 人体传感器的 OccupancySensing Cluster 读取结果:
{
// --- 核心状态 ---
"0x0": 1, // Occupancy = 0b00000001(bit 0 = 1,检测到占用)
"0x1": 0, // OccupancySensorType = PIR(被动红外)
"0x2": 1, // OccupancySensorTypeBitmap = 0b00000001(PIR)
// --- PIR 传感器参数 ---
"0x10": 0, // PIROccupiedToUnoccupiedDelay = 0 秒(立即切换)
"0x11": 10, // PIRUnoccupiedToOccupiedDelay = 10 秒(延迟切换)
"0x12": 1, // PIRUnoccupiedToOccupiedThreshold = 1(触发 1 次即切换)
// --- 保持时间 ---
"0x3": 30, // HoldTime = 30 秒
"0x4": { // HoldTimeLimits
"HoldTimeMin": 1,
"HoldTimeMax": 600,
"HoldTimeDefault": 10
}
}
应用场景
OccupancySensing 是智能家居自动化的核心触发源之一,以下是三个典型集成场景。
场景 1:智能家居自动化(灯光联动)
最经典的用法 —— 人来灯亮,人走灯灭。
- 订阅
Occupancy (0x00)属性变化 - 当
Occupancybit 0 从0变为1(有人进入),发送 OnOff Cluster 的On命令开灯 - 当
Occupancybit 0 从1变为0(无人),发送Off命令关灯 - 通过调整
HoldTime控制关灯延迟 —— 会议室建议 300 秒(5 分钟),走廊建议 30 秒
进阶:结合 LevelControl Cluster,夜间检测到人时只开到 20% 亮度,白天开到 100%。 还可以结合多个传感器做区域联动 —— 走廊传感器触发后开启走廊灯和目标房间灯。
场景 2:HVAC 节能集成
将占用感应与 Thermostat Cluster 联动,实现「人在舒适、人走节能」。
- 订阅
Occupancy (0x00)属性变化 - 检测到占用时,将 Thermostat 的
OccupiedCoolingSetpoint/OccupiedHeatingSetpoint设为舒适温度(如 24°C / 22°C) - 检测到无人后(经过
HoldTime延迟),切换到UnoccupiedCoolingSetpoint/UnoccupiedHeatingSetpoint节能温度(如 28°C / 18°C) - 建议
HoldTime设置为 600~900 秒(10~15 分钟),避免短暂离开就切换温度
注意:Thermostat Cluster 本身有 Occupancy 属性(0x02),但它只是被动接收状态。
真正的占用检测数据来源是 OccupancySensing Cluster,通常由自动化规则桥接两者。
场景 3:安防与入侵检测
用户离家设防后,占用传感器检测到异常活动即触发报警。
- 用户通过 App 启用「离家模式」(设防)
- 订阅所有占用传感器的
Occupancy (0x00)变化 - 设防状态下检测到
Occupancybit 0 =1,触发安防联动:- 推送报警通知到用户手机
- 开启摄像头录像
- 触发声光报警器
- 为减少误报,建议提高灵敏度要求:
PIRUnoccupiedToOccupiedThreshold = 3,PIRUnoccupiedToOccupiedDelay = 5
提示:安防场景下建议使用 PIRAndUltrasonic 双模传感器,PIR 容易被宠物误触发,超声波可以做二次确认。 同时要注意区分设防区域和非设防区域的传感器。
App 展示占用传感器状态时,典型的处理流程:
- 读取
OccupancySensorType (0x01),在 UI 上显示传感器类型图标和名称 - 订阅
Occupancy (0x00),用位运算& 0x01取 bit 0,展示「有人 / 无人」状态 - 根据传感器类型,仅展示对应的延迟/阈值配置项(PIR 设备不显示超声波参数)
- 让用户在
HoldTimeLimits的范围内调整HoldTime,用滑块控件更直观 - 提供事件历史记录 —— 记录每次占用状态变化的时间,帮助用户了解活动规律