IcdManagement Cluster
Cluster ID: 0x0046 |
Endpoint: Fixed on Endpoint 0 (Root Endpoint)
ICD Management manages Intermittently Connected Devices (ICD), commonly known as "sleepy devices" — door/window sensors, temperature/humidity sensors, battery-powered buttons, etc. These devices spend most of their time in sleep mode to conserve power, only briefly waking for communication at fixed intervals or specific events. ICD Management defines the device's sleep/wake cycles, manages subscriber registrations, and maintains connectivity through the Check-In protocol.
ICD devices have two operating modes: SIT (Short Idle Time) mode and LIT (Long Idle Time) mode. SIT devices have short idle intervals (typically no more than 15 seconds), so the Controller can wait for the device to wake within the normal MRP retry window; LIT devices have longer idle intervals (up to several hours), requiring the Controller to rely on the Check-In protocol to establish communication. LIT mode significantly extends battery life, but interaction response is slower.
Commands
ICD Management has 4 commands. RegisterClient and UnregisterClient manage
the Check-In message subscriber list; StayActiveRequest keeps the device temporarily awake.
Click a command ID in the table below to jump to its detailed description.
| ID | Name | Direction | Description | Required Feature |
|---|---|---|---|---|
0x00 |
RegisterClient | Client → Server | Register a Check-In client | CIP |
0x01 |
RegisterClientResponse | Server → Client | Registration result, returns ICDCounter | CIP |
0x02 |
UnregisterClient | Client → Server | Unregister a Check-In client | CIP |
0x03 |
StayActiveRequest | Client → Server | Request the device to stay active for a period | LITS |
0x04 |
StayActiveResponse | Server → Client | Returns the actual active duration promised by the device | LITS |
RegisterClient — Register Client (0x00)
Registers a Check-In client with the ICD device. After successful registration, the device sends a Check-In message to the client each time it wakes from sleep, saying "I'm awake, send any pending requests now." This is the core mechanism for LIT devices to maintain connectivity with Controllers.
| Parameter | Type | Description |
|---|---|---|
| CheckInNodeID | uint64 | Target node ID for receiving Check-In messages — typically the Controller or Hub's NodeID |
| MonitoredSubject | uint64 | Monitored Subject (Case-AuthTag or NodeID) — identifies which user/entity is watching this device |
| Key | octstr (16 bytes) | HMAC verification key — used to verify Check-In message authenticity and prevent forgery |
| VerificationKey | octstr (16 bytes) | Optional. Verification key — used to verify the initiator's identity during registration. Required if the device demands verification |
Usage Scenarios
After commissioning, Hub/Controller registers itself as a Check-In client with the battery sensor. Subsequently, the sensor sends a Check-In message each time it wakes; the Hub then sends subscription requests or reads data during the device's brief active window.
RegisterClientResponse — Registration Response (0x01)
Device response to RegisterClient. Returns the current ICDCounter value, which the client uses to verify the freshness of subsequent Check-In messages (prevents replay attacks).
| Field | Type | Description |
|---|---|---|
| ICDCounter | uint32 | Device's current Check-In counter value. The client should save this value; subsequent Check-In messages must have a Counter greater than this |
UnregisterClient — Unregister Client (0x02)
Removes a Check-In client from the ICD device's registration list. After removal, the device no longer sends Check-In messages to that client.
| Parameter | Type | Description |
|---|---|---|
| CheckInNodeID | uint64 | Node ID of the client to remove — must match the CheckInNodeID used during registration |
| VerificationKey | octstr (16 bytes) | Optional. Verification key — same purpose as during registration, prevents unauthorized unregistration |
Usage Scenarios
When removing a Hub from the home, the Hub needs to first call UnregisterClient to unregister itself from all registered ICD devices, to prevent devices from wasting battery by continuing to send Check-In messages to a non-existent node.
StayActiveRequest — Request Stay Active (0x03)
Requests the ICD device to stay in active mode for an additional period, temporarily not returning to sleep. Applicable when needing to perform a series of interactions with the device (e.g. OTA upgrade, batch configuration) but the device's default active time is too short.
| Parameter | Type | Description |
|---|---|---|
| StayActiveDuration | uint32 | Requested additional active duration, in milliseconds. The device will remain awake for at least this long after the current active period ends |
Usage Scenarios
The Controller needs to perform an OTA firmware upgrade on a door/window sensor. The sensor's default active window is only 10 seconds, insufficient for firmware transfer. The Controller sends StayActiveRequest (StayActiveDuration = 120000, i.e. 2 minutes), the sensor replies with StayActiveResponse indicating how long it can actually maintain, and the Controller completes the upgrade within this window.
StayActiveResponse — Stay Active Response (0x04)
Device response to StayActiveRequest. The device may not fully satisfy the requested duration (e.g. low battery), and the response contains the actual active duration the device promises.
| Field | Type | Description |
|---|---|---|
| PromisedActiveDuration | uint32 | Actual active duration promised by the device, in milliseconds. May be less than requested. The Controller should complete all operations within this time |
Attributes
ICD Management attributes are divided into four functional groups. Click an attribute ID in the summary table below to jump to its detailed description.
| ID | Name | Type | Group | Description |
|---|---|---|---|---|
0x0000 |
IdleModeDuration | uint32 | Sleep/Wake Parameters | Idle mode duration (seconds) |
0x0001 |
ActiveModeDuration | uint32 | Sleep/Wake Parameters | Active mode duration (milliseconds) |
0x0002 |
ActiveModeThreshold | uint16 | Sleep/Wake Parameters | Active mode extension threshold (milliseconds) |
0x0003 |
RegisteredClients | list<MonitoringRegistrationStruct> | Registration Management | List of registered monitoring clients |
0x0004 |
ICDCounter | uint32 | Registration Management | Check-In message counter |
0x0005 |
ClientsSupportedPerFabric | uint16 | Registration Management | Maximum registered clients per Fabric |
0x0006 |
UserActiveModeTriggerHint | UserActiveModeTriggerBitmap | User Wake-up Hints | Bitmap of user-available wake-up methods |
0x0007 |
UserActiveModeTriggerInstruction | string (max 128) | User Wake-up Hints | Wake-up operation text instructions |
0x0008 |
OperatingMode | OperatingModeEnum | Operating Mode | Current operating mode (SIT / LIT) |
0x0009 |
MaximumCheckInBackOff | uint32 | Operating Mode | Maximum Check-In back-off interval (seconds) |
Sleep/Wake Parameters (0x0000-0x0002)
Defines the device's sleep and wake cycle parameters. These three values directly determine the device's power saving level and communication responsiveness — the longer the idle time, the more power saved, but the slower the response.
IdleModeDuration is in seconds,
while ActiveModeDuration and ActiveModeThreshold are in milliseconds.
For example, IdleModeDuration = 300 means 5 minutes idle, ActiveModeDuration = 10000 means 10 seconds active.
| ID | Name | Type | Description |
|---|---|---|---|
0x0000 |
IdleModeDuration Idle Mode Duration |
uint32 | Duration the device stays in idle (sleep) mode, in seconds. The device does not actively send or receive messages during this time. SIT devices typically ≤ 15 seconds, LIT devices can reach hours. Minimum 1 second |
0x0001 |
ActiveModeDuration Active Mode Duration |
uint32 | Duration the device stays in active mode, in milliseconds. The device maintains a communication window for at least this long each time it wakes. Minimum 300 milliseconds |
0x0002 |
ActiveModeThreshold Active Mode Threshold |
uint16 | Additional active time extension after receiving communication in active mode, in milliseconds. Timer resets on each received message, preventing the device from suddenly sleeping during interaction. SIT device minimum 300ms, LIT device minimum 5000ms |
SIT device's IdleModeDuration ≤ 15 seconds, aligned with MRP's Idle Retransmission Timeout,
allowing the Controller to wait for the device to wake within the normal retry window.
If IdleModeDuration > 15 seconds, the device is in LIT mode, and the Controller must wait for Check-In messages to communicate.
Registration Management (0x0003-0x0005)
Manages the Check-In client registration list. Only registered clients will receive Check-In messages from the device.
| ID | Name | Type | Description |
|---|---|---|---|
0x0003 |
RegisteredClients Registered Clients |
list<MonitoringRegistrationStruct> | List of currently registered Check-In clients. Number of registrations per Fabric cannot exceed ClientsSupportedPerFabric. Requires CIP feature |
0x0004 |
ICDCounter Check-In Counter |
uint32 | Monotonically increasing counter for Check-In messages sent by the device. Clients use this to detect message replay — if the received Counter ≤ the last saved value, it may indicate a replay attack. Requires CIP feature |
0x0005 |
ClientsSupportedPerFabric Max Clients Per Fabric |
uint16 | Maximum number of Check-In clients that can be registered per Fabric. Minimum 1. Limited by the device's storage and power resources — more clients means more Check-In messages to send each wake-up. Requires CIP feature |
User Wake-up Hints (0x0006-0x0007)
When the Controller needs to communicate with a LIT device but doesn't want to wait for Check-In, it can prompt the user to manually wake the device. These two attributes tell the App how to guide user actions — e.g. "press the button on the device" or "open/close the door once."
| ID | Name | Type | Description |
|---|---|---|---|
0x0006 |
UserActiveModeTriggerHint Wake-up Mode Hint |
UserActiveModeTriggerBitmap | Bitmap identifying which methods users can use to manually wake the device. The App should display corresponding guidance based on this bitmap. Requires UAT feature |
0x0007 |
UserActiveModeTriggerInstruction Wake-up Instruction |
string (max 128) | Vendor-defined operation instruction text. When special trigger methods like ActuateSensorLightsBlink are set in the bitmap, this field provides specific operational guidance (e.g. "press the top button 3 times consecutively"). Requires UAT feature |
UserActiveModeTriggerBitmap Common Bits
Operating Mode (0x0008-0x0009)
Device's current operating mode and Check-In back-off parameters.
| ID | Name | Type | Description |
|---|---|---|---|
0x0008 |
OperatingMode Operating Mode |
OperatingModeEnum | Device's current ICD operating mode: SIT (short idle) or LIT (long idle). Devices supporting DSLS feature can dynamically switch between modes. Requires LITS feature |
0x0009 |
MaximumCheckInBackOff Max Check-In Backoff |
uint32 | Maximum Check-In message sending interval when there are no registered clients, in seconds. The device gradually extends the interval up to this limit to further conserve power when no one is listening. Requires LITS feature |
Enum Quick Reference
OperatingModeEnum — Operating Mode
Describes the ICD device's current operating mode, corresponding to the OperatingMode (0x0008) attribute.
Data Structures
MonitoringRegistrationStruct
Describes a registered Check-In client's information, the structure of each list element in the RegisteredClients (0x0003) attribute.
| Field | Type | Description |
|---|---|---|
| CheckInNodeID | uint64 | Node ID for receiving Check-In messages — typically the Controller or Hub from registration |
| MonitoredSubject | uint64 | Monitored Subject — identifies which user or entity is watching this device |
| FabricIndex | uint8 | Fabric index this registration belongs to |
MonitoringRegistrationStruct data example:
{
"CheckInNodeID": 1, // Check-In message target node ID
"MonitoredSubject": 112233, // Monitored Subject (typically the user's NodeID)
"FabricIndex": 1 // Fabric index
}
Feature Bitmap
ICD Management declares device ICD capabilities through FeatureMap (0xFFFC):
LITS depends on CIP (long-idle devices must support Check-In protocol to be discoverable), DSLS depends on LITS (dynamic switching requires LIT mode support first).
Therefore, a device supporting DSLS must have a FeatureMap of at least 0b1111 (CIP + UAT + LITS + DSLS).
Example Data
Read results from an ICD Management Cluster of a battery-powered door/window sensor running in LIT mode:
{
// --- Sleep/Wake Time Parameters ---
"0x0000": 300, // IdleModeDuration = 300 seconds (idle mode lasts 5 minutes)
"0x0001": 10, // ActiveModeDuration = 10000 milliseconds (active mode lasts 10 seconds)
"0x0002": 5000, // ActiveModeThreshold = 5000 milliseconds (active mode extension threshold 5 seconds)
// --- Registration Management ---
"0x0003": [ // RegisteredClients (list of registered monitoring clients)
{
"CheckInNodeID": 1,
"MonitoredSubject": 1,
"FabricIndex": 1
}
],
"0x0004": 42, // ICDCounter = 42 (Check-In message counter)
"0x0005": 2, // ClientsSupportedPerFabric = 2 (max 2 clients per Fabric)
// --- User Wake-up Hints ---
"0x0006": 1, // UserActiveModeTriggerHint = PowerCycle (hint user to wake by power cycling)
"0x0007": "", // UserActiveModeTriggerInstruction = "" (no additional instructions)
// --- Operating Mode ---
"0x0008": 1, // OperatingMode = LIT (Long Idle Time mode)
"0x0009": 3600 // MaximumCheckInBackOff = 3600 seconds (max Check-In back-off interval 1 hour)
}
When reading ICD Management attributes, note that the device may be sleeping.
For SIT devices, the Controller can wait for the device to wake within the MRP retry window and complete the read;
for LIT devices, a Check-In message must be received or the user must manually wake the device before reading.
Before reading, you can first check OperatingMode (0x0008) to determine the device's operating mode.
Common Scenarios
Scenario 1: Register Check-In Monitoring After Commissioning
- After commissioning the device, read
FeatureMap (0xFFFC)to confirm the device supports the CIP feature - Read
ClientsSupportedPerFabric (0x0005)to confirm registration slots are available - Send
RegisterClient (0x00)with the Hub's NodeID as CheckInNodeID and generate a 16-byte HMAC Key - Save the ICDCounter value returned in
RegisterClientResponsefor subsequent Check-In message verification - Each time the device wakes, the Hub receives a Check-In message and completes data synchronization within the active window
Scenario 2: OTA Upgrade — Extend Active Window
- Wait for the LIT device to send a Check-In message (or prompt the user to manually wake the device)
- Within the device's active window, send
StayActiveRequest (0x03)requesting sufficient active time (e.g. 120 seconds) - Check
PromisedActiveDurationinStayActiveResponseto confirm the actual duration the device promises - Execute the OTA upgrade process within the promised time window
- If not enough, send another StayActiveRequest before the window ends to extend the time