diff --git a/examples/placeholder/linux/apps/app1/config.matter b/examples/placeholder/linux/apps/app1/config.matter
index aa2f299a5c6093..0d5178d9ab92d3 100644
--- a/examples/placeholder/linux/apps/app1/config.matter
+++ b/examples/placeholder/linux/apps/app1/config.matter
@@ -2320,6 +2320,10 @@ cluster BridgedDeviceBasicInformation = 57 {
kFabric = 5;
}
+ bitmap Feature : bitmap32 {
+ kBridgedICDSupport = 0x100000;
+ }
+
struct ProductAppearanceStruct {
ProductFinishEnum finish = 0;
nullable ColorEnum primaryColor = 1;
@@ -2339,6 +2343,10 @@ cluster BridgedDeviceBasicInformation = 57 {
boolean reachableNewValue = 0;
}
+ info event ActiveChanged = 128 {
+ int32u promisedActiveDuration = 0;
+ }
+
readonly attribute optional char_string<32> vendorName = 1;
readonly attribute optional vendor_id vendorID = 2;
readonly attribute optional char_string<32> productName = 3;
@@ -2361,6 +2369,9 @@ cluster BridgedDeviceBasicInformation = 57 {
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ /** The server SHALL attempt to keep the devices specified active for StayActiveDuration milliseconds when they are next active. */
+ command KeepActive(): DefaultSuccess = 128;
}
/** This cluster exposes interactions with a switch device, for the purpose of using those interactions by other devices.
diff --git a/examples/placeholder/linux/apps/app2/config.matter b/examples/placeholder/linux/apps/app2/config.matter
index 82c062fbef2dd3..1acb9d53f5845c 100644
--- a/examples/placeholder/linux/apps/app2/config.matter
+++ b/examples/placeholder/linux/apps/app2/config.matter
@@ -2277,6 +2277,10 @@ cluster BridgedDeviceBasicInformation = 57 {
kFabric = 5;
}
+ bitmap Feature : bitmap32 {
+ kBridgedICDSupport = 0x100000;
+ }
+
struct ProductAppearanceStruct {
ProductFinishEnum finish = 0;
nullable ColorEnum primaryColor = 1;
@@ -2296,6 +2300,10 @@ cluster BridgedDeviceBasicInformation = 57 {
boolean reachableNewValue = 0;
}
+ info event ActiveChanged = 128 {
+ int32u promisedActiveDuration = 0;
+ }
+
readonly attribute optional char_string<32> vendorName = 1;
readonly attribute optional vendor_id vendorID = 2;
readonly attribute optional char_string<32> productName = 3;
@@ -2318,6 +2326,9 @@ cluster BridgedDeviceBasicInformation = 57 {
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ /** The server SHALL attempt to keep the devices specified active for StayActiveDuration milliseconds when they are next active. */
+ command KeepActive(): DefaultSuccess = 128;
}
/** This cluster exposes interactions with a switch device, for the purpose of using those interactions by other devices.
diff --git a/src/app/zap-templates/zcl/data-model/chip/bridged-device-basic-information.xml b/src/app/zap-templates/zcl/data-model/chip/bridged-device-basic-information.xml
index 702ea8754795b1..ff118a8a80c162 100644
--- a/src/app/zap-templates/zcl/data-model/chip/bridged-device-basic-information.xml
+++ b/src/app/zap-templates/zcl/data-model/chip/bridged-device-basic-information.xml
@@ -71,6 +71,12 @@ limitations under the License.
true
+
+
+
+
+
+
VendorName
VendorID
ProductName
@@ -88,6 +94,10 @@ limitations under the License.
UniqueID
ProductAppearance
+
+ The server SHALL attempt to keep the devices specified active for StayActiveDuration milliseconds when they are next active.
+
+
The StartUp event SHALL be emitted by a Node as soon as reasonable after completing a boot or reboot process.
@@ -102,6 +112,10 @@ limitations under the License.
This event SHALL be generated when there is a change in the Reachable attribute.
+
+ This event (when supported) SHALL be generated the next time a bridged device becomes active after a KeepActive command is received.
+
+
diff --git a/src/controller/data_model/controller-clusters.matter b/src/controller/data_model/controller-clusters.matter
index 8459f1887c746b..3ad213b16bdee4 100644
--- a/src/controller/data_model/controller-clusters.matter
+++ b/src/controller/data_model/controller-clusters.matter
@@ -2225,6 +2225,10 @@ cluster BridgedDeviceBasicInformation = 57 {
kFabric = 5;
}
+ bitmap Feature : bitmap32 {
+ kBridgedICDSupport = 0x100000;
+ }
+
struct ProductAppearanceStruct {
ProductFinishEnum finish = 0;
nullable ColorEnum primaryColor = 1;
@@ -2244,6 +2248,10 @@ cluster BridgedDeviceBasicInformation = 57 {
boolean reachableNewValue = 0;
}
+ info event ActiveChanged = 128 {
+ int32u promisedActiveDuration = 0;
+ }
+
readonly attribute optional char_string<32> vendorName = 1;
readonly attribute optional vendor_id vendorID = 2;
readonly attribute optional char_string<32> productName = 3;
@@ -2266,6 +2274,9 @@ cluster BridgedDeviceBasicInformation = 57 {
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ /** The server SHALL attempt to keep the devices specified active for StayActiveDuration milliseconds when they are next active. */
+ command KeepActive(): DefaultSuccess = 128;
}
/** This cluster exposes interactions with a switch device, for the purpose of using those interactions by other devices.
diff --git a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java
index 0e027a3c0c0647..bf7e6af1ec8ce2 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java
+++ b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java
@@ -14963,6 +14963,22 @@ public long initWithDevice(long devicePtr, int endpointId) {
return 0L;
}
+ public void keepActive(DefaultClusterCallback callback) {
+ keepActive(callback, 0);
+ }
+
+ public void keepActive(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {
+ final long commandId = 128L;
+
+ ArrayList elements = new ArrayList<>();
+ StructType commandArgs = new StructType(elements);
+ invoke(new InvokeCallbackImpl(callback) {
+ @Override
+ public void onResponse(StructType invokeStructValue) {
+ callback.onSuccess();
+ }}, commandId, commandArgs, timedInvokeTimeoutMs);
+ }
+
public interface ProductAppearanceAttributeCallback extends BaseAttributeCallback {
void onSuccess(ChipStructs.BridgedDeviceBasicInformationClusterProductAppearanceStruct value);
}
diff --git a/src/controller/java/generated/java/chip/devicecontroller/ChipEventStructs.java b/src/controller/java/generated/java/chip/devicecontroller/ChipEventStructs.java
index d256c91c32d9ed..e03a849a794933 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/ChipEventStructs.java
+++ b/src/controller/java/generated/java/chip/devicecontroller/ChipEventStructs.java
@@ -1899,6 +1899,52 @@ public String toString() {
return output.toString();
}
}
+public static class BridgedDeviceBasicInformationClusterActiveChangedEvent {
+ public Long promisedActiveDuration;
+ private static final long PROMISED_ACTIVE_DURATION_ID = 0L;
+
+ public BridgedDeviceBasicInformationClusterActiveChangedEvent(
+ Long promisedActiveDuration
+ ) {
+ this.promisedActiveDuration = promisedActiveDuration;
+ }
+
+ public StructType encodeTlv() {
+ ArrayList values = new ArrayList<>();
+ values.add(new StructElement(PROMISED_ACTIVE_DURATION_ID, new UIntType(promisedActiveDuration)));
+
+ return new StructType(values);
+ }
+
+ public static BridgedDeviceBasicInformationClusterActiveChangedEvent decodeTlv(BaseTLVType tlvValue) {
+ if (tlvValue == null || tlvValue.type() != TLVType.Struct) {
+ return null;
+ }
+ Long promisedActiveDuration = null;
+ for (StructElement element: ((StructType)tlvValue).value()) {
+ if (element.contextTagNum() == PROMISED_ACTIVE_DURATION_ID) {
+ if (element.value(BaseTLVType.class).type() == TLVType.UInt) {
+ UIntType castingValue = element.value(UIntType.class);
+ promisedActiveDuration = castingValue.value(Long.class);
+ }
+ }
+ }
+ return new BridgedDeviceBasicInformationClusterActiveChangedEvent(
+ promisedActiveDuration
+ );
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder output = new StringBuilder();
+ output.append("BridgedDeviceBasicInformationClusterActiveChangedEvent {\n");
+ output.append("\tpromisedActiveDuration: ");
+ output.append(promisedActiveDuration);
+ output.append("\n");
+ output.append("}\n");
+ return output.toString();
+ }
+}
public static class SwitchClusterSwitchLatchedEvent {
public Integer newPosition;
private static final long NEW_POSITION_ID = 0L;
diff --git a/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java b/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java
index 698ee556bb324b..8f23b91afd4d54 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java
+++ b/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java
@@ -4452,7 +4452,8 @@ public enum Event {
StartUp(0L),
ShutDown(1L),
Leave(2L),
- ReachableChanged(3L),;
+ ReachableChanged(3L),
+ ActiveChanged(128L),;
private final long id;
Event(long id) {
this.id = id;
@@ -4472,7 +4473,8 @@ public static Event value(long id) throws NoSuchFieldError {
}
}
- public enum Command {;
+ public enum Command {
+ KeepActive(128L),;
private final long id;
Command(long id) {
this.id = id;
diff --git a/src/controller/java/generated/java/chip/devicecontroller/ClusterInfoMapping.java b/src/controller/java/generated/java/chip/devicecontroller/ClusterInfoMapping.java
index 06b24ad59e09af..102cbcf1b4e8c9 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/ClusterInfoMapping.java
+++ b/src/controller/java/generated/java/chip/devicecontroller/ClusterInfoMapping.java
@@ -23873,6 +23873,18 @@ public Map> getCommandMap() {
Map bridgedDeviceBasicInformationClusterInteractionInfoMap = new LinkedHashMap<>();
+ Map bridgedDeviceBasicInformationkeepActiveCommandParams = new LinkedHashMap();
+ InteractionInfo bridgedDeviceBasicInformationkeepActiveInteractionInfo = new InteractionInfo(
+ (cluster, callback, commandArguments) -> {
+ ((ChipClusters.BridgedDeviceBasicInformationCluster) cluster)
+ .keepActive((DefaultClusterCallback) callback
+ );
+ },
+ () -> new DelegatedDefaultClusterCallback(),
+ bridgedDeviceBasicInformationkeepActiveCommandParams
+ );
+ bridgedDeviceBasicInformationClusterInteractionInfoMap.put("keepActive", bridgedDeviceBasicInformationkeepActiveInteractionInfo);
+
commandMap.put("bridgedDeviceBasicInformation", bridgedDeviceBasicInformationClusterInteractionInfoMap);
Map switchClusterInteractionInfoMap = new LinkedHashMap<>();
diff --git a/src/controller/java/generated/java/chip/devicecontroller/cluster/eventstructs/BridgedDeviceBasicInformationClusterActiveChangedEvent.kt b/src/controller/java/generated/java/chip/devicecontroller/cluster/eventstructs/BridgedDeviceBasicInformationClusterActiveChangedEvent.kt
new file mode 100644
index 00000000000000..73be6ff7c1042e
--- /dev/null
+++ b/src/controller/java/generated/java/chip/devicecontroller/cluster/eventstructs/BridgedDeviceBasicInformationClusterActiveChangedEvent.kt
@@ -0,0 +1,56 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package chip.devicecontroller.cluster.eventstructs
+
+import chip.devicecontroller.cluster.*
+import matter.tlv.ContextSpecificTag
+import matter.tlv.Tag
+import matter.tlv.TlvReader
+import matter.tlv.TlvWriter
+
+class BridgedDeviceBasicInformationClusterActiveChangedEvent(val promisedActiveDuration: ULong) {
+ override fun toString(): String = buildString {
+ append("BridgedDeviceBasicInformationClusterActiveChangedEvent {\n")
+ append("\tpromisedActiveDuration : $promisedActiveDuration\n")
+ append("}\n")
+ }
+
+ fun toTlv(tlvTag: Tag, tlvWriter: TlvWriter) {
+ tlvWriter.apply {
+ startStructure(tlvTag)
+ put(ContextSpecificTag(TAG_PROMISED_ACTIVE_DURATION), promisedActiveDuration)
+ endStructure()
+ }
+ }
+
+ companion object {
+ private const val TAG_PROMISED_ACTIVE_DURATION = 0
+
+ fun fromTlv(
+ tlvTag: Tag,
+ tlvReader: TlvReader,
+ ): BridgedDeviceBasicInformationClusterActiveChangedEvent {
+ tlvReader.enterStructure(tlvTag)
+ val promisedActiveDuration =
+ tlvReader.getULong(ContextSpecificTag(TAG_PROMISED_ACTIVE_DURATION))
+
+ tlvReader.exitContainer()
+
+ return BridgedDeviceBasicInformationClusterActiveChangedEvent(promisedActiveDuration)
+ }
+ }
+}
diff --git a/src/controller/java/generated/java/chip/devicecontroller/cluster/files.gni b/src/controller/java/generated/java/chip/devicecontroller/cluster/files.gni
index 631feb9442d4c0..cd489e0007498e 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/cluster/files.gni
+++ b/src/controller/java/generated/java/chip/devicecontroller/cluster/files.gni
@@ -161,6 +161,7 @@ eventstructs_sources = [
"${chip_root}/src/controller/java/generated/java/chip/devicecontroller/cluster/eventstructs/BooleanStateClusterStateChangeEvent.kt",
"${chip_root}/src/controller/java/generated/java/chip/devicecontroller/cluster/eventstructs/BooleanStateConfigurationClusterAlarmsStateChangedEvent.kt",
"${chip_root}/src/controller/java/generated/java/chip/devicecontroller/cluster/eventstructs/BooleanStateConfigurationClusterSensorFaultEvent.kt",
+ "${chip_root}/src/controller/java/generated/java/chip/devicecontroller/cluster/eventstructs/BridgedDeviceBasicInformationClusterActiveChangedEvent.kt",
"${chip_root}/src/controller/java/generated/java/chip/devicecontroller/cluster/eventstructs/BridgedDeviceBasicInformationClusterReachableChangedEvent.kt",
"${chip_root}/src/controller/java/generated/java/chip/devicecontroller/cluster/eventstructs/BridgedDeviceBasicInformationClusterStartUpEvent.kt",
"${chip_root}/src/controller/java/generated/java/chip/devicecontroller/cluster/eventstructs/CommissionerControlClusterCommissioningRequestResultEvent.kt",
diff --git a/src/controller/java/generated/java/matter/controller/cluster/clusters/BridgedDeviceBasicInformationCluster.kt b/src/controller/java/generated/java/matter/controller/cluster/clusters/BridgedDeviceBasicInformationCluster.kt
index 73f0502017eee1..45adb1bb8f7820 100644
--- a/src/controller/java/generated/java/matter/controller/cluster/clusters/BridgedDeviceBasicInformationCluster.kt
+++ b/src/controller/java/generated/java/matter/controller/cluster/clusters/BridgedDeviceBasicInformationCluster.kt
@@ -23,6 +23,8 @@ import java.util.logging.Logger
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.transform
import matter.controller.BooleanSubscriptionState
+import matter.controller.InvokeRequest
+import matter.controller.InvokeResponse
import matter.controller.MatterController
import matter.controller.ReadData
import matter.controller.ReadRequest
@@ -36,6 +38,7 @@ import matter.controller.WriteRequests
import matter.controller.WriteResponse
import matter.controller.cluster.structs.*
import matter.controller.model.AttributePath
+import matter.controller.model.CommandPath
import matter.tlv.AnonymousTag
import matter.tlv.TlvReader
import matter.tlv.TlvWriter
@@ -97,6 +100,24 @@ class BridgedDeviceBasicInformationCluster(
object SubscriptionEstablished : AttributeListAttributeSubscriptionState()
}
+ suspend fun keepActive(timedInvokeTimeout: Duration? = null) {
+ val commandId: UInt = 128u
+
+ val tlvWriter = TlvWriter()
+ tlvWriter.startStructure(AnonymousTag)
+ tlvWriter.endStructure()
+
+ val request: InvokeRequest =
+ InvokeRequest(
+ CommandPath(endpointId, clusterId = CLUSTER_ID, commandId),
+ tlvPayload = tlvWriter.getEncoded(),
+ timedRequest = timedInvokeTimeout,
+ )
+
+ val response: InvokeResponse = controller.invoke(request)
+ logger.log(Level.FINE, "Invoke command succeeded: ${response}")
+ }
+
suspend fun readVendorNameAttribute(): String? {
val ATTRIBUTE_ID: UInt = 1u
diff --git a/src/controller/java/generated/java/matter/controller/cluster/eventstructs/BridgedDeviceBasicInformationClusterActiveChangedEvent.kt b/src/controller/java/generated/java/matter/controller/cluster/eventstructs/BridgedDeviceBasicInformationClusterActiveChangedEvent.kt
new file mode 100644
index 00000000000000..7713cb0faf07b3
--- /dev/null
+++ b/src/controller/java/generated/java/matter/controller/cluster/eventstructs/BridgedDeviceBasicInformationClusterActiveChangedEvent.kt
@@ -0,0 +1,56 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package matter.controller.cluster.eventstructs
+
+import matter.controller.cluster.*
+import matter.tlv.ContextSpecificTag
+import matter.tlv.Tag
+import matter.tlv.TlvReader
+import matter.tlv.TlvWriter
+
+class BridgedDeviceBasicInformationClusterActiveChangedEvent(val promisedActiveDuration: UInt) {
+ override fun toString(): String = buildString {
+ append("BridgedDeviceBasicInformationClusterActiveChangedEvent {\n")
+ append("\tpromisedActiveDuration : $promisedActiveDuration\n")
+ append("}\n")
+ }
+
+ fun toTlv(tlvTag: Tag, tlvWriter: TlvWriter) {
+ tlvWriter.apply {
+ startStructure(tlvTag)
+ put(ContextSpecificTag(TAG_PROMISED_ACTIVE_DURATION), promisedActiveDuration)
+ endStructure()
+ }
+ }
+
+ companion object {
+ private const val TAG_PROMISED_ACTIVE_DURATION = 0
+
+ fun fromTlv(
+ tlvTag: Tag,
+ tlvReader: TlvReader,
+ ): BridgedDeviceBasicInformationClusterActiveChangedEvent {
+ tlvReader.enterStructure(tlvTag)
+ val promisedActiveDuration =
+ tlvReader.getUInt(ContextSpecificTag(TAG_PROMISED_ACTIVE_DURATION))
+
+ tlvReader.exitContainer()
+
+ return BridgedDeviceBasicInformationClusterActiveChangedEvent(promisedActiveDuration)
+ }
+ }
+}
diff --git a/src/controller/java/generated/java/matter/controller/cluster/files.gni b/src/controller/java/generated/java/matter/controller/cluster/files.gni
index 2bebadb13c36ce..6135befc90acf7 100644
--- a/src/controller/java/generated/java/matter/controller/cluster/files.gni
+++ b/src/controller/java/generated/java/matter/controller/cluster/files.gni
@@ -161,6 +161,7 @@ matter_eventstructs_sources = [
"${chip_root}/src/controller/java/generated/java/matter/controller/cluster/eventstructs/BooleanStateClusterStateChangeEvent.kt",
"${chip_root}/src/controller/java/generated/java/matter/controller/cluster/eventstructs/BooleanStateConfigurationClusterAlarmsStateChangedEvent.kt",
"${chip_root}/src/controller/java/generated/java/matter/controller/cluster/eventstructs/BooleanStateConfigurationClusterSensorFaultEvent.kt",
+ "${chip_root}/src/controller/java/generated/java/matter/controller/cluster/eventstructs/BridgedDeviceBasicInformationClusterActiveChangedEvent.kt",
"${chip_root}/src/controller/java/generated/java/matter/controller/cluster/eventstructs/BridgedDeviceBasicInformationClusterReachableChangedEvent.kt",
"${chip_root}/src/controller/java/generated/java/matter/controller/cluster/eventstructs/BridgedDeviceBasicInformationClusterStartUpEvent.kt",
"${chip_root}/src/controller/java/generated/java/matter/controller/cluster/eventstructs/CommissionerControlClusterCommissioningRequestResultEvent.kt",
diff --git a/src/controller/java/zap-generated/CHIPEventTLVValueDecoder.cpp b/src/controller/java/zap-generated/CHIPEventTLVValueDecoder.cpp
index a61c38ca0edcc6..841b2cb3b41b2c 100644
--- a/src/controller/java/zap-generated/CHIPEventTLVValueDecoder.cpp
+++ b/src/controller/java/zap-generated/CHIPEventTLVValueDecoder.cpp
@@ -2159,6 +2159,45 @@ jobject DecodeEventValue(const app::ConcreteEventPath & aPath, TLV::TLVReader &
return value;
}
+ case Events::ActiveChanged::Id: {
+ Events::ActiveChanged::DecodableType cppValue;
+ *aError = app::DataModel::Decode(aReader, cppValue);
+ if (*aError != CHIP_NO_ERROR)
+ {
+ return nullptr;
+ }
+ jobject value_promisedActiveDuration;
+ std::string value_promisedActiveDurationClassName = "java/lang/Long";
+ std::string value_promisedActiveDurationCtorSignature = "(J)V";
+ jlong jnivalue_promisedActiveDuration = static_cast(cppValue.promisedActiveDuration);
+ chip::JniReferences::GetInstance().CreateBoxedObject(
+ value_promisedActiveDurationClassName.c_str(), value_promisedActiveDurationCtorSignature.c_str(),
+ jnivalue_promisedActiveDuration, value_promisedActiveDuration);
+
+ jclass activeChangedStructClass;
+ err = chip::JniReferences::GetInstance().GetLocalClassRef(
+ env, "chip/devicecontroller/ChipEventStructs$BridgedDeviceBasicInformationClusterActiveChangedEvent",
+ activeChangedStructClass);
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(Zcl, "Could not find class ChipEventStructs$BridgedDeviceBasicInformationClusterActiveChangedEvent");
+ return nullptr;
+ }
+
+ jmethodID activeChangedStructCtor;
+ err = chip::JniReferences::GetInstance().FindMethod(env, activeChangedStructClass, "", "(Ljava/lang/Long;)V",
+ &activeChangedStructCtor);
+ if (err != CHIP_NO_ERROR || activeChangedStructCtor == nullptr)
+ {
+ ChipLogError(Zcl,
+ "Could not find ChipEventStructs$BridgedDeviceBasicInformationClusterActiveChangedEvent constructor");
+ return nullptr;
+ }
+
+ jobject value = env->NewObject(activeChangedStructClass, activeChangedStructCtor, value_promisedActiveDuration);
+
+ return value;
+ }
default:
*aError = CHIP_ERROR_IM_MALFORMED_EVENT_PATH_IB;
break;
diff --git a/src/controller/python/chip/clusters/CHIPClusters.py b/src/controller/python/chip/clusters/CHIPClusters.py
index 5d0d1ffd38fd3c..795e77a2e6510e 100644
--- a/src/controller/python/chip/clusters/CHIPClusters.py
+++ b/src/controller/python/chip/clusters/CHIPClusters.py
@@ -3246,6 +3246,12 @@ class ChipClusters:
"clusterName": "BridgedDeviceBasicInformation",
"clusterId": 0x00000039,
"commands": {
+ 0x00000080: {
+ "commandId": 0x00000080,
+ "commandName": "KeepActive",
+ "args": {
+ },
+ },
},
"attributes": {
0x00000001: {
diff --git a/src/controller/python/chip/clusters/Objects.py b/src/controller/python/chip/clusters/Objects.py
index a580620fdf4158..40486cc24d2913 100644
--- a/src/controller/python/chip/clusters/Objects.py
+++ b/src/controller/python/chip/clusters/Objects.py
@@ -11425,6 +11425,10 @@ class ProductFinishEnum(MatterIntEnum):
# enum value. This specific should never be transmitted.
kUnknownEnumValue = 6,
+ class Bitmaps:
+ class Feature(IntFlag):
+ kBridgedICDSupport = 0x100000
+
class Structs:
@dataclass
class ProductAppearanceStruct(ClusterObject):
@@ -11439,6 +11443,20 @@ def descriptor(cls) -> ClusterObjectDescriptor:
finish: 'BridgedDeviceBasicInformation.Enums.ProductFinishEnum' = 0
primaryColor: 'typing.Union[Nullable, BridgedDeviceBasicInformation.Enums.ColorEnum]' = NullValue
+ class Commands:
+ @dataclass
+ class KeepActive(ClusterCommand):
+ cluster_id: typing.ClassVar[int] = 0x00000039
+ command_id: typing.ClassVar[int] = 0x00000080
+ is_client: typing.ClassVar[bool] = True
+ response_type: typing.ClassVar[str] = None
+
+ @ChipUtility.classproperty
+ def descriptor(cls) -> ClusterObjectDescriptor:
+ return ClusterObjectDescriptor(
+ Fields=[
+ ])
+
class Attributes:
@dataclass
class VendorName(ClusterAttributeDescriptor):
@@ -11863,6 +11881,25 @@ def descriptor(cls) -> ClusterObjectDescriptor:
reachableNewValue: 'bool' = False
+ @dataclass
+ class ActiveChanged(ClusterEvent):
+ @ChipUtility.classproperty
+ def cluster_id(cls) -> int:
+ return 0x00000039
+
+ @ChipUtility.classproperty
+ def event_id(cls) -> int:
+ return 0x00000080
+
+ @ChipUtility.classproperty
+ def descriptor(cls) -> ClusterObjectDescriptor:
+ return ClusterObjectDescriptor(
+ Fields=[
+ ClusterObjectFieldDescriptor(Label="promisedActiveDuration", Tag=0, Type=uint),
+ ])
+
+ promisedActiveDuration: 'uint' = 0
+
@dataclass
class Switch(Cluster):
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
index 65a0a2bf3c2a3e..cd57d258c2a72b 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
@@ -3670,6 +3670,15 @@ MTR_PROVISIONALLY_AVAILABLE
MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4))
@interface MTRBaseClusterBridgedDeviceBasicInformation : MTRGenericBaseCluster
+/**
+ * Command KeepActive
+ *
+ * The server SHALL attempt to keep the devices specified active for StayActiveDuration milliseconds when they are next active.
+ */
+- (void)keepActiveWithParams:(MTRBridgedDeviceBasicInformationClusterKeepActiveParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE;
+- (void)keepActiveWithCompletion:(MTRStatusCompletion)completion
+ MTR_PROVISIONALLY_AVAILABLE;
+
- (void)readAttributeVendorNameWithCompletion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4));
- (void)subscribeAttributeVendorNameWithParams:(MTRSubscribeParams *)params
subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
@@ -17905,6 +17914,10 @@ typedef NS_ENUM(uint8_t, MTRBridgedDeviceBasicInformationProductFinish) {
MTRBridgedDeviceBasicInformationProductFinishFabric MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0)) = 0x05,
} MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0));
+typedef NS_OPTIONS(uint32_t, MTRBridgedDeviceBasicInformationFeature) {
+ MTRBridgedDeviceBasicInformationFeatureBridgedICDSupport MTR_PROVISIONALLY_AVAILABLE = 0x100000,
+} MTR_PROVISIONALLY_AVAILABLE;
+
typedef NS_OPTIONS(uint32_t, MTRSwitchFeature) {
MTRSwitchFeatureLatchingSwitch MTR_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)) = 0x1,
MTRSwitchFeatureMomentarySwitch MTR_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)) = 0x2,
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
index fa9a4ef3fcf602..db4d410b084ed9 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
@@ -30658,6 +30658,35 @@ + (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheC
@implementation MTRBaseClusterBridgedDeviceBasicInformation
+- (void)keepActiveWithCompletion:(MTRStatusCompletion)completion
+{
+ [self keepActiveWithParams:nil completion:completion];
+}
+- (void)keepActiveWithParams:(MTRBridgedDeviceBasicInformationClusterKeepActiveParams * _Nullable)params completion:(MTRStatusCompletion)completion
+{
+ if (params == nil) {
+ params = [[MTRBridgedDeviceBasicInformationClusterKeepActiveParams
+ alloc] init];
+ }
+
+ auto responseHandler = ^(id _Nullable response, NSError * _Nullable error) {
+ completion(error);
+ };
+
+ auto * timedInvokeTimeoutMs = params.timedInvokeTimeoutMs;
+
+ using RequestType = BridgedDeviceBasicInformation::Commands::KeepActive::Type;
+ [self.device _invokeKnownCommandWithEndpointID:self.endpointID
+ clusterID:@(RequestType::GetClusterId())
+ commandID:@(RequestType::GetCommandId())
+ commandPayload:params
+ timedInvokeTimeout:timedInvokeTimeoutMs
+ serverSideProcessingTimeout:params.serverSideProcessingTimeout
+ responseClass:nil
+ queue:self.callbackQueue
+ completion:responseHandler];
+}
+
- (void)readAttributeVendorNameWithCompletion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion
{
using TypeInfo = BridgedDeviceBasicInformation::Attributes::VendorName::TypeInfo;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
index 02230b74b6483f..c2065c87c0b752 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
@@ -6145,6 +6145,11 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) {
MTRCommandIDTypeClusterTimeSynchronizationCommandSetDSTOffsetID MTR_PROVISIONALLY_AVAILABLE = 0x00000004,
MTRCommandIDTypeClusterTimeSynchronizationCommandSetDefaultNTPID MTR_PROVISIONALLY_AVAILABLE = 0x00000005,
+ // Cluster BridgedDeviceBasic deprecated command id names
+
+ // Cluster BridgedDeviceBasicInformation commands
+ MTRCommandIDTypeClusterBridgedDeviceBasicInformationCommandKeepActiveID MTR_PROVISIONALLY_AVAILABLE = 0x00000080,
+
// Cluster AdministratorCommissioning deprecated command id names
MTRClusterAdministratorCommissioningCommandOpenCommissioningWindowID
MTR_DEPRECATED("Please use MTRCommandIDTypeClusterAdministratorCommissioningCommandOpenCommissioningWindowID", ios(16.1, 16.4), macos(13.0, 13.3), watchos(9.1, 9.4), tvos(16.1, 16.4))
@@ -7230,6 +7235,7 @@ typedef NS_ENUM(uint32_t, MTREventIDType) {
MTREventIDTypeClusterBridgedDeviceBasicInformationEventShutDownID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000001,
MTREventIDTypeClusterBridgedDeviceBasicInformationEventLeaveID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000002,
MTREventIDTypeClusterBridgedDeviceBasicInformationEventReachableChangedID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000003,
+ MTREventIDTypeClusterBridgedDeviceBasicInformationEventActiveChangedID MTR_PROVISIONALLY_AVAILABLE = 0x00000080,
// Cluster Switch deprecated event names
MTRClusterSwitchEventSwitchLatchedID
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
index 1113a02929193b..154ccb3a4d96ff 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
@@ -1699,6 +1699,10 @@ MTR_PROVISIONALLY_AVAILABLE
MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4))
@interface MTRClusterBridgedDeviceBasicInformation : MTRGenericCluster
+- (void)keepActiveWithParams:(MTRBridgedDeviceBasicInformationClusterKeepActiveParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE;
+- (void)keepActiveWithExpectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion
+ MTR_PROVISIONALLY_AVAILABLE;
+
- (NSDictionary * _Nullable)readAttributeVendorNameWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4));
- (NSDictionary * _Nullable)readAttributeVendorIDWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4));
@@ -1753,8 +1757,8 @@ MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4))
@interface MTRClusterBridgedDeviceBasicInformation (Availability)
/**
- * The queue is currently unused, but may be used in the future for calling completions
- * for command invocations if commands are added to this cluster.
+ * For all instance methods that take a completion (i.e. command invocations),
+ * the completion will be called on the provided queue.
*/
- (instancetype _Nullable)initWithDevice:(MTRDevice *)device
endpointID:(NSNumber *)endpointID
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
index c9b3095c75b150..e88f19f308f2fd 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
@@ -4944,6 +4944,37 @@ - (void)setDefaultNTPWithParams:(MTRTimeSynchronizationClusterSetDefaultNTPParam
@implementation MTRClusterBridgedDeviceBasicInformation
+- (void)keepActiveWithExpectedValues:(NSArray *> *)expectedValues expectedValueInterval:(NSNumber *)expectedValueIntervalMs completion:(MTRStatusCompletion)completion
+{
+ [self keepActiveWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
+}
+- (void)keepActiveWithParams:(MTRBridgedDeviceBasicInformationClusterKeepActiveParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion
+{
+ if (params == nil) {
+ params = [[MTRBridgedDeviceBasicInformationClusterKeepActiveParams
+ alloc] init];
+ }
+
+ auto responseHandler = ^(id _Nullable response, NSError * _Nullable error) {
+ completion(error);
+ };
+
+ auto * timedInvokeTimeoutMs = params.timedInvokeTimeoutMs;
+
+ using RequestType = BridgedDeviceBasicInformation::Commands::KeepActive::Type;
+ [self.device _invokeKnownCommandWithEndpointID:self.endpointID
+ clusterID:@(RequestType::GetClusterId())
+ commandID:@(RequestType::GetCommandId())
+ commandPayload:params
+ expectedValues:expectedValues
+ expectedValueInterval:expectedValueIntervalMs
+ timedInvokeTimeout:timedInvokeTimeoutMs
+ serverSideProcessingTimeout:params.serverSideProcessingTimeout
+ responseClass:nil
+ queue:self.callbackQueue
+ completion:responseHandler];
+}
+
- (NSDictionary * _Nullable)readAttributeVendorNameWithParams:(MTRReadParams * _Nullable)params
{
return [self.device readAttributeWithEndpointID:self.endpointID clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID) attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeVendorNameID) params:params];
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h
index acb7982d9f9283..03045515af84ee 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h
@@ -2915,6 +2915,34 @@ MTR_PROVISIONALLY_AVAILABLE
@property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout;
@end
+MTR_PROVISIONALLY_AVAILABLE
+@interface MTRBridgedDeviceBasicInformationClusterKeepActiveParams : NSObject
+/**
+ * Controls whether the command is a timed command (using Timed Invoke).
+ *
+ * If nil (the default value), a regular invoke is done for commands that do
+ * not require a timed invoke and a timed invoke with some default timed request
+ * timeout is done for commands that require a timed invoke.
+ *
+ * If not nil, a timed invoke is done, with the provided value used as the timed
+ * request timeout. The value should be chosen small enough to provide the
+ * desired security properties but large enough that it will allow a round-trip
+ * from the sever to the client (for the status response and actual invoke
+ * request) within the timeout window.
+ *
+ */
+@property (nonatomic, copy, nullable) NSNumber * timedInvokeTimeoutMs;
+
+/**
+ * Controls how much time, in seconds, we will allow for the server to process the command.
+ *
+ * The command will then time out if that much time, plus an allowance for retransmits due to network failures, passes.
+ *
+ * If nil, the framework will try to select an appropriate timeout value itself.
+ */
+@property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout;
+@end
+
MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1))
@interface MTRAdministratorCommissioningClusterOpenCommissioningWindowParams : NSObject
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
index 8ab9ac346812c5..d549ce09fd136c 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
@@ -7556,6 +7556,79 @@ - (CHIP_ERROR)_encodeToTLVReader:(chip::System::PacketBufferTLVReader &)reader
}
@end
+@implementation MTRBridgedDeviceBasicInformationClusterKeepActiveParams
+- (instancetype)init
+{
+ if (self = [super init]) {
+ _timedInvokeTimeoutMs = nil;
+ _serverSideProcessingTimeout = nil;
+ }
+ return self;
+}
+
+- (id)copyWithZone:(NSZone * _Nullable)zone;
+{
+ auto other = [[MTRBridgedDeviceBasicInformationClusterKeepActiveParams alloc] init];
+
+ other.timedInvokeTimeoutMs = self.timedInvokeTimeoutMs;
+ other.serverSideProcessingTimeout = self.serverSideProcessingTimeout;
+
+ return other;
+}
+
+- (NSString *)description
+{
+ NSString * descriptionString = [NSString stringWithFormat:@"<%@: >", NSStringFromClass([self class])];
+ return descriptionString;
+}
+
+@end
+
+@implementation MTRBridgedDeviceBasicInformationClusterKeepActiveParams (InternalMethods)
+
+- (CHIP_ERROR)_encodeToTLVReader:(chip::System::PacketBufferTLVReader &)reader
+{
+ chip::app::Clusters::BridgedDeviceBasicInformation::Commands::KeepActive::Type encodableStruct;
+ ListFreer listFreer;
+
+ auto buffer = chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSizeWithoutReserve, 0);
+ if (buffer.IsNull()) {
+ return CHIP_ERROR_NO_MEMORY;
+ }
+
+ chip::System::PacketBufferTLVWriter writer;
+ // Commands never need chained buffers, since they cannot be chunked.
+ writer.Init(std::move(buffer), /* useChainedBuffers = */ false);
+
+ ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::AnonymousTag(), encodableStruct));
+
+ ReturnErrorOnFailure(writer.Finalize(&buffer));
+
+ reader.Init(std::move(buffer));
+ return reader.Next(chip::TLV::kTLVType_Structure, chip::TLV::AnonymousTag());
+}
+
+- (NSDictionary * _Nullable)_encodeAsDataValue:(NSError * __autoreleasing *)error
+{
+ chip::System::PacketBufferTLVReader reader;
+ CHIP_ERROR err = [self _encodeToTLVReader:reader];
+ if (err != CHIP_NO_ERROR) {
+ if (error) {
+ *error = [MTRError errorForCHIPErrorCode:err];
+ }
+ return nil;
+ }
+
+ auto decodedObj = MTRDecodeDataValueDictionaryFromCHIPTLV(&reader);
+ if (decodedObj == nil) {
+ if (error) {
+ *error = [MTRError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE];
+ }
+ }
+ return decodedObj;
+}
+@end
+
@implementation MTRAdministratorCommissioningClusterOpenCommissioningWindowParams
- (instancetype)init
{
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloads_Internal.h b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloads_Internal.h
index 7072a0db6c26ef..35b2c44ee96c15 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloads_Internal.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloads_Internal.h
@@ -496,6 +496,12 @@ NS_ASSUME_NONNULL_BEGIN
@end
+@interface MTRBridgedDeviceBasicInformationClusterKeepActiveParams (InternalMethods)
+
+- (NSDictionary * _Nullable)_encodeAsDataValue:(NSError * __autoreleasing *)error;
+
+@end
+
@interface MTRAdministratorCommissioningClusterOpenCommissioningWindowParams (InternalMethods)
- (NSDictionary * _Nullable)_encodeAsDataValue:(NSError * __autoreleasing *)error;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTREventTLVValueDecoder.mm b/src/darwin/Framework/CHIP/zap-generated/MTREventTLVValueDecoder.mm
index 049f67951b7408..95856811f35f3c 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTREventTLVValueDecoder.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTREventTLVValueDecoder.mm
@@ -1382,6 +1382,23 @@ static id _Nullable DecodeEventPayloadForBridgedDeviceBasicInformationCluster(Ev
return value;
}
+ case Events::ActiveChanged::Id: {
+ Events::ActiveChanged::DecodableType cppValue;
+ *aError = DataModel::Decode(aReader, cppValue);
+ if (*aError != CHIP_NO_ERROR) {
+ return nil;
+ }
+
+ __auto_type * value = [MTRBridgedDeviceBasicInformationClusterActiveChangedEvent new];
+
+ do {
+ NSNumber * _Nonnull memberValue;
+ memberValue = [NSNumber numberWithUnsignedInt:cppValue.promisedActiveDuration];
+ value.promisedActiveDuration = memberValue;
+ } while (0);
+
+ return value;
+ }
default: {
break;
}
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h
index e72e520b198f79..c95bb08978f92e 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h
@@ -649,6 +649,11 @@ MTR_DEPRECATED("Please use MTRBridgedDeviceBasicInformationClusterReachableChang
@property (nonatomic, copy) NSNumber * _Nonnull reachableNewValue MTR_DEPRECATED("Please use MTRBridgedDeviceBasicInformationClusterReachableChangedEvent", ios(16.1, 17.0), macos(13.0, 14.0), watchos(9.1, 10.0), tvos(16.1, 17.0));
@end
+MTR_PROVISIONALLY_AVAILABLE
+@interface MTRBridgedDeviceBasicInformationClusterActiveChangedEvent : NSObject
+@property (nonatomic, copy) NSNumber * _Nonnull promisedActiveDuration MTR_PROVISIONALLY_AVAILABLE;
+@end
+
MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1))
@interface MTRSwitchClusterSwitchLatchedEvent : NSObject
@property (nonatomic, copy, getter=getNewPosition) NSNumber * _Nonnull newPosition MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1));
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm
index 09314a688222f6..c703f32b3b85e2 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm
@@ -2246,6 +2246,33 @@ @implementation MTRBridgedDeviceBasicClusterReachableChangedEvent : MTRBridgedDe
@dynamic reachableNewValue;
@end
+@implementation MTRBridgedDeviceBasicInformationClusterActiveChangedEvent
+- (instancetype)init
+{
+ if (self = [super init]) {
+
+ _promisedActiveDuration = @(0);
+ }
+ return self;
+}
+
+- (id)copyWithZone:(NSZone * _Nullable)zone
+{
+ auto other = [[MTRBridgedDeviceBasicInformationClusterActiveChangedEvent alloc] init];
+
+ other.promisedActiveDuration = self.promisedActiveDuration;
+
+ return other;
+}
+
+- (NSString *)description
+{
+ NSString * descriptionString = [NSString stringWithFormat:@"<%@: promisedActiveDuration:%@; >", NSStringFromClass([self class]), _promisedActiveDuration];
+ return descriptionString;
+}
+
+@end
+
@implementation MTRSwitchClusterSwitchLatchedEvent
- (instancetype)init
{
diff --git a/zzz_generated/app-common/app-common/zap-generated/callback.h b/zzz_generated/app-common/app-common/zap-generated/callback.h
index 7be9f882fd37ef..f40b20d99bdafc 100644
--- a/zzz_generated/app-common/app-common/zap-generated/callback.h
+++ b/zzz_generated/app-common/app-common/zap-generated/callback.h
@@ -5782,6 +5782,12 @@ bool emberAfTimeSynchronizationClusterSetDSTOffsetCallback(
bool emberAfTimeSynchronizationClusterSetDefaultNTPCallback(
chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
const chip::app::Clusters::TimeSynchronization::Commands::SetDefaultNTP::DecodableType & commandData);
+/**
+ * @brief Bridged Device Basic Information Cluster KeepActive Command callback (from client)
+ */
+bool emberAfBridgedDeviceBasicInformationClusterKeepActiveCallback(
+ chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
+ const chip::app::Clusters::BridgedDeviceBasicInformation::Commands::KeepActive::DecodableType & commandData);
/**
* @brief Administrator Commissioning Cluster OpenCommissioningWindow Command callback (from client)
*/
diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h b/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h
index 37562af207838f..ec7845990e67d6 100644
--- a/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h
+++ b/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h
@@ -1480,6 +1480,12 @@ enum class ProductFinishEnum : uint8_t
// enum value. This specific should never be transmitted.
kUnknownEnumValue = 6,
};
+
+// Bitmap for Feature
+enum class Feature : uint32_t
+{
+ kBridgedICDSupport = 0x100000,
+};
} // namespace BridgedDeviceBasicInformation
namespace Switch {
diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp
index d821d185f11272..d7490ad9951c2a 100644
--- a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp
+++ b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp
@@ -7678,7 +7678,28 @@ CHIP_ERROR DecodableType::Decode(TLV::TLVReader & reader)
} // namespace ProductAppearanceStruct
} // namespace Structs
-namespace Commands {} // namespace Commands
+namespace Commands {
+namespace KeepActive {
+CHIP_ERROR Type::Encode(TLV::TLVWriter & aWriter, TLV::Tag aTag) const
+{
+ DataModel::WrappedStructEncoder encoder{ aWriter, aTag };
+ return encoder.Finalize();
+}
+
+CHIP_ERROR DecodableType::Decode(TLV::TLVReader & reader)
+{
+ detail::StructDecodeIterator __iterator(reader);
+ while (true)
+ {
+ auto __element = __iterator.Next();
+ if (std::holds_alternative(__element))
+ {
+ return std::get(__element);
+ }
+ }
+}
+} // namespace KeepActive.
+} // namespace Commands
namespace Attributes {
CHIP_ERROR TypeInfo::DecodableType::Decode(TLV::TLVReader & reader, const ConcreteAttributePath & path)
@@ -7848,6 +7869,41 @@ CHIP_ERROR DecodableType::Decode(TLV::TLVReader & reader)
}
}
} // namespace ReachableChanged.
+namespace ActiveChanged {
+CHIP_ERROR Type::Encode(TLV::TLVWriter & aWriter, TLV::Tag aTag) const
+{
+ TLV::TLVType outer;
+ ReturnErrorOnFailure(aWriter.StartContainer(aTag, TLV::kTLVType_Structure, outer));
+ ReturnErrorOnFailure(DataModel::Encode(aWriter, TLV::ContextTag(Fields::kPromisedActiveDuration), promisedActiveDuration));
+ return aWriter.EndContainer(outer);
+}
+
+CHIP_ERROR DecodableType::Decode(TLV::TLVReader & reader)
+{
+ detail::StructDecodeIterator __iterator(reader);
+ while (true)
+ {
+ auto __element = __iterator.Next();
+ if (std::holds_alternative(__element))
+ {
+ return std::get(__element);
+ }
+
+ CHIP_ERROR err = CHIP_NO_ERROR;
+ const uint8_t __context_tag = std::get(__element);
+
+ if (__context_tag == to_underlying(Fields::kPromisedActiveDuration))
+ {
+ err = DataModel::Decode(reader, promisedActiveDuration);
+ }
+ else
+ {
+ }
+
+ ReturnErrorOnFailure(err);
+ }
+}
+} // namespace ActiveChanged.
} // namespace Events
} // namespace BridgedDeviceBasicInformation
@@ -31589,6 +31645,13 @@ bool CommandIsFabricScoped(ClusterId aCluster, CommandId aCommand)
return false;
}
}
+ case Clusters::BridgedDeviceBasicInformation::Id: {
+ switch (aCommand)
+ {
+ default:
+ return false;
+ }
+ }
case Clusters::AdministratorCommissioning::Id: {
switch (aCommand)
{
diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
index a32e52a5c072f8..66cdafe3f0b1ad 100644
--- a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
+++ b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
@@ -10566,6 +10566,47 @@ using DecodableType = Type;
} // namespace ProductAppearanceStruct
} // namespace Structs
+namespace Commands {
+// Forward-declarations so we can reference these later.
+
+namespace KeepActive {
+struct Type;
+struct DecodableType;
+} // namespace KeepActive
+
+} // namespace Commands
+
+namespace Commands {
+namespace KeepActive {
+enum class Fields : uint8_t
+{
+};
+
+struct Type
+{
+public:
+ // Use GetCommandId instead of commandId directly to avoid naming conflict with CommandIdentification in ExecutionOfACommand
+ static constexpr CommandId GetCommandId() { return Commands::KeepActive::Id; }
+ static constexpr ClusterId GetClusterId() { return Clusters::BridgedDeviceBasicInformation::Id; }
+
+ CHIP_ERROR Encode(TLV::TLVWriter & aWriter, TLV::Tag aTag) const;
+
+ using ResponseType = DataModel::NullObjectType;
+
+ static constexpr bool MustUseTimedInvoke() { return false; }
+};
+
+struct DecodableType
+{
+public:
+ static constexpr CommandId GetCommandId() { return Commands::KeepActive::Id; }
+ static constexpr ClusterId GetClusterId() { return Clusters::BridgedDeviceBasicInformation::Id; }
+
+ CHIP_ERROR Decode(TLV::TLVReader & reader);
+};
+}; // namespace KeepActive
+} // namespace Commands
+
namespace Attributes {
namespace VendorName {
@@ -10965,6 +11006,39 @@ struct DecodableType
CHIP_ERROR Decode(TLV::TLVReader & reader);
};
} // namespace ReachableChanged
+namespace ActiveChanged {
+static constexpr PriorityLevel kPriorityLevel = PriorityLevel::Info;
+
+enum class Fields : uint8_t
+{
+ kPromisedActiveDuration = 0,
+};
+
+struct Type
+{
+public:
+ static constexpr PriorityLevel GetPriorityLevel() { return kPriorityLevel; }
+ static constexpr EventId GetEventId() { return Events::ActiveChanged::Id; }
+ static constexpr ClusterId GetClusterId() { return Clusters::BridgedDeviceBasicInformation::Id; }
+ static constexpr bool kIsFabricScoped = false;
+
+ uint32_t promisedActiveDuration = static_cast(0);
+
+ CHIP_ERROR Encode(TLV::TLVWriter & aWriter, TLV::Tag aTag) const;
+};
+
+struct DecodableType
+{
+public:
+ static constexpr PriorityLevel GetPriorityLevel() { return kPriorityLevel; }
+ static constexpr EventId GetEventId() { return Events::ActiveChanged::Id; }
+ static constexpr ClusterId GetClusterId() { return Clusters::BridgedDeviceBasicInformation::Id; }
+
+ uint32_t promisedActiveDuration = static_cast(0);
+
+ CHIP_ERROR Decode(TLV::TLVReader & reader);
+};
+} // namespace ActiveChanged
} // namespace Events
} // namespace BridgedDeviceBasicInformation
namespace Switch {
diff --git a/zzz_generated/app-common/app-common/zap-generated/ids/Commands.h b/zzz_generated/app-common/app-common/zap-generated/ids/Commands.h
index 608b7d7c7565a7..ff0f3082dbb27f 100644
--- a/zzz_generated/app-common/app-common/zap-generated/ids/Commands.h
+++ b/zzz_generated/app-common/app-common/zap-generated/ids/Commands.h
@@ -449,6 +449,16 @@ static constexpr CommandId Id = 0x00000005;
} // namespace Commands
} // namespace TimeSynchronization
+namespace BridgedDeviceBasicInformation {
+namespace Commands {
+
+namespace KeepActive {
+static constexpr CommandId Id = 0x00000080;
+} // namespace KeepActive
+
+} // namespace Commands
+} // namespace BridgedDeviceBasicInformation
+
namespace AdministratorCommissioning {
namespace Commands {
diff --git a/zzz_generated/app-common/app-common/zap-generated/ids/Events.h b/zzz_generated/app-common/app-common/zap-generated/ids/Events.h
index cc619b581dc3e6..0fdda9c137ad88 100644
--- a/zzz_generated/app-common/app-common/zap-generated/ids/Events.h
+++ b/zzz_generated/app-common/app-common/zap-generated/ids/Events.h
@@ -220,6 +220,10 @@ namespace ReachableChanged {
static constexpr EventId Id = 0x00000003;
} // namespace ReachableChanged
+namespace ActiveChanged {
+static constexpr EventId Id = 0x00000080;
+} // namespace ActiveChanged
+
} // namespace Events
} // namespace BridgedDeviceBasicInformation
diff --git a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
index 63b07843fd2703..1871f18ab9a8c8 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
@@ -3391,6 +3391,7 @@ class TimeSynchronizationSetDefaultNTP : public ClusterCommand
| Cluster BridgedDeviceBasicInformation | 0x0039 |
|------------------------------------------------------------------------------|
| Commands: | |
+| * KeepActive | 0x80 |
|------------------------------------------------------------------------------|
| Attributes: | |
| * VendorName | 0x0001 |
@@ -3421,8 +3422,46 @@ class TimeSynchronizationSetDefaultNTP : public ClusterCommand
| * ShutDown | 0x0001 |
| * Leave | 0x0002 |
| * ReachableChanged | 0x0003 |
+| * ActiveChanged | 0x0080 |
\*----------------------------------------------------------------------------*/
+/*
+ * Command KeepActive
+ */
+class BridgedDeviceBasicInformationKeepActive : public ClusterCommand
+{
+public:
+ BridgedDeviceBasicInformationKeepActive(CredentialIssuerCommands * credsIssuerConfig) :
+ ClusterCommand("keep-active", credsIssuerConfig)
+ {
+ ClusterCommand::AddArguments();
+ }
+
+ CHIP_ERROR SendCommand(chip::DeviceProxy * device, std::vector endpointIds) override
+ {
+ constexpr chip::ClusterId clusterId = chip::app::Clusters::BridgedDeviceBasicInformation::Id;
+ constexpr chip::CommandId commandId = chip::app::Clusters::BridgedDeviceBasicInformation::Commands::KeepActive::Id;
+
+ ChipLogProgress(chipTool, "Sending cluster (0x%08" PRIX32 ") command (0x%08" PRIX32 ") on endpoint %u", clusterId,
+ commandId, endpointIds.at(0));
+ return ClusterCommand::SendCommand(device, endpointIds.at(0), clusterId, commandId, mRequest);
+ }
+
+ CHIP_ERROR SendGroupCommand(chip::GroupId groupId, chip::FabricIndex fabricIndex) override
+ {
+ constexpr chip::ClusterId clusterId = chip::app::Clusters::BridgedDeviceBasicInformation::Id;
+ constexpr chip::CommandId commandId = chip::app::Clusters::BridgedDeviceBasicInformation::Commands::KeepActive::Id;
+
+ ChipLogProgress(chipTool, "Sending cluster (0x%08" PRIX32 ") command (0x%08" PRIX32 ") on Group %u", clusterId, commandId,
+ groupId);
+
+ return ClusterCommand::SendGroupCommand(groupId, fabricIndex, clusterId, commandId, mRequest);
+ }
+
+private:
+ chip::app::Clusters::BridgedDeviceBasicInformation::Commands::KeepActive::Type mRequest;
+};
+
/*----------------------------------------------------------------------------*\
| Cluster Switch | 0x003B |
|------------------------------------------------------------------------------|
@@ -18097,7 +18136,8 @@ void registerClusterBridgedDeviceBasicInformation(Commands & commands, Credentia
//
// Commands
//
- make_unique(Id, credsIssuerConfig), //
+ make_unique(Id, credsIssuerConfig), //
+ make_unique(credsIssuerConfig), //
//
// Attributes
//
@@ -18202,11 +18242,13 @@ void registerClusterBridgedDeviceBasicInformation(Commands & commands, Credentia
make_unique(Id, "shut-down", Events::ShutDown::Id, credsIssuerConfig), //
make_unique(Id, "leave", Events::Leave::Id, credsIssuerConfig), //
make_unique(Id, "reachable-changed", Events::ReachableChanged::Id, credsIssuerConfig), //
+ make_unique(Id, "active-changed", Events::ActiveChanged::Id, credsIssuerConfig), //
make_unique(Id, credsIssuerConfig), //
make_unique(Id, "start-up", Events::StartUp::Id, credsIssuerConfig), //
make_unique(Id, "shut-down", Events::ShutDown::Id, credsIssuerConfig), //
make_unique(Id, "leave", Events::Leave::Id, credsIssuerConfig), //
make_unique(Id, "reachable-changed", Events::ReachableChanged::Id, credsIssuerConfig), //
+ make_unique(Id, "active-changed", Events::ActiveChanged::Id, credsIssuerConfig), //
};
commands.RegisterCluster(clusterName, clusterCommands);
diff --git a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
index 1bf30e655ab661..2964421308bbf1 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
+++ b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
@@ -5900,6 +5900,22 @@ CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
return CHIP_NO_ERROR;
}
+CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
+ const BridgedDeviceBasicInformation::Events::ActiveChanged::DecodableType & value)
+{
+ DataModelLogger::LogString(label, indent, "{");
+ {
+ CHIP_ERROR err = DataModelLogger::LogValue("PromisedActiveDuration", indent + 1, value.promisedActiveDuration);
+ if (err != CHIP_NO_ERROR)
+ {
+ DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'PromisedActiveDuration'");
+ return err;
+ }
+ }
+ DataModelLogger::LogString(indent, "}");
+
+ return CHIP_NO_ERROR;
+}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, const Switch::Events::SwitchLatched::DecodableType & value)
{
DataModelLogger::LogString(label, indent, "{");
@@ -19780,6 +19796,11 @@ CHIP_ERROR DataModelLogger::LogEvent(const chip::app::EventHeader & header, chip
ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
return DataModelLogger::LogValue("ReachableChanged", 1, value);
}
+ case BridgedDeviceBasicInformation::Events::ActiveChanged::Id: {
+ chip::app::Clusters::BridgedDeviceBasicInformation::Events::ActiveChanged::DecodableType value;
+ ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
+ return DataModelLogger::LogValue("ActiveChanged", 1, value);
+ }
}
break;
}
diff --git a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.h b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.h
index 7aecdf187d7a49..1220bc87f6462d 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.h
+++ b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.h
@@ -472,6 +472,8 @@ static CHIP_ERROR LogValue(const char * label, size_t indent,
static CHIP_ERROR
LogValue(const char * label, size_t indent,
const chip::app::Clusters::BridgedDeviceBasicInformation::Events::ReachableChanged::DecodableType & value);
+static CHIP_ERROR LogValue(const char * label, size_t indent,
+ const chip::app::Clusters::BridgedDeviceBasicInformation::Events::ActiveChanged::DecodableType & value);
static CHIP_ERROR LogValue(const char * label, size_t indent,
const chip::app::Clusters::Switch::Events::SwitchLatched::DecodableType & value);
static CHIP_ERROR LogValue(const char * label, size_t indent,
diff --git a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
index 9d6610f69f3faf..d609b2892a0db8 100644
--- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
@@ -39468,6 +39468,7 @@ class SubscribeAttributeTimeSynchronizationClusterRevision : public SubscribeAtt
| Cluster BridgedDeviceBasicInformation | 0x0039 |
|------------------------------------------------------------------------------|
| Commands: | |
+| * KeepActive | 0x80 |
|------------------------------------------------------------------------------|
| Attributes: | |
| * VendorName | 0x0001 |
@@ -39498,8 +39499,56 @@ class SubscribeAttributeTimeSynchronizationClusterRevision : public SubscribeAtt
| * ShutDown | 0x0001 |
| * Leave | 0x0002 |
| * ReachableChanged | 0x0003 |
+| * ActiveChanged | 0x0080 |
\*----------------------------------------------------------------------------*/
+#if MTR_ENABLE_PROVISIONAL
+/*
+ * Command KeepActive
+ */
+class BridgedDeviceBasicInformationKeepActive : public ClusterCommand {
+public:
+ BridgedDeviceBasicInformationKeepActive()
+ : ClusterCommand("keep-active")
+ {
+ ClusterCommand::AddArguments();
+ }
+
+ CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override
+ {
+ constexpr chip::ClusterId clusterId = chip::app::Clusters::BridgedDeviceBasicInformation::Id;
+ constexpr chip::CommandId commandId = chip::app::Clusters::BridgedDeviceBasicInformation::Commands::KeepActive::Id;
+
+ ChipLogProgress(chipTool, "Sending cluster (0x%08" PRIX32 ") command (0x%08" PRIX32 ") on endpoint %u", clusterId, commandId, endpointId);
+
+ dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
+ __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+ __auto_type * params = [[MTRBridgedDeviceBasicInformationClusterKeepActiveParams alloc] init];
+ params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
+ uint16_t repeatCount = mRepeatCount.ValueOr(1);
+ uint16_t __block responsesNeeded = repeatCount;
+ while (repeatCount--) {
+ [cluster keepActiveWithParams:params completion:
+ ^(NSError * _Nullable error) {
+ responsesNeeded--;
+ if (error != nil) {
+ mError = error;
+ LogNSError("Error", error);
+ RemoteDataModelLogger::LogCommandErrorAsJSON(@(endpointId), @(clusterId), @(commandId), error);
+ }
+ if (responsesNeeded == 0) {
+ SetCommandExitStatus(mError);
+ }
+ }];
+ }
+ return CHIP_NO_ERROR;
+ }
+
+private:
+};
+
+#endif // MTR_ENABLE_PROVISIONAL
+
/*
* Attribute VendorName
*/
@@ -189931,6 +189980,9 @@ void registerClusterBridgedDeviceBasicInformation(Commands & commands)
commands_list clusterCommands = {
make_unique(Id), //
+#if MTR_ENABLE_PROVISIONAL
+ make_unique(), //
+#endif // MTR_ENABLE_PROVISIONAL
make_unique(Id), //
make_unique(Id), //
make_unique(Id), //