diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
index 6ff3c099333d05..71da6771c0e97a 100644
--- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
+++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
@@ -3708,6 +3708,7 @@ server cluster TestCluster = 4294048773 {
attribute nullable int8s nullableRangeRestrictedInt8s = 16423;
attribute nullable int16u nullableRangeRestrictedInt16u = 16424;
attribute nullable int16s nullableRangeRestrictedInt16s = 16425;
+ attribute int8u writeOnlyInt8u = 16426;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
@@ -4772,6 +4773,7 @@ endpoint 1 {
ram attribute nullableRangeRestrictedInt8s default = -20;
ram attribute nullableRangeRestrictedInt16u default = 200;
ram attribute nullableRangeRestrictedInt16s default = -100;
+ callback attribute writeOnlyInt8u;
ram attribute featureMap;
ram attribute clusterRevision default = 1;
}
diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
index 08edd158a5ee99..daca44d7b782ee 100644
--- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
+++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
@@ -20700,6 +20700,22 @@
"maxInterval": 65534,
"reportableChange": 0
},
+ {
+ "name": "write_only_int8u",
+ "code": 16426,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "AttributeList",
"code": 65531,
@@ -24724,5 +24740,6 @@
"endpointVersion": 1,
"deviceIdentifier": 61442
}
- ]
+ ],
+ "log": []
}
\ No newline at end of file
diff --git a/src/app/clusters/test-cluster-server/test-cluster-server.cpp b/src/app/clusters/test-cluster-server/test-cluster-server.cpp
index 0da23b39b189e1..8647c7be0b12e4 100644
--- a/src/app/clusters/test-cluster-server/test-cluster-server.cpp
+++ b/src/app/clusters/test-cluster-server/test-cluster-server.cpp
@@ -170,6 +170,9 @@ CHIP_ERROR TestAttrAccess::Read(const ConcreteReadAttributePath & aPath, Attribu
case ClusterErrorBoolean::Id: {
return StatusIB(Protocols::InteractionModel::Status::Failure, 17).ToChipError();
}
+ case WriteOnlyInt8u::Id: {
+ return StatusIB(Protocols::InteractionModel::Status::UnsupportedRead).ToChipError();
+ }
default: {
break;
}
diff --git a/src/app/util/ember-compatibility-functions.cpp b/src/app/util/ember-compatibility-functions.cpp
index 3ac3b3258c41bc..31390a973ad4e3 100644
--- a/src/app/util/ember-compatibility-functions.cpp
+++ b/src/app/util/ember-compatibility-functions.cpp
@@ -475,6 +475,15 @@ CHIP_ERROR ReadViaAccessInterface(FabricIndex aAccessingFabricIndex, bool aIsFab
AttributeValueEncoder valueEncoder(aAttributeReports, aAccessingFabricIndex, aPath, version, aIsFabricFiltered, state);
CHIP_ERROR err = aAccessInterface->Read(aPath, valueEncoder);
+ if (err == CHIP_IM_GLOBAL_STATUS(UnsupportedRead) && aPath.mExpanded)
+ {
+ //
+ // Set this to true to ensure our caller will return immediately without proceeding further.
+ //
+ *aTriedEncode = true;
+ return CHIP_NO_ERROR;
+ }
+
if (err != CHIP_NO_ERROR)
{
// If the err is not CHIP_NO_ERROR, means the encoding was aborted, then the valueEncoder may save its state.
diff --git a/src/app/zap-templates/zcl/data-model/chip/test-cluster.xml b/src/app/zap-templates/zcl/data-model/chip/test-cluster.xml
index ba5db80d1708ef..da8acf50bbd389 100644
--- a/src/app/zap-templates/zcl/data-model/chip/test-cluster.xml
+++ b/src/app/zap-templates/zcl/data-model/chip/test-cluster.xml
@@ -232,6 +232,8 @@ limitations under the License.
nullable_range_restricted_int16u
nullable_range_restricted_int16s
+ write_only_int8u
+
unsupported
diff --git a/src/controller/python/chip/clusters/Objects.py b/src/controller/python/chip/clusters/Objects.py
index 49ea204a2ecb34..69e82312c9aa1a 100644
--- a/src/controller/python/chip/clusters/Objects.py
+++ b/src/controller/python/chip/clusters/Objects.py
@@ -26685,6 +26685,7 @@ def descriptor(cls) -> ClusterObjectDescriptor:
ClusterObjectFieldDescriptor(Label="nullableRangeRestrictedInt8s", Tag=0x00004027, Type=typing.Union[Nullable, int]),
ClusterObjectFieldDescriptor(Label="nullableRangeRestrictedInt16u", Tag=0x00004028, Type=typing.Union[Nullable, uint]),
ClusterObjectFieldDescriptor(Label="nullableRangeRestrictedInt16s", Tag=0x00004029, Type=typing.Union[Nullable, int]),
+ ClusterObjectFieldDescriptor(Label="writeOnlyInt8u", Tag=0x0000402A, Type=typing.Optional[uint]),
ClusterObjectFieldDescriptor(Label="generatedCommandList", Tag=0x0000FFF8, Type=typing.List[uint]),
ClusterObjectFieldDescriptor(Label="acceptedCommandList", Tag=0x0000FFF9, Type=typing.List[uint]),
ClusterObjectFieldDescriptor(Label="attributeList", Tag=0x0000FFFB, Type=typing.List[uint]),
@@ -26773,6 +26774,7 @@ def descriptor(cls) -> ClusterObjectDescriptor:
nullableRangeRestrictedInt8s: 'typing.Union[Nullable, int]' = None
nullableRangeRestrictedInt16u: 'typing.Union[Nullable, uint]' = None
nullableRangeRestrictedInt16s: 'typing.Union[Nullable, int]' = None
+ writeOnlyInt8u: 'typing.Optional[uint]' = None
generatedCommandList: 'typing.List[uint]' = None
acceptedCommandList: 'typing.List[uint]' = None
attributeList: 'typing.List[uint]' = None
@@ -28854,6 +28856,22 @@ def attribute_type(cls) -> ClusterObjectFieldDescriptor:
value: 'typing.Union[Nullable, int]' = NullValue
+ @dataclass
+ class WriteOnlyInt8u(ClusterAttributeDescriptor):
+ @ChipUtility.classproperty
+ def cluster_id(cls) -> int:
+ return 0xFFF1FC05
+
+ @ChipUtility.classproperty
+ def attribute_id(cls) -> int:
+ return 0x0000402A
+
+ @ChipUtility.classproperty
+ def attribute_type(cls) -> ClusterObjectFieldDescriptor:
+ return ClusterObjectFieldDescriptor(Type=typing.Optional[uint])
+
+ value: 'typing.Optional[uint]' = None
+
@dataclass
class GeneratedCommandList(ClusterAttributeDescriptor):
@ChipUtility.classproperty
diff --git a/src/controller/python/test/test_scripts/cluster_objects.py b/src/controller/python/test/test_scripts/cluster_objects.py
index 5a9db3dd6ba28c..896d0c79103421 100644
--- a/src/controller/python/test/test_scripts/cluster_objects.py
+++ b/src/controller/python/test/test_scripts/cluster_objects.py
@@ -122,6 +122,14 @@ async def TestCommandWithResponse(cls, devCtrl):
if res.returnValue != 5:
raise ValueError()
+ @classmethod
+ @base.test_case
+ async def TestReadWriteOnlyAttribute(cls, devCtrl):
+ logger.info("Test wildcard read of attributes containing write-only attribute")
+ res = await devCtrl.ReadAttribute(nodeid=NODE_ID, attributes=[(Clusters.TestCluster)])
+ if Clusters.TestCluster.Attributes.WriteOnlyInt8u in res[1][Clusters.TestCluster]:
+ raise AssertionError("Received un-expected WriteOnlyInt8u attribute in TestCluster")
+
@classmethod
@base.test_case
async def TestWriteRequest(cls, devCtrl):
@@ -560,6 +568,7 @@ def eventPathPossibilities():
async def RunTest(cls, devCtrl):
try:
cls.TestAPI()
+ await cls.TestReadWriteOnlyAttribute(devCtrl)
await cls.TestCommandRoundTrip(devCtrl)
await cls.TestCommandRoundTripWithBadEndpoint(devCtrl)
await cls.TestCommandWithResponse(devCtrl)
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
index a64e8844bf90ff..d49aab980c3ebe 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
@@ -17449,6 +17449,17 @@ id MTRDecodeAttributeValue(const ConcreteAttributePath & aPath, TLV::TLVReader &
}
return value;
}
+ case Attributes::WriteOnlyInt8u::Id: {
+ using TypeInfo = Attributes::WriteOnlyInt8u::TypeInfo;
+ TypeInfo::DecodableType cppValue;
+ *aError = DataModel::Decode(aReader, cppValue);
+ if (*aError != CHIP_NO_ERROR) {
+ return nil;
+ }
+ NSNumber * _Nonnull value;
+ value = [NSNumber numberWithUnsignedChar:cppValue];
+ return value;
+ }
case Attributes::GeneratedCommandList::Id: {
using TypeInfo = Attributes::GeneratedCommandList::TypeInfo;
TypeInfo::DecodableType cppValue;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
index 68d99cab53237f..2e6fc6dd0a061e 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
@@ -19017,6 +19017,24 @@ labels.
completion:(void (^)(NSNumber * _Nullable value,
NSError * _Nullable error))completion;
+- (void)readAttributeWriteOnlyInt8uWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion;
+- (void)writeAttributeWriteOnlyInt8uWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion;
+- (void)writeAttributeWriteOnlyInt8uWithValue:(NSNumber * _Nonnull)value
+ params:(MTRWriteParams * _Nullable)params
+ completion:(MTRStatusCompletion)completion;
+/**
+ * This API does not support setting autoResubscribe to NO in the
+ * MTRSubscribeParams.
+ */
+- (void)subscribeAttributeWriteOnlyInt8uWithParams:(MTRSubscribeParams *)params
+ subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
+ reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler;
++ (void)readAttributeWriteOnlyInt8uWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
+ endpoint:(NSNumber *)endpoint
+ queue:(dispatch_queue_t)queue
+ completion:
+ (void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion;
+
- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion;
/**
* This API does not support setting autoResubscribe to NO in the
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
index b03296b6272417..ca61f4e073a805 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
@@ -85853,6 +85853,106 @@ new MTRNullableInt16sAttributeCallbackBridge(queue, completion, ^(Cancelable * s
});
}
+- (void)readAttributeWriteOnlyInt8uWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
+{
+ new MTRInt8uAttributeCallbackBridge(self.callbackQueue, self.device, completion,
+ ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) {
+ using TypeInfo = TestCluster::Attributes::WriteOnlyInt8u::TypeInfo;
+ auto successFn = Callback::FromCancelable(success);
+ auto failureFn = Callback::FromCancelable(failure);
+ chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
+ return cppCluster.ReadAttribute(successFn->mContext, successFn->mCall, failureFn->mCall);
+ });
+}
+
+- (void)writeAttributeWriteOnlyInt8uWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion
+{
+ [self writeAttributeWriteOnlyInt8uWithValue:(NSNumber * _Nonnull) value params:nil completion:completion];
+}
+- (void)writeAttributeWriteOnlyInt8uWithValue:(NSNumber * _Nonnull)value
+ params:(MTRWriteParams * _Nullable)params
+ completion:(MTRStatusCompletion)completion
+{
+ // Make a copy of params before we go async.
+ params = [params copy];
+ value = [value copy];
+
+ new MTRDefaultSuccessCallbackBridge(
+ self.callbackQueue, self.device,
+ ^(id _Nullable ignored, NSError * _Nullable error) {
+ completion(error);
+ },
+ ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) {
+ chip::Optional timedWriteTimeout;
+ if (params != nil) {
+ if (params.timedWriteTimeout != nil) {
+ timedWriteTimeout.SetValue(params.timedWriteTimeout.unsignedShortValue);
+ }
+ }
+
+ ListFreer listFreer;
+ using TypeInfo = TestCluster::Attributes::WriteOnlyInt8u::TypeInfo;
+ TypeInfo::Type cppValue;
+ cppValue = value.unsignedCharValue;
+ auto successFn = Callback::FromCancelable(success);
+ auto failureFn = Callback::FromCancelable(failure);
+
+ chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
+ return cppCluster.WriteAttribute(
+ cppValue, successFn->mContext, successFn->mCall, failureFn->mCall, timedWriteTimeout);
+ });
+}
+
+- (void)subscribeAttributeWriteOnlyInt8uWithParams:(MTRSubscribeParams * _Nonnull)params
+ subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
+ reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler
+{
+ // Make a copy of params before we go async.
+ params = [params copy];
+ new MTRInt8uAttributeCallbackSubscriptionBridge(
+ self.callbackQueue, self.device, reportHandler,
+ ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) {
+ if (!params.autoResubscribe) {
+ // We don't support disabling auto-resubscribe.
+ return CHIP_ERROR_INVALID_ARGUMENT;
+ }
+ using TypeInfo = TestCluster::Attributes::WriteOnlyInt8u::TypeInfo;
+ auto successFn = Callback::FromCancelable(success);
+ auto failureFn = Callback::FromCancelable(failure);
+
+ chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
+ return cppCluster.SubscribeAttribute(successFn->mContext, successFn->mCall, failureFn->mCall,
+ [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+ MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.fabricFiltered,
+ params.keepPreviousSubscriptions);
+ },
+ subscriptionEstablished);
+}
+
++ (void)readAttributeWriteOnlyInt8uWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
+ endpoint:(NSNumber *)endpoint
+ queue:(dispatch_queue_t)queue
+ completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
+{
+ new MTRInt8uAttributeCallbackBridge(queue, completion, ^(Cancelable * success, Cancelable * failure) {
+ if (clusterStateCacheContainer.cppClusterStateCache) {
+ chip::app::ConcreteAttributePath path;
+ using TypeInfo = TestCluster::Attributes::WriteOnlyInt8u::TypeInfo;
+ path.mEndpointId = static_cast([endpoint unsignedShortValue]);
+ path.mClusterId = TypeInfo::GetClusterId();
+ path.mAttributeId = TypeInfo::GetAttributeId();
+ TypeInfo::DecodableType value;
+ CHIP_ERROR err = clusterStateCacheContainer.cppClusterStateCache->Get(path, value);
+ auto successFn = Callback::FromCancelable(success);
+ if (err == CHIP_NO_ERROR) {
+ successFn->mCall(successFn->mContext, value);
+ }
+ return err;
+ }
+ return CHIP_ERROR_NOT_FOUND;
+ });
+}
+
- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
{
new MTRTestClusterGeneratedCommandListListAttributeCallbackBridge(self.callbackQueue, self.device, completion,
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
index 4318c4fa50e459..2df9246dc8a98b 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
@@ -1445,6 +1445,7 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) {
MTRAttributeIDTypeClusterTestClusterAttributeNullableRangeRestrictedInt8sID = 0x00004027,
MTRAttributeIDTypeClusterTestClusterAttributeNullableRangeRestrictedInt16uID = 0x00004028,
MTRAttributeIDTypeClusterTestClusterAttributeNullableRangeRestrictedInt16sID = 0x00004029,
+ MTRAttributeIDTypeClusterTestClusterAttributeWriteOnlyInt8uID = 0x0000402A,
MTRAttributeIDTypeClusterTestClusterAttributeGeneratedCommandListID = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID,
MTRAttributeIDTypeClusterTestClusterAttributeAcceptedCommandListID = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID,
MTRAttributeIDTypeClusterTestClusterAttributeAttributeListID = MTRAttributeIDTypeGlobalAttributeAttributeListID,
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
index 32ca6ee39e5e48..2182161a4f13ac 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
@@ -5301,6 +5301,13 @@ labels.
expectedValueInterval:(NSNumber *)expectedValueIntervalMs
params:(MTRWriteParams * _Nullable)params;
+- (NSDictionary *)readAttributeWriteOnlyInt8uWithParams:(MTRReadParams * _Nullable)params;
+- (void)writeAttributeWriteOnlyInt8uWithValue:(NSDictionary *)dataValueDictionary
+ expectedValueInterval:(NSNumber *)expectedValueIntervalMs;
+- (void)writeAttributeWriteOnlyInt8uWithValue:(NSDictionary *)dataValueDictionary
+ expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+ params:(MTRWriteParams * _Nullable)params;
+
- (NSDictionary *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params;
- (NSDictionary *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
index 66ec9e6d9fe890..98f95c8899f820 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
@@ -22304,6 +22304,33 @@ - (void)writeAttributeNullableRangeRestrictedInt16sWithValue:(NSDictionary *)readAttributeWriteOnlyInt8uWithParams:(MTRReadParams * _Nullable)params
+{
+ return [self.device readAttributeWithEndpointID:@(_endpoint)
+ clusterID:@(MTRClusterIDTypeTestClusterID)
+ attributeID:@(MTRAttributeIDTypeClusterTestClusterAttributeWriteOnlyInt8uID)
+ params:params];
+}
+
+- (void)writeAttributeWriteOnlyInt8uWithValue:(NSDictionary *)dataValueDictionary
+ expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+{
+ [self writeAttributeWriteOnlyInt8uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
+}
+- (void)writeAttributeWriteOnlyInt8uWithValue:(NSDictionary *)dataValueDictionary
+ expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+ params:(MTRWriteParams * _Nullable)params
+{
+ NSNumber * timedWriteTimeout = params.timedWriteTimeout;
+
+ [self.device writeAttributeWithEndpointID:@(_endpoint)
+ clusterID:@(MTRClusterIDTypeTestClusterID)
+ attributeID:@(MTRAttributeIDTypeClusterTestClusterAttributeWriteOnlyInt8uID)
+ value:dataValueDictionary
+ expectedValueInterval:expectedValueIntervalMs
+ timedWriteTimeout:timedWriteTimeout];
+}
+
- (NSDictionary *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
return [self.device readAttributeWithEndpointID:@(_endpoint)
diff --git a/zzz_generated/all-clusters-app/zap-generated/endpoint_config.h b/zzz_generated/all-clusters-app/zap-generated/endpoint_config.h
index d2167954be34cd..31bf827df73545 100644
--- a/zzz_generated/all-clusters-app/zap-generated/endpoint_config.h
+++ b/zzz_generated/all-clusters-app/zap-generated/endpoint_config.h
@@ -369,7 +369,7 @@
#define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask
// This is an array of EmberAfAttributeMetadata structures.
-#define GENERATED_ATTRIBUTE_COUNT 717
+#define GENERATED_ATTRIBUTE_COUNT 718
#define GENERATED_ATTRIBUTES \
{ \
\
@@ -1429,7 +1429,9 @@
ZAP_MIN_MAX_DEFAULTS_INDEX(44) }, /* nullable_range_restricted_int16u */ \
{ 0x00004029, ZAP_TYPE(INT16S), 2, \
ZAP_ATTRIBUTE_MASK(MIN_MAX) | ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE), \
- ZAP_MIN_MAX_DEFAULTS_INDEX(45) }, /* nullable_range_restricted_int16s */ \
+ ZAP_MIN_MAX_DEFAULTS_INDEX(45) }, /* nullable_range_restricted_int16s */ \
+ { 0x0000402A, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) | ZAP_ATTRIBUTE_MASK(WRITABLE), \
+ ZAP_EMPTY_DEFAULT() }, /* write_only_int8u */ \
{ 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(0) }, /* FeatureMap */ \
{ 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(1) }, /* ClusterRevision */ \
\
@@ -2691,7 +2693,7 @@
/* Endpoint: 1, Cluster: Test Cluster (server) */ \
.clusterId = 0xFFF1FC05, \
.attributes = ZAP_ATTRIBUTE_INDEX(596), \
- .attributeCount = 82, \
+ .attributeCount = 83, \
.clusterSize = 2289, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
.functions = NULL, \
@@ -2701,7 +2703,7 @@
{ \
/* Endpoint: 2, Cluster: Groups (server) */ \
.clusterId = 0x00000004, \
- .attributes = ZAP_ATTRIBUTE_INDEX(678), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(679), \
.attributeCount = 3, \
.clusterSize = 7, \
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION), \
@@ -2712,7 +2714,7 @@
{ \
/* Endpoint: 2, Cluster: On/Off (server) */ \
.clusterId = 0x00000006, \
- .attributes = ZAP_ATTRIBUTE_INDEX(681), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(682), \
.attributeCount = 7, \
.clusterSize = 13, \
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION), \
@@ -2723,7 +2725,7 @@
{ \
/* Endpoint: 2, Cluster: Descriptor (server) */ \
.clusterId = 0x0000001D, \
- .attributes = ZAP_ATTRIBUTE_INDEX(688), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(689), \
.attributeCount = 6, \
.clusterSize = 4, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -2734,7 +2736,7 @@
{ \
/* Endpoint: 2, Cluster: Power Source (server) */ \
.clusterId = 0x0000002F, \
- .attributes = ZAP_ATTRIBUTE_INDEX(694), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(695), \
.attributeCount = 8, \
.clusterSize = 72, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -2745,7 +2747,7 @@
{ \
/* Endpoint: 2, Cluster: Occupancy Sensing (server) */ \
.clusterId = 0x00000406, \
- .attributes = ZAP_ATTRIBUTE_INDEX(702), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(703), \
.attributeCount = 5, \
.clusterSize = 9, \
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION), \
@@ -2756,7 +2758,7 @@
{ \
/* Endpoint: 65534, Cluster: Network Commissioning (server) */ \
.clusterId = 0x00000031, \
- .attributes = ZAP_ATTRIBUTE_INDEX(707), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(708), \
.attributeCount = 10, \
.clusterSize = 0, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
diff --git a/zzz_generated/app-common/app-common/zap-generated/attribute-id.h b/zzz_generated/app-common/app-common/zap-generated/attribute-id.h
index ab7abb68c6bc5c..8872d8decf56dd 100644
--- a/zzz_generated/app-common/app-common/zap-generated/attribute-id.h
+++ b/zzz_generated/app-common/app-common/zap-generated/attribute-id.h
@@ -1219,6 +1219,7 @@
#define ZCL_NULLABLE_RANGE_RESTRICTED_INT8S_ATTRIBUTE_ID (0x4027)
#define ZCL_NULLABLE_RANGE_RESTRICTED_INT16_U_ATTRIBUTE_ID (0x4028)
#define ZCL_NULLABLE_RANGE_RESTRICTED_INT16_S_ATTRIBUTE_ID (0x4029)
+#define ZCL_WRITE_ONLY_INT8_U_ATTRIBUTE_ID (0x402A)
// Attribute ids for cluster: Fault Injection
diff --git a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp
index 4cba25b122d69c..ec5fc6f0b6d990 100644
--- a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp
+++ b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp
@@ -30692,6 +30692,37 @@ EmberAfStatus Set(chip::EndpointId endpoint, const chip::app::DataModel::Nullabl
} // namespace NullableRangeRestrictedInt16s
+namespace WriteOnlyInt8u {
+
+EmberAfStatus Get(chip::EndpointId endpoint, uint8_t * value)
+{
+ using Traits = NumericAttributeTraits;
+ Traits::StorageType temp;
+ uint8_t * readable = Traits::ToAttributeStoreRepresentation(temp);
+ EmberAfStatus status = emberAfReadServerAttribute(endpoint, Clusters::TestCluster::Id, Id, readable, sizeof(temp));
+ VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, status);
+ if (!Traits::CanRepresentValue(/* isNullable = */ false, temp))
+ {
+ return EMBER_ZCL_STATUS_CONSTRAINT_ERROR;
+ }
+ *value = Traits::StorageToWorking(temp);
+ return status;
+}
+EmberAfStatus Set(chip::EndpointId endpoint, uint8_t value)
+{
+ using Traits = NumericAttributeTraits;
+ if (!Traits::CanRepresentValue(/* isNullable = */ false, value))
+ {
+ return EMBER_ZCL_STATUS_CONSTRAINT_ERROR;
+ }
+ Traits::StorageType storageValue;
+ Traits::WorkingToStorage(value, storageValue);
+ uint8_t * writable = Traits::ToAttributeStoreRepresentation(storageValue);
+ return emberAfWriteServerAttribute(endpoint, Clusters::TestCluster::Id, Id, writable, ZCL_INT8U_ATTRIBUTE_TYPE);
+}
+
+} // namespace WriteOnlyInt8u
+
namespace FeatureMap {
EmberAfStatus Get(chip::EndpointId endpoint, uint32_t * value)
diff --git a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h
index f4d9c7fea31405..c7543c2a5c9ff7 100644
--- a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h
+++ b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h
@@ -5097,6 +5097,11 @@ EmberAfStatus SetNull(chip::EndpointId endpoint);
EmberAfStatus Set(chip::EndpointId endpoint, const chip::app::DataModel::Nullable & value);
} // namespace NullableRangeRestrictedInt16s
+namespace WriteOnlyInt8u {
+EmberAfStatus Get(chip::EndpointId endpoint, uint8_t * value); // int8u
+EmberAfStatus Set(chip::EndpointId endpoint, uint8_t value);
+} // namespace WriteOnlyInt8u
+
namespace FeatureMap {
EmberAfStatus Get(chip::EndpointId endpoint, uint32_t * value); // bitmap32
EmberAfStatus Set(chip::EndpointId endpoint, uint32_t value);
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 c3e83283443daf..c265db1a4443fe 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
@@ -20762,6 +20762,9 @@ CHIP_ERROR TypeInfo::DecodableType::Decode(TLV::TLVReader & reader, const Concre
case Attributes::NullableRangeRestrictedInt16s::TypeInfo::GetAttributeId():
ReturnErrorOnFailure(DataModel::Decode(reader, nullableRangeRestrictedInt16s));
break;
+ case Attributes::WriteOnlyInt8u::TypeInfo::GetAttributeId():
+ ReturnErrorOnFailure(DataModel::Decode(reader, writeOnlyInt8u));
+ break;
case Attributes::GeneratedCommandList::TypeInfo::GetAttributeId():
ReturnErrorOnFailure(DataModel::Decode(reader, generatedCommandList));
break;
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 538709b05c8c09..38aa0198ee1a22 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
@@ -27868,6 +27868,18 @@ struct TypeInfo
static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace NullableRangeRestrictedInt16s
+namespace WriteOnlyInt8u {
+struct TypeInfo
+{
+ using Type = uint8_t;
+ using DecodableType = uint8_t;
+ using DecodableArgType = uint8_t;
+
+ static constexpr ClusterId GetClusterId() { return Clusters::TestCluster::Id; }
+ static constexpr AttributeId GetAttributeId() { return Attributes::WriteOnlyInt8u::Id; }
+ static constexpr bool MustUseTimedWrite() { return false; }
+};
+} // namespace WriteOnlyInt8u
namespace GeneratedCommandList {
struct TypeInfo : public Clusters::Globals::Attributes::GeneratedCommandList::TypeInfo
{
@@ -27992,6 +28004,7 @@ struct TypeInfo
Attributes::NullableRangeRestrictedInt8s::TypeInfo::DecodableType nullableRangeRestrictedInt8s;
Attributes::NullableRangeRestrictedInt16u::TypeInfo::DecodableType nullableRangeRestrictedInt16u;
Attributes::NullableRangeRestrictedInt16s::TypeInfo::DecodableType nullableRangeRestrictedInt16s;
+ Attributes::WriteOnlyInt8u::TypeInfo::DecodableType writeOnlyInt8u = static_cast(0);
Attributes::GeneratedCommandList::TypeInfo::DecodableType generatedCommandList;
Attributes::AcceptedCommandList::TypeInfo::DecodableType acceptedCommandList;
Attributes::AttributeList::TypeInfo::DecodableType attributeList;
diff --git a/zzz_generated/app-common/app-common/zap-generated/ids/Attributes.h b/zzz_generated/app-common/app-common/zap-generated/ids/Attributes.h
index 4ad8017f1f1101..d61a60453231ba 100644
--- a/zzz_generated/app-common/app-common/zap-generated/ids/Attributes.h
+++ b/zzz_generated/app-common/app-common/zap-generated/ids/Attributes.h
@@ -4932,6 +4932,10 @@ namespace NullableRangeRestrictedInt16s {
static constexpr AttributeId Id = 0x00004029;
} // namespace NullableRangeRestrictedInt16s
+namespace WriteOnlyInt8u {
+static constexpr AttributeId Id = 0x0000402A;
+} // namespace WriteOnlyInt8u
+
namespace GeneratedCommandList {
static constexpr AttributeId Id = Globals::Attributes::GeneratedCommandList::Id;
} // namespace GeneratedCommandList
diff --git a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
index 9994795a0ed905..40b1760e02ba07 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
@@ -7405,6 +7405,7 @@ class ElectricalMeasurementGetMeasurementProfileCommand : public ClusterCommand
| * NullableRangeRestrictedInt8s | 0x4027 |
| * NullableRangeRestrictedInt16u | 0x4028 |
| * NullableRangeRestrictedInt16s | 0x4029 |
+| * WriteOnlyInt8u | 0x402A |
| * GeneratedCommandList | 0xFFF8 |
| * AcceptedCommandList | 0xFFF9 |
| * AttributeList | 0xFFFB |
@@ -13034,6 +13035,7 @@ void registerClusterTestCluster(Commands & commands, CredentialIssuerCommands *
credsIssuerConfig), //
make_unique(Id, "nullable-range-restricted-int16s", Attributes::NullableRangeRestrictedInt16s::Id,
credsIssuerConfig), //
+ make_unique(Id, "write-only-int8u", Attributes::WriteOnlyInt8u::Id, credsIssuerConfig), //
make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), //
make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), //
make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), //
@@ -13189,7 +13191,9 @@ void registerClusterTestCluster(Commands & commands, CredentialIssuerCommands *
credsIssuerConfig), //
make_unique>>(
Id, "nullable-range-restricted-int16s", INT16_MIN, INT16_MAX, Attributes::NullableRangeRestrictedInt16s::Id,
- credsIssuerConfig), //
+ credsIssuerConfig), //
+ make_unique>(Id, "write-only-int8u", 0, UINT8_MAX, Attributes::WriteOnlyInt8u::Id,
+ credsIssuerConfig), //
make_unique(Id, credsIssuerConfig), //
make_unique(Id, "boolean", Attributes::Boolean::Id, credsIssuerConfig), //
make_unique(Id, "bitmap8", Attributes::Bitmap8::Id, credsIssuerConfig), //
@@ -13278,6 +13282,7 @@ void registerClusterTestCluster(Commands & commands, CredentialIssuerCommands *
credsIssuerConfig), //
make_unique(Id, "nullable-range-restricted-int16s", Attributes::NullableRangeRestrictedInt16s::Id,
credsIssuerConfig), //
+ make_unique(Id, "write-only-int8u", Attributes::WriteOnlyInt8u::Id, credsIssuerConfig), //
make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), //
make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), //
make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), //
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 d4ac2c0dac24d2..05a186b290df5b 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
+++ b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
@@ -9974,6 +9974,11 @@ CHIP_ERROR DataModelLogger::LogAttribute(const chip::app::ConcreteDataAttributeP
ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
return DataModelLogger::LogValue("nullable_range_restricted_int16s", 1, value);
}
+ case TestCluster::Attributes::WriteOnlyInt8u::Id: {
+ uint8_t value;
+ ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
+ return DataModelLogger::LogValue("write_only_int8u", 1, value);
+ }
case TestCluster::Attributes::GeneratedCommandList::Id: {
chip::app::DataModel::DecodableList value;
ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
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 cc9a85648ea956..b9dd1e684a1676 100644
--- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
@@ -82544,6 +82544,7 @@ class SubscribeAttributeElectricalMeasurementClusterRevision : public SubscribeA
| * NullableRangeRestrictedInt8s | 0x4027 |
| * NullableRangeRestrictedInt16u | 0x4028 |
| * NullableRangeRestrictedInt16s | 0x4029 |
+| * WriteOnlyInt8u | 0x402A |
| * GeneratedCommandList | 0xFFF8 |
| * AcceptedCommandList | 0xFFF9 |
| * AttributeList | 0xFFFB |
@@ -93110,6 +93111,113 @@ class SubscribeAttributeTestClusterNullableRangeRestrictedInt16s : public Subscr
}
};
+/*
+ * Attribute WriteOnlyInt8u
+ */
+class ReadTestClusterWriteOnlyInt8u : public ReadAttribute {
+public:
+ ReadTestClusterWriteOnlyInt8u()
+ : ReadAttribute("write-only-int8u")
+ {
+ }
+
+ ~ReadTestClusterWriteOnlyInt8u() {}
+
+ CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override
+ {
+ ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000402A) on endpoint %u", endpointId);
+
+ dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
+ __auto_type * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
+ endpoint:@(endpointId)
+ queue:callbackQueue];
+ [cluster readAttributeWriteOnlyInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
+ NSLog(@"TestCluster.WriteOnlyInt8u response %@", [value description]);
+ if (error != nil) {
+ LogNSError("TestCluster WriteOnlyInt8u read Error", error);
+ }
+ SetCommandExitStatus(error);
+ }];
+ return CHIP_NO_ERROR;
+ }
+};
+
+class WriteTestClusterWriteOnlyInt8u : public WriteAttribute {
+public:
+ WriteTestClusterWriteOnlyInt8u()
+ : WriteAttribute("write-only-int8u")
+ {
+ AddArgument("attr-name", "write-only-int8u");
+ AddArgument("attr-value", 0, UINT8_MAX, &mValue);
+ WriteAttribute::AddArguments();
+ }
+
+ ~WriteTestClusterWriteOnlyInt8u() {}
+
+ CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override
+ {
+ ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000402A) on endpoint %u", endpointId);
+ dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
+ __auto_type * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
+ endpoint:@(endpointId)
+ queue:callbackQueue];
+ __auto_type * params = [[MTRWriteParams alloc] init];
+ params.timedWriteTimeout
+ = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
+ params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
+ NSNumber * _Nonnull value = [NSNumber numberWithUnsignedChar:mValue];
+
+ [cluster writeAttributeWriteOnlyInt8uWithValue:value
+ params:params
+ completion:^(NSError * _Nullable error) {
+ if (error != nil) {
+ LogNSError("TestCluster WriteOnlyInt8u write Error", error);
+ }
+ SetCommandExitStatus(error);
+ }];
+ return CHIP_NO_ERROR;
+ }
+
+private:
+ uint8_t mValue;
+};
+
+class SubscribeAttributeTestClusterWriteOnlyInt8u : public SubscribeAttribute {
+public:
+ SubscribeAttributeTestClusterWriteOnlyInt8u()
+ : SubscribeAttribute("write-only-int8u")
+ {
+ }
+
+ ~SubscribeAttributeTestClusterWriteOnlyInt8u() {}
+
+ CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override
+ {
+ ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000402A) on endpoint %u", endpointId);
+ dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
+ __auto_type * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
+ endpoint:@(endpointId)
+ queue:callbackQueue];
+ __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+ if (mKeepSubscriptions.HasValue()) {
+ params.keepPreviousSubscriptions = mKeepSubscriptions.Value();
+ }
+ if (mFabricFiltered.HasValue()) {
+ params.fabricFiltered = mFabricFiltered.Value();
+ }
+ [cluster subscribeAttributeWriteOnlyInt8uWithParams:params
+ subscriptionEstablished:^() {
+ mSubscriptionEstablished = YES;
+ }
+ reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
+ NSLog(@"TestCluster.WriteOnlyInt8u response %@", [value description]);
+ SetCommandExitStatus(error);
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+};
+
/*
* Attribute GeneratedCommandList
*/
@@ -96991,6 +97099,9 @@ void registerClusterTestCluster(Commands & commands)
make_unique(), //
make_unique(), //
make_unique(), //
+ make_unique(), //
+ make_unique(), //
+ make_unique(), //
make_unique(), //
make_unique(), //
make_unique(), //