Hi Nordic Team,
I am working on the Matter Smoke/CO Alarm example with ICD (Intermittently Connected Device) support enabled.
My operational mode is working correctly.
-
During commissioning and UAT, the device is Active.
-
At other times, it properly goes to Idle.
The issue is only with ICD mode:
#include "app_task.h"
#include <zephyr/logging/log.h>
#include <zephyr/kernel.h>
#include <zephyr/kernel/thread.h>
#include <app/icd/server/ICDConfigurationData.h>
#include <app/icd/server/ICDManager.h>
// #include <credentials/FabricTable.h>
#include <app/server/Server.h>
LOG_MODULE_REGISTER(app, CONFIG_CHIP_APP_LOG_LEVEL);
// Define stack size and priority for the new thread
#define MY_THREAD_STACK_SIZE 1024
#define MY_THREAD_PRIORITY 5
K_THREAD_STACK_DEFINE(my_thread_stack, MY_THREAD_STACK_SIZE);
static struct k_thread my_thread_data;
static chip::app::ICDManager icdManager;
// Thread function to print ICD config parameters
void my_thread_fn(void *p1, void *p2, void *p3)
{
//chip::app::ICDManager icdManager;
ARG_UNUSED(p1);
ARG_UNUSED(p2);
ARG_UNUSED(p3);
while (1)
{
auto & icdManager = chip::Server::GetInstance().GetICDManager();
// Check ICD Mode (SIT, LIT, etc.)
auto icdMode = icdManager.GetICDMode();
switch (icdMode) {
case chip::ICDConfigurationData::ICDMode::SIT:
LOG_INF("ICD Mode: SIT (Short Idle Time)");
break;
case chip::ICDConfigurationData::ICDMode::LIT:
LOG_INF("ICD Mode: LIT (Long Idle Time)");
break;
default:
LOG_INF("ICD Mode: Unknown");
break;
}
// Check Operational State (Idle or Active)
auto opState = icdManager.GetOperaionalState();
switch (opState) {
case chip::app::ICDManager::OperationalState::IdleMode:
LOG_INF("Operational State: Idle");
break;
case chip::app::ICDManager::OperationalState::ActiveMode:
LOG_INF("Operational State: Active");
break;
default:
LOG_INF("Operational State: Unknown");
break;
}
As per the provided documentation for the Matter: Smoke/CO Example,
we have configured the CONFIG_CHIP_ICD_DSLS_SUPPORT Kconfig option to y,
and updated the ICD Management Cluster’s feature map by setting its value to 0xF.

As you mentioned triggering event for power source endpoint switching from endpoint 0 to 1 for the battery power source.
using the given triggering event command.
icdMode: 0
I: ICD Mode: SIT (Short Idle Time)
I: Operational State: Idle
I:
icdMode: 0
I: ICD Mode: SIT (Short Idle Time)
I: Operational State: Idle
I: 194191 [EM]>>> [E:6871r S:865 M:227437443] (S) Msg RX from 1:000000000001B66)
I: Event Trigger: Power Source on endpoint id 1 activated.
I: 194211 [EM]<<< [E:6871r S:865 M:49669992 (Ack:227437443)] (S) Msg TX from 00)
I: 194232 [EM]??1 [E:6871r S:865 M:49669992] (S) Msg Retransmission to 1:000000]
I: 194722 [EM]>>> [E:6871r S:865 M:227437444 (Ack:49669992)] (S) Msg RX from 1:)
I:
icdMode: 0
I: ICD Mode: SIT (Short Idle Time)
I: Operational State: Active
I:
icdMode: 0
I: ICD Mode: SIT (Short Idle Time)
I: Operational State: Active
I:
icdMode: 0
I: ICD Mode: SIT (Short Idle Time)
I: Operational State: Active
I:
icdMode: 0
I: ICD Mode: SIT (Short Idle Time)
I: Operational State: Active
icdMode: 0
I: ICD Mode: SIT (Short Idle Time)
I: Operational State: Idle
I:
icdMode: 0
I: ICD Mode: SIT (Short Idle Time)
I: Operational State: Idle
I: Could you please guide me on why the device does not enter LIT mode on a change to battery supply event trigger?
Is the GetICDMode() function called correctly?
Thanks,
Rahul chauhan.