From 7474613bb45aef315a9f1bcc462222bb2e568c42 Mon Sep 17 00:00:00 2001 From: lpbeliveau-silabs <112982107+lpbeliveau-silabs@users.noreply.github.com> Date: Fri, 26 May 2023 20:59:02 -0400 Subject: [PATCH] Refactored yaml tests for Test_TC_S_2_1..4 (#26459) * Resolving conflicts to rebase onto master * Reverted files creating problems * Added manual configuration options for AC and now getting the capacity from the maximum number of scenes on DUT. * Reverted or condition on StoreScene test allowing INSUFFICIENT SPACE, not currently allowing it. Added check on RecallScene return where expected, updated 2_3 and 2_4 to hybrid between automated and manual per app tests * Restyled by whitespace * Restyled by prettier-yaml * Added anyOf to check wether 0x00 or 0x89 was returned for store scenes commands where it was accepted * Restyled by whitespace * Restyled by prettier-yaml * Reverted runIf, anyOf and UnsignedNumberEquals commands for now until the new test backend is implemented. * Resolved conflicts for : Modified AttribueValue in Scenes::AttributeValuePair to now be a uint32_t according to upcoming spec change * Restyled by prettier-yaml * Refactored tests and SceneTable default handlers to the uint32_t type for the AttributePairValue * Regenerated zap files for all-cluster apps * Regenerated zap files for chip-tool * Applied corrections to 2_4 to follo test plan * Restyled by whitespace * Restyled by prettier-yaml * Apply suggestions from code review Co-authored-by: Boris Zbarsky * Added missing checks, modified wrong description to match test plan * Restyled by whitespace * Restyled by prettier-yaml * Regenerated after rebase * Added variable for G1 in Test_TC_s_2_3, changed GroupKeySecurityPolocy to 0 in 2.2 and 2.3 and removed Scene 0x03 from firt scene membership response in 2.3 * Applied restyler * Restyled by prettier-yaml --------- Co-authored-by: Restyled.io Co-authored-by: Boris Zbarsky --- .../all-clusters-app.matter | 8 +- .../all-clusters-common/all-clusters-app.zap | 48 + .../all-clusters-minimal-app.matter | 8 +- .../all-clusters-minimal-app.zap | 48 + .../light-switch-app.matter | 4 +- .../placeholder/linux/apps/app1/config.matter | 2 +- .../placeholder/linux/apps/app2/config.matter | 2 +- .../thermostat-common/thermostat.matter | 2 +- examples/window-app/common/window-app.matter | 2 +- src/app/clusters/scenes/SceneTableImpl.h | 44 +- src/app/tests/TestSceneTable.cpp | 50 +- src/app/tests/suites/certification/PICS.yaml | 6 + .../suites/certification/Test_TC_S_2_1.yaml | 109 +- .../suites/certification/Test_TC_S_2_2.yaml | 937 +++++- .../suites/certification/Test_TC_S_2_3.yaml | 597 +++- .../suites/certification/Test_TC_S_2_4.yaml | 414 +++ .../tests/suites/certification/ci-pics-values | 2 + src/app/tests/suites/manualTests.json | 1 + .../zcl/data-model/chip/scene.xml | 8 +- .../data_model/controller-clusters.matter | 4 +- .../devicecontroller/ClusterIDMapping.java | 2 + .../devicecontroller/ClusterReadMapping.java | 22 + .../CHIPAttributeTLVValueDecoder.cpp | 30 + .../zap-generated/CHIPInvokeCallbacks.cpp | 40 +- .../chip/devicecontroller/ChipClusters.java | 30 + .../chip/devicecontroller/ChipIdLookup.java | 6 + .../chip/devicecontroller/ChipStructs.java | 5 +- .../python/chip/clusters/CHIPClusters.py | 12 + .../python/chip/clusters/Objects.py | 40 +- .../MTRAttributeSpecifiedCheck.mm | 6 + .../MTRAttributeTLVValueDecoder.mm | 22 + .../CHIP/zap-generated/MTRBaseClusters.h | 24 + .../CHIP/zap-generated/MTRBaseClusters.mm | 137 +- .../CHIP/zap-generated/MTRClusterConstants.h | 2 + .../CHIP/zap-generated/MTRClusters.h | 4 + .../CHIP/zap-generated/MTRClusters.mm | 68 +- .../zap-generated/MTRCommandPayloadsObjc.mm | 32 +- .../CHIP/zap-generated/MTRStructsObjc.h | 2 +- .../CHIP/zap-generated/MTRStructsObjc.mm | 2 +- .../zap-generated/attributes/Accessors.cpp | 62 + .../zap-generated/attributes/Accessors.h | 10 + .../zap-generated/cluster-objects.cpp | 6 + .../zap-generated/cluster-objects.h | 41 +- .../app-common/zap-generated/ids/Attributes.h | 8 + .../zap-generated/cluster/Commands.h | 10 + .../cluster/logging/DataModelLogger.cpp | 10 + .../chip-tool/zap-generated/test/Commands.h | 2545 ++++++++++++++++- .../zap-generated/cluster/Commands.h | 158 +- 48 files changed, 5107 insertions(+), 525 deletions(-) create mode 100644 src/app/tests/suites/certification/Test_TC_S_2_4.yaml 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 0cd7708285ae79..913d86d67dbfbf 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 @@ -138,7 +138,7 @@ server cluster Scenes = 5 { struct AttributeValuePair { optional attrib_id attributeID = 0; - int8u attributeValue[] = 1; + int32u attributeValue = 1; } struct ExtensionFieldSet { @@ -151,6 +151,9 @@ server cluster Scenes = 5 { readonly attribute group_id currentGroup = 2; readonly attribute boolean sceneValid = 3; readonly attribute bitmap8 nameSupport = 4; + readonly attribute nullable node_id lastConfiguredBy = 5; + readonly attribute int16u sceneTableSize = 6; + readonly attribute int8u remainingCapacity = 7; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -5048,6 +5051,9 @@ endpoint 1 { ram attribute currentGroup default = 0x0000; ram attribute sceneValid default = 0x00; ram attribute nameSupport; + ram attribute lastConfiguredBy; + ram attribute sceneTableSize; + ram attribute remainingCapacity; ram attribute featureMap default = 0; ram attribute clusterRevision default = 4; } 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 310a5e6b0a8797..a0b8b9b9c95682 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 @@ -9532,6 +9532,54 @@ "maxInterval": 65344, "reportableChange": 0 }, + { + "name": "LastConfiguredBy", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "node_id", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SceneTableSize", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "RemainingCapacity", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "FeatureMap", "code": 65532, diff --git a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter index 02bd957ba4145c..07f74cdb9e7b77 100644 --- a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter +++ b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter @@ -132,7 +132,7 @@ server cluster Scenes = 5 { struct AttributeValuePair { optional attrib_id attributeID = 0; - int8u attributeValue[] = 1; + int32u attributeValue = 1; } struct ExtensionFieldSet { @@ -145,6 +145,9 @@ server cluster Scenes = 5 { readonly attribute group_id currentGroup = 2; readonly attribute boolean sceneValid = 3; readonly attribute bitmap8 nameSupport = 4; + readonly attribute nullable node_id lastConfiguredBy = 5; + readonly attribute int16u sceneTableSize = 6; + readonly attribute int8u remainingCapacity = 7; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -4171,6 +4174,9 @@ endpoint 1 { ram attribute currentGroup default = 0x0000; ram attribute sceneValid default = 0x00; ram attribute nameSupport; + ram attribute lastConfiguredBy; + ram attribute sceneTableSize; + ram attribute remainingCapacity; ram attribute featureMap default = 0; ram attribute clusterRevision default = 4; } diff --git a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap index ad57bb3ccb1c7e..b02e910590df29 100644 --- a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap +++ b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap @@ -9003,6 +9003,54 @@ "maxInterval": 65344, "reportableChange": 0 }, + { + "name": "LastConfiguredBy", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "node_id", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SceneTableSize", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "RemainingCapacity", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "FeatureMap", "code": 65532, diff --git a/examples/light-switch-app/light-switch-common/light-switch-app.matter b/examples/light-switch-app/light-switch-common/light-switch-app.matter index 83f73393327354..5159a1b6b2f60d 100644 --- a/examples/light-switch-app/light-switch-common/light-switch-app.matter +++ b/examples/light-switch-app/light-switch-common/light-switch-app.matter @@ -186,7 +186,7 @@ client cluster Scenes = 5 { struct AttributeValuePair { optional attrib_id attributeID = 0; - int8u attributeValue[] = 1; + int32u attributeValue = 1; } struct ExtensionFieldSet { @@ -200,6 +200,8 @@ client cluster Scenes = 5 { readonly attribute boolean sceneValid = 3; readonly attribute bitmap8 nameSupport = 4; readonly attribute optional nullable node_id lastConfiguredBy = 5; + readonly attribute int16u sceneTableSize = 6; + readonly attribute int8u remainingCapacity = 7; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; diff --git a/examples/placeholder/linux/apps/app1/config.matter b/examples/placeholder/linux/apps/app1/config.matter index b7b0c5fbd4151d..bffde23c79ead7 100644 --- a/examples/placeholder/linux/apps/app1/config.matter +++ b/examples/placeholder/linux/apps/app1/config.matter @@ -138,7 +138,7 @@ server cluster Scenes = 5 { struct AttributeValuePair { optional attrib_id attributeID = 0; - int8u attributeValue[] = 1; + int32u attributeValue = 1; } struct ExtensionFieldSet { diff --git a/examples/placeholder/linux/apps/app2/config.matter b/examples/placeholder/linux/apps/app2/config.matter index 0f3d9c42f424b1..3043fa328c04be 100644 --- a/examples/placeholder/linux/apps/app2/config.matter +++ b/examples/placeholder/linux/apps/app2/config.matter @@ -138,7 +138,7 @@ server cluster Scenes = 5 { struct AttributeValuePair { optional attrib_id attributeID = 0; - int8u attributeValue[] = 1; + int32u attributeValue = 1; } struct ExtensionFieldSet { diff --git a/examples/thermostat/thermostat-common/thermostat.matter b/examples/thermostat/thermostat-common/thermostat.matter index a314a026656bec..e8dd4cb1fb3cfa 100644 --- a/examples/thermostat/thermostat-common/thermostat.matter +++ b/examples/thermostat/thermostat-common/thermostat.matter @@ -186,7 +186,7 @@ server cluster Scenes = 5 { struct AttributeValuePair { optional attrib_id attributeID = 0; - int8u attributeValue[] = 1; + int32u attributeValue = 1; } struct ExtensionFieldSet { diff --git a/examples/window-app/common/window-app.matter b/examples/window-app/common/window-app.matter index 9b19d19aba3980..a2bffdc911cc30 100644 --- a/examples/window-app/common/window-app.matter +++ b/examples/window-app/common/window-app.matter @@ -138,7 +138,7 @@ server cluster Scenes = 5 { struct AttributeValuePair { optional attrib_id attributeID = 0; - int8u attributeValue[] = 1; + int32u attributeValue = 1; } struct ExtensionFieldSet { diff --git a/src/app/clusters/scenes/SceneTableImpl.h b/src/app/clusters/scenes/SceneTableImpl.h index c0453b5e9da58d..d601e607dac39d 100644 --- a/src/app/clusters/scenes/SceneTableImpl.h +++ b/src/app/clusters/scenes/SceneTableImpl.h @@ -64,24 +64,9 @@ class DefaultSceneHandlerImpl : public scenes::SceneHandler auto pair_iterator = extensionFieldSet.attributeValueList.begin(); while (pair_iterator.Next()) { - aVPair = pair_iterator.GetValue(); - mAVPairs[pairCount].attributeID = aVPair.attributeID; - size_t valueBytesTotal = 0; - uint8_t valueBytesCount = 0; - - ReturnErrorOnFailure(aVPair.attributeValue.ComputeSize(&valueBytesTotal)); - VerifyOrReturnError(valueBytesTotal <= ArraySize(mValueBuffer[0]), CHIP_ERROR_BUFFER_TOO_SMALL); - - auto value_iterator = aVPair.attributeValue.begin(); - while (value_iterator.Next()) - { - mValueBuffer[pairCount][valueBytesCount] = value_iterator.GetValue(); - valueBytesCount++; - } - ReturnErrorOnFailure(value_iterator.GetStatus()); - - mAVPairs[pairCount].attributeValue = mValueBuffer[pairCount]; - mAVPairs[pairCount].attributeValue.reduce_size(valueBytesCount); + aVPair = pair_iterator.GetValue(); + mAVPairs[pairCount].attributeID = aVPair.attributeID; + mAVPairs[pairCount].attributeValue = aVPair.attributeValue; pairCount++; } ReturnErrorOnFailure(pair_iterator.GetStatus()); @@ -132,25 +117,9 @@ class DefaultSceneHandlerImpl : public scenes::SceneHandler auto pair_iterator = attributeValueList.begin(); while (pair_iterator.Next()) { - decodePair = pair_iterator.GetValue(); - mAVPairs[pairCount].attributeID = decodePair.attributeID; - size_t valueBytesTotal = 0; - uint8_t valueBytesCount = 0; - - // Verify size of attribute value - ReturnErrorOnFailure(decodePair.attributeValue.ComputeSize(&valueBytesTotal)); - VerifyOrReturnError(valueBytesTotal <= ArraySize(mValueBuffer[0]), CHIP_ERROR_BUFFER_TOO_SMALL); - - auto value_iterator = decodePair.attributeValue.begin(); - while (value_iterator.Next()) - { - mValueBuffer[pairCount][valueBytesCount] = value_iterator.GetValue(); - valueBytesCount++; - } - ReturnErrorOnFailure(value_iterator.GetStatus()); - - mAVPairs[pairCount].attributeValue = mValueBuffer[pairCount]; - mAVPairs[pairCount].attributeValue.reduce_size(valueBytesCount); + decodePair = pair_iterator.GetValue(); + mAVPairs[pairCount].attributeID = decodePair.attributeID; + mAVPairs[pairCount].attributeValue = decodePair.attributeValue; pairCount++; }; ReturnErrorOnFailure(pair_iterator.GetStatus()); @@ -164,7 +133,6 @@ class DefaultSceneHandlerImpl : public scenes::SceneHandler private: app::Clusters::Scenes::Structs::AttributeValuePair::Type mAVPairs[kMaxAvPair]; - uint8_t mValueBuffer[kMaxAvPair][kMaxValueSize]; }; /** diff --git a/src/app/tests/TestSceneTable.cpp b/src/app/tests/TestSceneTable.cpp index c4e09b2b83e3e1..82f11edef04fa6 100644 --- a/src/app/tests/TestSceneTable.cpp +++ b/src/app/tests/TestSceneTable.cpp @@ -466,23 +466,20 @@ void TestHandlerFunctions(nlTestSuite * aSuite, void * aContext) TLV::TLVType outer; TLV::TLVType outerRead; - static const uint8_t OO_av_payload[1] = { 0x01 }; - static const uint8_t LC_av_payload[2][2] = { { 0x40, 0x00 }, { 0x01, 0xF0 } }; - static const uint8_t CC_av_payload[8][2] = { { 0x00, 0x00 }, { 0x00, 0x00 }, { 0x00, 0x00 }, { 0x00, 0x00 }, - { 0x00, 0x00 }, { 0x00, 0x00 }, { 0x00, 0x00 }, { 0x00, 0x00 } }; + static const uint8_t OO_av_payload = 0x01; + static const uint16_t LC_av_payload[2] = { 0x64, 0x01F0 }; + static const uint16_t CC_av_payload[8] = { 0 }; OOPairs[0].attributeID.SetValue(kOnOffAttId); OOPairs[0].attributeValue = OO_av_payload; LCPairs[0].attributeID.SetValue(kCurrentLevelId); LCPairs[0].attributeValue = LC_av_payload[0]; - LCPairs[0].attributeValue.reduce_size(1); LCPairs[1].attributeID.SetValue(kCurrentFrequencyId); LCPairs[1].attributeValue = LC_av_payload[1]; CCPairs[0].attributeID.SetValue(kCurrentSaturationId); CCPairs[0].attributeValue = CC_av_payload[0]; - CCPairs[0].attributeValue.reduce_size(1); CCPairs[1].attributeID.SetValue(kCurrentXId); CCPairs[1].attributeValue = CC_av_payload[1]; CCPairs[2].attributeID.SetValue(kCurrentYId); @@ -493,10 +490,8 @@ void TestHandlerFunctions(nlTestSuite * aSuite, void * aContext) CCPairs[4].attributeValue = CC_av_payload[4]; CCPairs[5].attributeID.SetValue(kColorLoopActiveId); CCPairs[5].attributeValue = CC_av_payload[5]; - CCPairs[5].attributeValue.reduce_size(1); CCPairs[6].attributeID.SetValue(kColorLoopDirectionId); CCPairs[6].attributeValue = CC_av_payload[6]; - CCPairs[6].attributeValue.reduce_size(1); CCPairs[7].attributeID.SetValue(kColorLoopTimeId); CCPairs[7].attributeValue = CC_av_payload[7]; @@ -658,21 +653,17 @@ void TestHandlerFunctions(nlTestSuite * aSuite, void * aContext) app::Clusters::Scenes::Structs::ExtensionFieldSet::Type extensionFieldFailTestOut; app::Clusters::Scenes::Structs::ExtensionFieldSet::DecodableType extensionFieldFailTestIn; app::Clusters::Scenes::Structs::AttributeValuePair::Type TooManyPairs[16]; - app::Clusters::Scenes::Structs::AttributeValuePair::Type TooManyBytesPairs[1]; TLV::TLVType failWrite; TLV::TLVType failRead; - uint8_t payloadOk[1] = { 0 }; - uint8_t payloadTooBig[5] = { 0 }; + uint8_t payloadOk = 0; for (uint8_t i = 0; i < 16; i++) { TooManyPairs[i].attributeValue = payloadOk; } - TooManyBytesPairs[0].attributeValue = payloadTooBig; - extensionFieldFailTestOut.clusterID = kColorControlClusterId; extensionFieldFailTestOut.attributeValueList = TooManyPairs; @@ -708,39 +699,6 @@ void TestHandlerFunctions(nlTestSuite * aSuite, void * aContext) memset(failBuffer, 0, fail_list.size()); memset(buffer, 0, buff_span.size()); - - extensionFieldFailTestOut.clusterID = kColorControlClusterId; - extensionFieldFailTestOut.attributeValueList = TooManyBytesPairs; - - // Serialize Extension Field sets as if they were recovered from memory - writer.Init(failBuffer); - writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, failWrite); - NL_TEST_ASSERT(aSuite, - CHIP_NO_ERROR == - app::DataModel::Encode(writer, - TLV::ContextTag(to_underlying( - app::Clusters::Scenes::Structs::ExtensionFieldSet::Fields::kAttributeValueList)), - extensionFieldFailTestOut.attributeValueList)); - writer.EndContainer(failWrite); - - // Setup the On Off Extension field set in the expected state from a command - reader.Init(fail_list); - extensionFieldFailTestIn.clusterID = kColorControlClusterId; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == reader.Next()); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == reader.EnterContainer(failRead)); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == reader.Next()); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == extensionFieldFailTestIn.attributeValueList.Decode(reader)); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == reader.ExitContainer(failRead)); - - // Verify failure on both serialize and deserialize - NL_TEST_ASSERT(aSuite, - CHIP_ERROR_BUFFER_TOO_SMALL == sHandler.SerializeAdd(kTestEndpoint1, extensionFieldFailTestIn, buff_span)); - NL_TEST_ASSERT(aSuite, - CHIP_ERROR_BUFFER_TOO_SMALL == - sHandler.Deserialize(kTestEndpoint1, kColorControlClusterId, fail_list, extensionFieldFailTestOut)); - - memset(failBuffer, 0, fail_list.size()); - memset(buffer, 0, buff_span.size()); }; void TestStoreScenes(nlTestSuite * aSuite, void * aContext) diff --git a/src/app/tests/suites/certification/PICS.yaml b/src/app/tests/suites/certification/PICS.yaml index 56aea7c1c2416d..98049533f8ec8f 100644 --- a/src/app/tests/suites/certification/PICS.yaml +++ b/src/app/tests/suites/certification/PICS.yaml @@ -5585,6 +5585,12 @@ PICS: - label: "Does the device implement the LastConfiguredBy attribute?" id: S.S.A0005 + - label: "Does the device implement the SceneTableSize attribute?" + id: S.S.A0006 + + - label: "Does the device implement the RemainingCapacity attribute?" + id: S.S.A0007 + # # server / commandsReceived # diff --git a/src/app/tests/suites/certification/Test_TC_S_2_1.yaml b/src/app/tests/suites/certification/Test_TC_S_2_1.yaml index 950ccb32380c94..31d1618c7061ba 100644 --- a/src/app/tests/suites/certification/Test_TC_S_2_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_S_2_1.yaml @@ -22,45 +22,88 @@ PICS: config: nodeId: 0x12344321 - cluster: "Basic Information" - endpoint: 0 + cluster: "Scenes" + endpoint: 1 tests: - - label: "Commission DUT to TH" - verification: | + - label: "Wait for the commissioned device to be retrieved" + cluster: "DelayCommands" + command: "WaitForCommissionee" + arguments: + values: + - name: "nodeId" + value: nodeId - disabled: true + - label: "TH reads from the DUT the (0x0000) SceneCount attribute" + PICS: S.S.A0000 + command: "readAttribute" + attribute: "SceneCount" + response: + constraints: + type: int8u - - label: "TH reads all mandatory attributes from DUT one at a time." - verification: | - The data type in each command must match the value listed in the specification(s). The data value in each command for the attribute must fall within the valid range described in the specification(s). - disabled: true + - label: "TH reads from the DUT the (0x0001) CurrentScene attribute" + PICS: S.S.A0001 + command: "readAttribute" + attribute: "CurrentScene" + response: + constraints: + type: int8u - - label: - "TH writes the respective default value to all mandatory attributes to - DUT one at a time." - verification: | - If the access control of DUT is set to READ, the DUT response will indicate that the attribute write command was not a SUCCESS. If the access control of DUT is set to READ/WRITE, the DUT response will indicate that the write command was a SUCCESS. - disabled: true + - label: "TH reads from the DUT the (0x0002) CurrentGroup attribute" + PICS: S.S.A0002 + command: "readAttribute" + attribute: "CurrentGroup" + response: + constraints: + type: groupid - - label: "TH reads back all attributes written in step 3a." - verification: | - If the Status field of the write attributes response command frame was equal to SUCCESS, the updated value is read back. If the Status field of the write attributes response command frame was not equal to SUCCESS the value is not updated when read back. - disabled: true + - label: "TH reads from the DUT the (0x0003) SceneValid attribute" + PICS: S.S.A0003 + command: "readAttribute" + attribute: "SceneValid" + response: + constraints: + type: uint8 - - label: "TH reads each optional attributes from DUT one at a time." - verification: | - If the DUT implements the attribute, the Status field will be equal to SUCCESS and the command will contain the requested attribute. If the DUT does not implement the attribute, the Status field will not be equal to SUCCESS. The data type in each command must match the value listed in the specification(s). The data value in each command for the attribute must fall within the valid range described in the specification(s). - disabled: true + - label: "TH reads from the DUT the (0x0004) NameSupport attribute" + PICS: S.S.A0003 && S.S.F00 + command: "readAttribute" + attribute: "NameSupport" + response: + value: 0x80 + constraints: + type: uint8 - - label: - "TH writes the respective default value to each optional attributes to - DUT one at a time." - verification: | - If the attribute is not implemented or the access control of DUT is set to READ, the DUT response will indicate that the attribute write command was not a SUCCESS. If the attribute is implemented and the access control of DUT is set to READ/WRITE, the DUT response will indicate that the write command was a SUCCESS. - disabled: true + - label: "TH reads from the DUT the (0x0004) NameSupport attribute" + PICS: S.S.A0004 && (!S.S.F00) + command: "readAttribute" + attribute: "NameSupport" + response: + value: 0x00 + constraints: + type: uint8 - - label: "TH reads back all attributes written in step 5a." - verification: | - If the Status field of the write attributes response command frame was equal to SUCCESS, the updated value is read back. If the Status field of the write attributes response command frame was not equal to SUCCESS the value is not updated when read back. - disabled: true + - label: "TH reads from the DUT the (0x0005) LastConfiguredBy attribute" + PICS: S.S.A0005 + command: "readAttribute" + attribute: "LastConfiguredBy" + response: + constraints: + type: nodeId + + - label: "TH reads from the DUT the (0x0006) SceneTableSize attribute" + PICS: S.S.A0006 + command: "readAttribute" + attribute: "SceneTableSize" + response: + constraints: + type: uint16 + + - label: "TH reads from the DUT the (0x0007) RemainingCapacity attribute" + PICS: S.S.A0007 + command: "readAttribute" + attribute: "RemainingCapacity" + response: + constraints: + type: uint8 diff --git a/src/app/tests/suites/certification/Test_TC_S_2_2.yaml b/src/app/tests/suites/certification/Test_TC_S_2_2.yaml index 651a61c2a4d8f4..52143ae602f2e0 100644 --- a/src/app/tests/suites/certification/Test_TC_S_2_2.yaml +++ b/src/app/tests/suites/certification/Test_TC_S_2_2.yaml @@ -20,273 +20,980 @@ PICS: config: nodeId: 0x12344321 - cluster: "Basic Information" - endpoint: 0 + cluster: "Scenes" + endpoint: 1 tests: + - label: "Wait for the commissioned device to be retrieved" + cluster: "DelayCommands" + command: "WaitForCommissionee" + arguments: + values: + - name: "nodeId" + value: nodeId + - label: "TH sends a RemoveAllGroups command to DUT." PICS: G.S.C04.Rsp - verification: | - If a status response is expected, DUT sends a response to TH with the Status field equal to 0x00 (SUCCESS). - disabled: true - - - label: - "preparation step for using commands from Groups cluster: TH generates - fabric-unique GroupID, GroupName, random key, EpochKey0 and - GroupKeySetID. TH sets GroupKeySecurityPolicy = TrustFirst (1) - GroupKeyMulticastPolicy = PerGroupID (0) EpochStartTime0 = 0" - verification: | - - disabled: true + cluster: "Groups" + endpoint: "1" + command: "RemoveAllGroups" + + - label: "TH reads from the DUT the (0x0006) SceneTableSize attribute" + PICS: S.S.A0006 + command: "readAttribute" + attribute: "SceneTableSize" + response: + values: + - name: "SceneTableSize" + saveAs: maxScenes + constraints: + type: uint16 + + - label: + "preparation step for using commands from Groups cluster: Add KeySet" + cluster: "Group Key Management" + endpoint: 0 + command: "KeySetWrite" + arguments: + values: + - name: "GroupKeySet" + value: + { + GroupKeySetID: 0x01a1, + GroupKeySecurityPolicy: 0, + EpochKey0: "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf", + EpochStartTime0: 0, + EpochKey1: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf", + EpochStartTime1: 0, + EpochKey2: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf", + EpochStartTime2: 0, + } + + - label: + "Preparation step for using commands from Groups cluster: Write Group + Keys" + cluster: "Group Key Management" + endpoint: 0 + command: "writeAttribute" + attribute: "GroupKeyMap" + arguments: + value: + [ + { FabricIndex: 1, GroupId: 0x0001, GroupKeySetID: 0x01a1 }, + { FabricIndex: 1, GroupId: 0x0002, GroupKeySetID: 0x01a1 }, + ] - label: "TH sends a AddGroup command to DUT with the GroupID field set to 0x0001." PICS: G.S.C00.Rsp - verification: | - DUT sends a AddGroupResponse command to TH with the Status field set to 0x00 (SUCCESS) and the GroupID field set to 0x0001. - disabled: true + cluster: "Groups" + command: "AddGroup" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "GroupName" + value: "Group1" + response: + values: + - name: "Status" + value: 0 + - name: "GroupID" + value: 0x0001 - label: "TH sends a RemoveAllScenes command to DUT with the GroupID field set to 0x0001." PICS: S.S.C03.Rsp - verification: | - DUT sends a RemoveAllScenesResponse command to TH with the Status field set to 0x00 (SUCCESS) and GroupID field set to 0x0001. - disabled: true + command: "RemoveAllScenes" + arguments: + values: + - name: "GroupID" + value: 0x0001 + response: + values: + - name: "Status" + value: 0 + - name: "GroupID" + value: 0x0001 - label: "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001." PICS: S.S.C06.Rsp - verification: | - DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to the value SC0, the GroupID field set to 0x0001 and the SceneCount field set to 0x00. - disabled: true + command: "GetSceneMembership" + arguments: + values: + - name: "GroupID" + value: 0x0001 + response: + values: + - name: "Status" + value: 0x00 + - name: "Capacity" + value: (maxScenes/2) + - name: "GroupID" + value: 0x0001 + + - label: + "TH configures AC1 on DUT for all implemented application clusters + supporting scenes." + PICS: PICS_SDK_CI_ONLY + cluster: "Level Control" + command: "MoveToLevelWithOnOff" + arguments: + values: + - name: "Level" + value: 100 + - name: "TransitionTime" + value: 0 + - name: "OptionsMask" + value: 0 + - name: "OptionsOverride" + value: 0 - label: "TH configures AC1 on DUT for all implemented application clusters supporting scenes." verification: | - DUT is configured with AC1. - disabled: true + Is DUT configured with AC1? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please configure AC1 on DUT and enter 'y' after the + configuration is complete" + - name: "expectedValue" + value: "y" - label: "TH sends a StoreScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01." PICS: S.S.C04.Rsp - verification: | - DUT sends a StoreSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to 0x0001 and the SceneID field set to 0x01. - disabled: true + command: "StoreScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + + - label: + "TH configures AC2 on DUT for all implemented application clusters + supporting scenes." + cluster: "Level Control" + PICS: PICS_SDK_CI_ONLY + command: "MoveToLevelWithOnOff" + arguments: + values: + - name: "Level" + value: 200 + - name: "TransitionTime" + value: 0 + - name: "OptionsMask" + value: 0 + - name: "OptionsOverride" + value: 0 - label: "TH configures AC2 on DUT for all implemented application clusters supporting scenes." verification: | - DUT is configured with AC2 which is different from AC1. - disabled: true + Is DUT configured with AC2? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please configure AC2 on DUT and enter 'y' after the + configuration is complete" + - name: "expectedValue" + value: "y" - label: "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01." PICS: S.S.C05.Rsp - verification: | - If a status response is expected, DUT sends a response to TH with the Status field equal to 0x00 (SUCCESS). DUT returns to AC1. - disabled: true - - - label: - "TH reads attributes SceneCount, CurrentScene, CurrentGroup and - SceneValid from DUT." + command: "RecallScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + + - label: "TH reads the SceneCount attribute from DUT." PICS: S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003 - verification: | - DUT provides these attribute values: SceneCount attribute has the value (PIXIT.S.SceneTableEntriesOnFactoryNew + 1) CurrentScene attribute has the value 0x01 CurrentGroup attribute has the value G1 SceneValid attribute has the value TRUE. - disabled: true - - - label: "By application specific means, remove the power source from DUT." - verification: | - DUT is powered off. - disabled: true + command: "readAttribute" + attribute: "SceneCount" + response: + value: 1 + constraints: + type: int8u + + - label: "TH reads the CurrentScene attribute from DUT." + PICS: S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003 + command: "readAttribute" + attribute: "CurrentScene" + response: + value: 0x01 + constraints: + type: int8u + + - label: "TH reads the CurrentGroup attribute from DUT." + PICS: S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003 + command: "readAttribute" + attribute: "CurrentGroup" + response: + value: 0x0001 + constraints: + type: groupid + + - label: "TH reads the SceneValid attribute from DUT." + PICS: S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003 + command: "readAttribute" + attribute: "SceneValid" + response: + value: true + constraints: + type: uint8 + + - label: "Reboot target device" + PICS: PICS_SDK_CI_ONLY + cluster: "SystemCommands" + endpoint: 0 + command: "Reboot" + + - label: "Reboot target device(DUT)" + verification: | + Did the DUT successfully reboot? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: "Please reboot the DUT and enter 'y' after DUT starts" + - name: "expectedValue" + value: "y" - - label: "By application specific means, return the power source to DUT." - verification: | - DUT is powered on. - disabled: true + - label: + "TH configures AC2 on DUT for all implemented application clusters + supporting scenes." + cluster: "Level Control" + PICS: PICS_SDK_CI_ONLY + command: "MoveToLevelWithOnOff" + arguments: + values: + - name: "Level" + value: 200 + - name: "TransitionTime" + value: 0 + - name: "OptionsMask" + value: 0 + - name: "OptionsOverride" + value: 0 - label: "TH configures AC2 on DUT for all implemented application clusters supporting scenes." verification: | - DUT is configured with AC2 which is different from AC1. - disabled: true + Is DUT configured with AC2? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please configure AC2 on DUT and enter 'y' after the + configuration is complete" + - name: "expectedValue" + value: "y" - label: "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01." PICS: S.S.C05.Rsp - verification: | - If a status response is expected, DUT sends a response to TH with the Status field equal to 0x00 (SUCCESS). DUT returns to AC1. - disabled: true + command: "RecallScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 - label: "TH sends a ViewScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01." - PICS: S.S.C01.Rsp - verification: | - DUT sends a ViewSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to 0x0001, the SceneID field set to 0x01, the TransitionTime field set to 0x0000 and a set of extension fields appropriate to AC1. - disabled: true + PICS: S.S.C01.Rsp && PICS_SDK_CI_ONLY + command: "ViewScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + - name: "TransitionTime" + value: 0x0000 + - name: "ExtensionFieldSets" + value: + [ + { + ClusterID: 0x0006, + AttributeValueList: + [{ AttributeID: 0x0000, AttributeValue: 0x01 }], + }, + { + ClusterID: 0x0008, + AttributeValueList: + [ + { + AttributeID: 0x0000, + AttributeValue: 0x64, + }, + { + AttributeID: 0x0001, + AttributeValue: 0x00, + }, + ], + }, + ] + + - label: + "TH sends a ViewScene command to DUT with the GroupID field set to + 0x0001 and the SceneID field set to 0x01." + PICS: S.S.C01.Rsp && PICS_SKIP_SAMPLE_APP + command: "ViewScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + - name: "TransitionTime" + value: 0x0000 - label: "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001." PICS: S.S.C06.Rsp - verification: | - DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values (SC0 - 1), 0xfe or null, the GroupID field set to 0x0001, the SceneCount field set to 0x01 and the SceneList field containing only the scene ID 0x01. - disabled: true + command: "GetSceneMembership" + arguments: + values: + - name: "GroupID" + value: 0x0001 + response: + values: + - name: "Status" + value: 0x00 + - name: "Capacity" + value: (maxScenes/2) - 1 + - name: "GroupID" + value: 0x0001 + - name: "SceneList" + value: [0x01] - label: "TH sends a RemoveAllScenes command to DUT with the GroupID field set to 0x0001." PICS: S.S.C03.Rsp - verification: | - DUT sends a RemoveAllScenesResponse command to TH with the Status field set to 0x00 (SUCCESS) and GroupID field set to 0x0001. - disabled: true + command: "RemoveAllScenes" + arguments: + values: + - name: "GroupID" + value: 0x0001 + response: + values: + - name: "Status" + value: 0 + - name: "GroupID" + value: 0x0001 - label: "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001." PICS: S.S.C06.Rsp - verification: | - DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values SC0, 0xfe or null, the GroupID field set to 0x0001 and the SceneCount field set to 0x00. - disabled: true + command: "GetSceneMembership" + arguments: + values: + - name: "GroupID" + value: 0x0001 + response: + values: + - name: "Status" + value: 0x00 + - name: "Capacity" + value: (maxScenes/2) + - name: "GroupID" + value: 0x0001 + # TODO : For Capacity, replace "value: (maxScenes/2)" by following lines when new backend for test is used in CI + # constraints: + # anyOf: [(maxScenes/2), 0xfe ,0x89] + + - label: + "TH sends a AddScene command to DUT with the GroupID field set to + 0x0001, the SceneID field set to 0x01, the TransitionTime field set to + 0x0001 and a set of extension fields appropriate to AC1." + PICS: S.S.C00.Rsp && && PICS_SDK_CI_ONLY + command: "AddScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x0001 + - name: "TransitionTime" + value: 0x0001 + - name: "SceneName" + value: "Scene1" + - name: "ExtensionFieldSets" + value: + [ + { + ClusterID: 0x0006, + AttributeValueList: + [{ AttributeID: 0x0000, AttributeValue: 0x01 }], + }, + { + ClusterID: 0x0008, + AttributeValueList: + [ + { + AttributeID: 0x0000, + AttributeValue: 0x64, + }, + { + AttributeID: 0x0001, + AttributeValue: 0x00, + }, + ], + }, + ] + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 - label: "TH sends a AddScene command to DUT with the GroupID field set to 0x0001, the SceneID field set to 0x01, the TransitionTime field set to 0x0001 and a set of extension fields appropriate to AC1." - PICS: S.S.C00.Rsp verification: | - DUT sends a AddSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to 0x0001 and the SceneID field set to 0x01. - disabled: true + Execute the following command in TH to generate the pre-condition to execute this test case: + + ./chip-tool scenes add-scene 0x0001 1 1 "Test Name" '[{"clusterId": value, "attributeValueList":[{"attributeId": value, "attributeValue": value}]}' nodeId endpointId + + Note: The number of ExtensionFieldSets, the value of clusterId of each ExtensionFieldSet, the number of attributes in attributeValueList and their values varies for each application + + Verify the "status is success" on the TH(Chip-tool) Log and below is the sample log provided for the raspi platform: + [1670970505.887060][5742:5744] CHIP:DMG: InvokeResponseMessage = + [1670970505.887118][5742:5744] CHIP:DMG: { + [1670970505.887172][5742:5744] CHIP:DMG: suppressResponse = false, + [1670970505.887231][5742:5744] CHIP:DMG: InvokeResponseIBs = + [1670970505.887307][5742:5744] CHIP:DMG: [ + [1670970505.887366][5742:5744] CHIP:DMG: InvokeResponseIB = + [1670970505.887444][5742:5744] CHIP:DMG: { + [1670970505.887507][5742:5744] CHIP:DMG: CommandDataIB = + [1670970505.887576][5742:5744] CHIP:DMG: { + [1670970505.887713][5742:5744] CHIP:DMG: CommandPathIB = + [1670970505.887804][5742:5744] CHIP:DMG: { + [1670970505.887940][5742:5744] CHIP:DMG: EndpointId = 0x1, + [1670970505.888093][5742:5744] CHIP:DMG: ClusterId = 0x5, + [1670970505.888242][5742:5744] CHIP:DMG: CommandId = 0x0, + [1670970505.888385][5742:5744] CHIP:DMG: }, + [1670970505.888692][5742:5744] CHIP:DMG: + [1670970505.888769][5742:5744] CHIP:DMG: CommandFields = + [1670970505.888852][5742:5744] CHIP:DMG: { + [1670970505.889030][5742:5744] CHIP:DMG: 0x0 = 0, + [1670970505.889183][5742:5744] CHIP:DMG: 0x1 = 1, + [1670970505.889406][5742:5744] CHIP:DMG: 0x2 = 1, + [1670970505.889515][5742:5744] CHIP:DMG: }, + [1670970505.889603][5742:5744] CHIP:DMG: }, + [1670970505.889684][5742:5744] CHIP:DMG: + [1670970505.889745][5742:5744] CHIP:DMG: }, + [1670970505.889821][5742:5744] CHIP:DMG: + [1670970505.889878][5742:5744] CHIP:DMG: ], + [1670970505.889953][5742:5744] CHIP:DMG: + [1670970505.890009][5742:5744] CHIP:DMG: InteractionModelRevision = 1 + [1670970505.890066][5742:5744] CHIP:DMG: }, + [1670970505.890212][5742:5744] CHIP:DMG: Received Command Response Data, Endpoint=1 Cluster=0x0000_0005 Command=0x0000_0000 + [1670970505.890328][5742:5744] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0005 Command 0x0000_0000 + [1670970505.890458][5742:5744] CHIP:TOO: AddSceneResponse: { + [1670970505.890551][5742:5744] CHIP:TOO: status: 0 + [1670970505.890608][5742:5744] CHIP:TOO: groupId: 1 + [1670970505.890717][5742:5744] CHIP:TOO: sceneId: 1 + [1670970505.890774][5742:5744] CHIP:TOO: } + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please execute the add scene command with + extensionfieldsets in accordance with AC1 on DUT and enter + 'y' if the command is successful" + - name: "expectedValue" + value: "y" - label: "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001." PICS: S.S.C06.Rsp - verification: | - DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values (SC0 - 1), 0xfe or null, the GroupID field set to 0x0001, the SceneCount field set to 0x01 and the SceneList field containing only the scene ID 0x01. - disabled: true + command: "GetSceneMembership" + arguments: + values: + - name: "GroupID" + value: 0x0001 + response: + values: + - name: "Status" + value: 0x00 + - name: "Capacity" + value: (maxScenes/2) - 1 + - name: "GroupID" + value: 0x0001 + - name: "SceneList" + value: [0x01] + # TODO : For Capacity, replace "value: (maxScenes/2)" by following lines when new backend for test is used in CI + # constraints: + # anyOf: [(maxScenes/2), 0xfe ,0x89] - label: "TH sends a RemoveScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01." PICS: S.S.C02.Rsp - verification: | - DUT sends a RemoveSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to 0x0001 and the SceneID field set to 0x01. - disabled: true + command: "RemoveScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x0001 + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 - label: "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001." PICS: S.S.C06.Rsp - verification: | - DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values SC0, 0xfe or null, the GroupID field set to 0x0001 and the SceneCount field set to 0x00. - disabled: true + command: "GetSceneMembership" + arguments: + values: + - name: "GroupID" + value: 0x0001 + response: + values: + - name: "Status" + value: 0x00 + - name: "Capacity" + value: (maxScenes/2) + - name: "GroupID" + value: 0x0001 + # TODO : For Capacity, replace "value: (maxScenes/2)" by following lines when new backend for test is used in CI + # constraints: + # anyOf: [(maxScenes/2), 0xfe ,0x89] + + - label: + "TH configures AC2 on DUT for all implemented application clusters + supporting scenes." + cluster: "Level Control" + PICS: PICS_SDK_CI_ONLY + command: "MoveToLevelWithOnOff" + arguments: + values: + - name: "Level" + value: 200 + - name: "TransitionTime" + value: 0 + - name: "OptionsMask" + value: 0 + - name: "OptionsOverride" + value: 0 - label: "TH configures AC2 on DUT for all implemented application clusters supporting scenes." verification: | - DUT is configured with AC2 which is different from AC1. - disabled: true + Is DUT configured with AC2? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please configure AC2 on DUT and enter 'y' after the + configuration is complete" + - name: "expectedValue" + value: "y" - label: "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01." PICS: S.S.C05.Rsp - verification: | - If a status response is expected, DUT sends a response to TH with the Status field equal to 0x8b (NOT_FOUND). - disabled: true + command: "RecallScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + response: + error: NOT_FOUND + + - label: + "TH configures AC1 on DUT for all implemented application clusters + supporting scenes." + cluster: "Level Control" + PICS: PICS_SDK_CI_ONLY + command: "MoveToLevelWithOnOff" + arguments: + values: + - name: "Level" + value: 100 + - name: "TransitionTime" + value: 0 + - name: "OptionsMask" + value: 0 + - name: "OptionsOverride" + value: 0 - label: "TH configures AC1 on DUT for all implemented application clusters supporting scenes." verification: | - DUT is configured with AC1. - disabled: true + Is DUT configured with AC1? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please configure AC1 on DUT and enter 'y' after the + configuration is complete" + - name: "expectedValue" + value: "y" - label: "TH sends a StoreScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01." PICS: S.S.C04.Rsp - verification: | - DUT sends a StoreSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to 0x0001 and the SceneID field set to 0x01. - disabled: true + command: "StoreScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + + - label: + "TH configures AC2 on DUT for all implemented application clusters + supporting scenes." + cluster: "Level Control" + PICS: PICS_SDK_CI_ONLY + command: "MoveToLevelWithOnOff" + arguments: + values: + - name: "Level" + value: 200 + - name: "TransitionTime" + value: 0 + - name: "OptionsMask" + value: 0 + - name: "OptionsOverride" + value: 0 - label: "TH configures AC2 on DUT for all implemented application clusters supporting scenes." verification: | - DUT is configured with AC2 which is different to AC1. - disabled: true + Is DUT configured with AC2? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please configure AC2 on DUT and enter 'y' after the + configuration is complete" + - name: "expectedValue" + value: "y" - label: "TH sends a StoreScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x02." PICS: S.S.C04.Rsp - verification: | - DUT sends a StoreSceneResponse command to TH with the Status field set to 0x00 (SUCCESS) or 0x89 (INSUFFICIENT_SPACE). If SUCCESS, with the GroupID field set to 0x0001 and the SceneID field set to 0x02. If INSUFFICIENT_SPACE, the following steps SHALL NOT be executed. - disabled: true + command: "StoreScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x02 + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x02 + # TODO: For status, replace "- value: 0x00" by following lines when new backend for test is used in CI + # saveAs: StoreStatus + # constraints: + # anyOf: [0x00, 0x89] + + # TODO: Uncomment once the new backend is implemented, allowing the use of EqualityCommands pseudo cluster + #- label: + # "Verify that the status of previous command was either 0x00 (SUCCESS) + # or 0x89 (INSUFFICIENT_SPACE)" + # cluster: "EqualityCommands" + # command: "UnsignedNumberEquals" + # arguments: + # values: + # - name: "Value1" + # value: 0x00 + # - name: "Value2" + # value: StoreStatus + # response: + # - values: + # - name: "Equals" + # value: true + # saveAs: ContinueTest - label: "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001." + # TODO : Uncomment runIf statement once new test backend is implemented + #runIf: ContinueTest PICS: S.S.C06.Rsp - verification: | - DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values (SC0 - 2), 0xfe or null, the GroupID field set to 0x0001, the SceneCount field set to 0x02 and the SceneList field containing the scene IDs 0x01 and 0x02. - disabled: true + command: "GetSceneMembership" + arguments: + values: + - name: "GroupID" + value: 0x0001 + response: + values: + - name: "Status" + value: 0x00 + - name: "Capacity" + value: (maxScenes/2) - 2 + - name: "GroupID" + value: 0x0001 + - name: "SceneList" + value: [0x01, 0x02] - label: "If capacity allows, TH sends a AddGroup command to DUT with the GroupID field set to 0x0002." + # TODO : Uncomment runIf statement once new test backend is implemented + #runIf: ContinueTest PICS: G.S.C00.Rsp - verification: | - DUT sends a AddGroupResponse command to TH with the Status field set to 0x00 (SUCCESS) and the GroupID field set to 0x0002. - disabled: true + cluster: "Groups" + command: "AddGroup" + arguments: + values: + - name: "GroupID" + value: 0x0002 + - name: "GroupName" + value: "Group2" + response: + values: + - name: "Status" + value: 0 + - name: "GroupID" + value: 0x0002 - label: "TH sends a RemoveAllScenes command to DUT with the GroupID field set to 0x0002." + # TODO : Uncomment runIf statement once new test backend is implemented + #runIf: ContinueTest PICS: S.S.C03.Rsp - verification: | - DUT sends a RemoveAllScenesResponse command to TH with the Status field set to 0x00 (SUCCESS) and GroupID field set to 0x0002. - disabled: true + command: "RemoveAllScenes" + arguments: + values: + - name: "GroupID" + value: 0x0002 + response: + values: + - name: "Status" + value: 0 + - name: "GroupID" + value: 0x0002 - label: "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0002." + # TODO : Uncomment runIf statement once new test backend is implemented + #runIf: ContinueTest PICS: S.S.C06.Rsp - verification: | - DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to the value SC1, the GroupID field set to 0x0002 and the SceneCount field set to 0x00. - disabled: true + command: "GetSceneMembership" + arguments: + values: + - name: "GroupID" + value: 0x0002 + response: + values: + - name: "Status" + value: 0x00 + - name: "Capacity" + value: (maxScenes/2) - 2 + - name: "GroupID" + value: 0x0002 - label: "TH configures AC3 on DUT for all implemented application clusters supporting scenes." - verification: | - DUT is configured with AC3 which is different to both AC1 and AC2. - disabled: true + # TODO : Uncomment runIf statement once new test backend is implemented + #runIf: ContinueTest + cluster: "Level Control" + PICS: PICS_SDK_CI_ONLY + command: "MoveToLevelWithOnOff" + arguments: + values: + - name: "Level" + value: 1 + - name: "TransitionTime" + value: 0 + - name: "OptionsMask" + value: 0 + - name: "OptionsOverride" + value: 0 + + - label: + "TH configures AC3 on DUT for all implemented application clusters + supporting scenes." + # TODO : Uncomment runIf statement once new test backend is implemented + #runIf: ContinueTest + verification: | + Is DUT configured with AC3? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please configure AC3 on DUT and enter 'y' after the + configuration is complete" + - name: "expectedValue" + value: "y" - label: "TH sends a StoreScene command to DUT with the GroupID field set to 0x0002 and the SceneID field set to 0x03." + # TODO : Uncomment runIf statement once new test backend is implemented + #runIf: ContinueTest PICS: S.S.C04.Rsp - verification: | - DUT sends a StoreSceneResponse command to TH with the Status field set to 0x00 (SUCCESS) or 0x89 (INSUFFICIENT_SPACE). If SUCCESS, with the GroupID field set to 0x0002 and the SceneID field set to 0x03. IF INSUFFICIENT_SPACE, the following steps SHALL NOT be executed. - disabled: true + command: "StoreScene" + arguments: + values: + - name: "GroupID" + value: 0x0002 + - name: "SceneID" + value: 0x03 + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: 0x0002 + - name: "SceneID" + value: 0x03 + # TODO: For Status, replace "- value: 0x00"by following lines when new backend for test is used in CI + # saveAs: StoreStatus + # constraints: + # anyOf: [0x00, 0x89] + + # TODO: Uncomment once the new backend is implemented, allowing the use of EqualityCommands pseudo cluster + #- label: + # "Verify that the status of previous command was either 0x00 (SUCCESS) + # or 0x89 (INSUFFICIENT_SPACE)" + # runIf: ContinueTest + # cluster: "EqualityCommands" + # command: "UnsignedNumberEquals" + # arguments: + # values: + # - name: "Value1" + # value: 0x00 + # - name: "Value2" + # value: StoreStatus + # response: + # - values: + # - name: "Equals" + # value: true + # saveAs: ContinueTest - label: "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0002." + #runIf: ContinueTest PICS: S.S.C06.Rsp - verification: | - DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values (SC1 - 3), 0xfe or null, the GroupID field set to 0x0002, the SceneCount field set to 0x01 and the SceneList field containing only the scene ID 0x03. - disabled: true + command: "GetSceneMembership" + arguments: + values: + - name: "GroupID" + value: 0x0002 + response: + values: + - name: "Status" + value: 0x00 + - name: "Capacity" + value: (maxScenes/2) - 3 + - name: "GroupID" + value: 0x0002 + - name: "SceneList" + value: [0x03] diff --git a/src/app/tests/suites/certification/Test_TC_S_2_3.yaml b/src/app/tests/suites/certification/Test_TC_S_2_3.yaml index 6abe8540d25882..b0fcf202937831 100644 --- a/src/app/tests/suites/certification/Test_TC_S_2_3.yaml +++ b/src/app/tests/suites/certification/Test_TC_S_2_3.yaml @@ -20,99 +20,580 @@ PICS: config: nodeId: 0x12344321 - cluster: "Basic Information" - endpoint: 0 + cluster: "Scenes" + endpoint: 1 + G1: + type: int16u + defaultValue: 0x0001 tests: + - label: "Wait for the commissioned device to be retrieved" + cluster: "DelayCommands" + command: "WaitForCommissionee" + arguments: + values: + - name: "nodeId" + value: nodeId + + - label: "TH reads from the DUT the (0x0006) SceneTableSize attribute" + PICS: S.S.A0006 + command: "readAttribute" + attribute: "SceneTableSize" + response: + values: + - name: "SceneTableSize" + saveAs: maxScenes + constraints: + type: uint16 + - label: - "preparation step for using commands from Groups cluster: TH generates - fabric-unique GroupID, GroupName, random key, EpochKey0 and - GroupKeySetID. TH sets GroupKeySecurityPolicy = TrustFirst (1) - GroupKeyMulticastPolicy = PerGroupID (0) EpochStartTime0 = 0" - verification: | + "preparation step for using commands from Groups cluster: Add KeySet" + cluster: "Group Key Management" + endpoint: 0 + command: "KeySetWrite" + arguments: + values: + - name: "GroupKeySet" + value: + { + GroupKeySetID: 0x01a1, + GroupKeySecurityPolicy: 0, + EpochKey0: "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf", + EpochStartTime0: 0, + EpochKey1: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf", + EpochStartTime1: 0, + EpochKey2: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf", + EpochStartTime2: 0, + } - disabled: true + - label: + "Preparation step for using commands from Groups cluster: Write Group + Keys" + cluster: "Group Key Management" + endpoint: 0 + command: "writeAttribute" + attribute: "GroupKeyMap" + arguments: + value: [{ FabricIndex: 1, GroupId: G1, GroupKeySetID: 0x01a1 }] - label: "TH sends a AddGroup command to DUT with the GroupID field set to G1." PICS: G.S.C00.Rsp - verification: | - DUT sends a AddGroupResponse command to TH with the Status field set to 0x00 (SUCCESS) or 0x8a (DUPLICATE_EXISTS) and the GroupID field set to G1. - disabled: true + cluster: "Groups" + command: "AddGroup" + arguments: + values: + - name: "GroupID" + value: G1 + - name: "GroupName" + value: "Group1" + response: + values: + - name: "Status" + value: 0 + - name: "GroupID" + value: G1 - label: "TH sends a RemoveAllScenes command to DUT with the GroupID field set to G1." PICS: S.S.C03.Rsp - verification: | - DUT sends a RemoveAllScenesResponse command to TH with the Status field set to 0x00 (SUCCESS) and GroupID field set to G1. - disabled: true + command: "RemoveAllScenes" + arguments: + values: + - name: "GroupID" + value: G1 + response: + values: + - name: "Status" + value: 0 + - name: "GroupID" + value: G1 - label: "TH sends a GetSceneMembership command to DUT with the GroupID field set to G1." PICS: S.S.C06.Rsp - verification: | - DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to the value SC0, the GroupID field set to G1 and the SceneCount field set to 0x00. - disabled: true + command: "GetSceneMembership" + arguments: + values: + - name: "GroupID" + value: G1 + response: + values: + - name: "Status" + value: 0x00 + - name: "Capacity" + value: (maxScenes/2) + - name: "GroupID" + value: G1 + - name: "SceneList" + value: [] - label: "TH sends a EnhancedAddScene command to DUT with the GroupID field set to G1, the SceneID field set to 0x01, the TransitionTime field set to 0x000a (1s) and a set of extension fields appropriate to AC1." - PICS: S.S.C40.Rsp - verification: | - DUT sends a EnhancedAddSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to G1 and the SceneID field set to 0x01. - disabled: true + PICS: S.S.C40.Rsp && PICS_SDK_CI_ONLY + command: "EnhancedAddScene" + arguments: + values: + - name: "GroupID" + value: G1 + - name: "SceneID" + value: 0x0001 + - name: "TransitionTime" + value: 0x000a + - name: "SceneName" + value: "Scene1" + - name: "ExtensionFieldSets" + value: + [ + { + ClusterID: 0x0006, + AttributeValueList: + [{ AttributeID: 0x0000, AttributeValue: 0x01 }], + }, + { + ClusterID: 0x0008, + AttributeValueList: + [ + { + AttributeID: 0x0000, + AttributeValue: 0x64, + }, + { + AttributeID: 0x0001, + AttributeValue: 0x00, + }, + ], + }, + ] + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: G1 + - name: "SceneID" + value: 0x01 - label: "TH sends a AddScene command to DUT with the GroupID field set to G1, the SceneID field set to 0x01, the TransitionTime field set to 0x0001 (1s) and a set of extension fields appropriate to AC1." - PICS: S.S.C40.Rsp + PICS: (!S.S.C40.Rsp) && PICS_SDK_CI_ONLY + command: "AddScene" + arguments: + values: + - name: "GroupID" + value: G1 + - name: "SceneID" + value: 0x0001 + - name: "TransitionTime" + value: 0x0001 + - name: "SceneName" + value: "Scene1" + - name: "ExtensionFieldSets" + value: + [ + { + ClusterID: 0x0006, + AttributeValueList: + [{ AttributeID: 0x0000, AttributeValue: 0x01 }], + }, + { + ClusterID: 0x0008, + AttributeValueList: + [ + { + AttributeID: 0x0000, + AttributeValue: 0x64, + }, + { + AttributeID: 0x0001, + AttributeValue: 0x00, + }, + ], + }, + ] + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: G1 + - name: "SceneID" + value: 0x01 + + - label: + "TH sends a EnhancedAddScene command to DUT with the GroupID field set + to G1, the SceneID field set to 0x01, the TransitionTime field set to + 0x000a and a set of extension fields appropriate to AC1." verification: | - DUT sends a AddSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to G1 and the SceneID field set to 0x01. - disabled: true + Execute the following command in TH to generate the pre-condition to execute this test case: + + ./chip-tool scenes enhanced-add-scene 0x000a 1 1 "Test Name" '[{"clusterId": value, "attributeValueList":[{"attributeId": value, "attributeValue": value}]}' nodeId endpointId + + Note: The number of ExtensionFieldSets, the value of clusterId of each ExtensionFieldSet, the number of attributes in attributeValueList and their values varies for each application + + Verify the "status is success" on the TH(Chip-tool) Log and below is the sample log provided for the raspi platform: + [1670970505.887060][5742:5744] CHIP:DMG: InvokeResponseMessage = + [1670970505.887118][5742:5744] CHIP:DMG: { + [1670970505.887172][5742:5744] CHIP:DMG: suppressResponse = false, + [1670970505.887231][5742:5744] CHIP:DMG: InvokeResponseIBs = + [1670970505.887307][5742:5744] CHIP:DMG: [ + [1670970505.887366][5742:5744] CHIP:DMG: InvokeResponseIB = + [1670970505.887444][5742:5744] CHIP:DMG: { + [1670970505.887507][5742:5744] CHIP:DMG: CommandDataIB = + [1670970505.887576][5742:5744] CHIP:DMG: { + [1670970505.887713][5742:5744] CHIP:DMG: CommandPathIB = + [1670970505.887804][5742:5744] CHIP:DMG: { + [1670970505.887940][5742:5744] CHIP:DMG: EndpointId = 0x1, + [1670970505.888093][5742:5744] CHIP:DMG: ClusterId = 0x5, + [1670970505.888242][5742:5744] CHIP:DMG: CommandId = 0x40, + [1670970505.888385][5742:5744] CHIP:DMG: }, + [1670970505.888692][5742:5744] CHIP:DMG: + [1670970505.888769][5742:5744] CHIP:DMG: CommandFields = + [1670970505.888852][5742:5744] CHIP:DMG: { + [1670970505.889030][5742:5744] CHIP:DMG: 0x0 = 0, + [1670970505.889183][5742:5744] CHIP:DMG: 0x1 = 1, + [1670970505.889406][5742:5744] CHIP:DMG: 0x2 = 1, + [1670970505.889515][5742:5744] CHIP:DMG: }, + [1670970505.889603][5742:5744] CHIP:DMG: }, + [1670970505.889684][5742:5744] CHIP:DMG: + [1670970505.889745][5742:5744] CHIP:DMG: }, + [1670970505.889821][5742:5744] CHIP:DMG: + [1670970505.889878][5742:5744] CHIP:DMG: ], + [1670970505.889953][5742:5744] CHIP:DMG: + [1670970505.890009][5742:5744] CHIP:DMG: InteractionModelRevision = 1 + [1670970505.890066][5742:5744] CHIP:DMG: }, + [1670970505.890212][5742:5744] CHIP:DMG: Received Command Response Data, Endpoint=1 Cluster=0x0000_0005 Command=0x0000_0040 + [1670970505.890328][5742:5744] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0005 Command 0x0000_0040 + [1670970505.890458][5742:5744] CHIP:TOO: EnhancedAddSceneResponse: { + [1670970505.890551][5742:5744] CHIP:TOO: status: 0 + [1670970505.890608][5742:5744] CHIP:TOO: groupId: 1 + [1670970505.890717][5742:5744] CHIP:TOO: sceneId: 1 + [1670970505.890774][5742:5744] CHIP:TOO: } + cluster: "LogCommands" + command: "UserPrompt" + PICS: S.S.C40.Rsp && PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please execute the enhanced add scene command with + extensionfieldsets in accordance with AC1 on DUT and enter + 'y' if the command is successful" + - name: "expectedValue" + value: "y" + + - label: + "TH sends a AddScene command to DUT with the GroupID field set to G1, + the SceneID field set to 0x01, the TransitionTime field set to 0x0001 + and a set of extension fields appropriate to AC1." + verification: | + Execute the following command in TH to generate the pre-condition to execute this test case: + + ./chip-tool scenes add-scene 0x0001 1 1 "Test Name" '[{"clusterId": value, "attributeValueList":[{"attributeId": value, "attributeValue": value}]}' nodeId endpointId + + Note: The number of ExtensionFieldSets, the value of clusterId of each ExtensionFieldSet, the number of attributes in attributeValueList and their values varies for each application + + Verify the "status is success" on the TH(Chip-tool) Log and below is the sample log provided for the raspi platform: + [1670970505.887060][5742:5744] CHIP:DMG: InvokeResponseMessage = + [1670970505.887118][5742:5744] CHIP:DMG: { + [1670970505.887172][5742:5744] CHIP:DMG: suppressResponse = false, + [1670970505.887231][5742:5744] CHIP:DMG: InvokeResponseIBs = + [1670970505.887307][5742:5744] CHIP:DMG: [ + [1670970505.887366][5742:5744] CHIP:DMG: InvokeResponseIB = + [1670970505.887444][5742:5744] CHIP:DMG: { + [1670970505.887507][5742:5744] CHIP:DMG: CommandDataIB = + [1670970505.887576][5742:5744] CHIP:DMG: { + [1670970505.887713][5742:5744] CHIP:DMG: CommandPathIB = + [1670970505.887804][5742:5744] CHIP:DMG: { + [1670970505.887940][5742:5744] CHIP:DMG: EndpointId = 0x1, + [1670970505.888093][5742:5744] CHIP:DMG: ClusterId = 0x5, + [1670970505.888242][5742:5744] CHIP:DMG: CommandId = 0x0, + [1670970505.888385][5742:5744] CHIP:DMG: }, + [1670970505.888692][5742:5744] CHIP:DMG: + [1670970505.888769][5742:5744] CHIP:DMG: CommandFields = + [1670970505.888852][5742:5744] CHIP:DMG: { + [1670970505.889030][5742:5744] CHIP:DMG: 0x0 = 0, + [1670970505.889183][5742:5744] CHIP:DMG: 0x1 = 1, + [1670970505.889406][5742:5744] CHIP:DMG: 0x2 = 1, + [1670970505.889515][5742:5744] CHIP:DMG: }, + [1670970505.889603][5742:5744] CHIP:DMG: }, + [1670970505.889684][5742:5744] CHIP:DMG: + [1670970505.889745][5742:5744] CHIP:DMG: }, + [1670970505.889821][5742:5744] CHIP:DMG: + [1670970505.889878][5742:5744] CHIP:DMG: ], + [1670970505.889953][5742:5744] CHIP:DMG: + [1670970505.890009][5742:5744] CHIP:DMG: InteractionModelRevision = 1 + [1670970505.890066][5742:5744] CHIP:DMG: }, + [1670970505.890212][5742:5744] CHIP:DMG: Received Command Response Data, Endpoint=1 Cluster=0x0000_0005 Command=0x0000_0000 + [1670970505.890328][5742:5744] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0005 Command 0x0000_0000 + [1670970505.890458][5742:5744] CHIP:TOO: AddSceneResponse: { + [1670970505.890551][5742:5744] CHIP:TOO: status: 0 + [1670970505.890608][5742:5744] CHIP:TOO: groupId: 1 + [1670970505.890717][5742:5744] CHIP:TOO: sceneId: 1 + [1670970505.890774][5742:5744] CHIP:TOO: } + cluster: "LogCommands" + command: "UserPrompt" + PICS: (!S.S.C40.Rsp) && PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please execute the add scene command with + extensionfieldsets in accordance with AC1 on DUT and enter + 'y' if the command is successful" + - name: "expectedValue" + value: "y" - label: "TH sends a EnhancedViewScene command to DUT with the GroupID field set to G1 and the SceneID field set to 0x01." - PICS: S.S.C41.Rsp + PICS: S.S.C41.Rsp && PICS_SDK_CI_ONLY + command: "EnhancedViewScene" + arguments: + values: + - name: "GroupID" + value: G1 + - name: "SceneID" + value: 0x01 + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: G1 + - name: "SceneID" + value: 0x01 + - name: "TransitionTime" + value: 0x000a + - name: "ExtensionFieldSets" + value: + [ + { + ClusterID: 0x0006, + AttributeValueList: + [{ AttributeID: 0x0000, AttributeValue: 0x01 }], + }, + { + ClusterID: 0x0008, + AttributeValueList: + [ + { + AttributeID: 0x0000, + AttributeValue: 0x64, + }, + { + AttributeID: 0x0001, + AttributeValue: 0x00, + }, + ], + }, + ] + + - label: + "TH sends a ViewScene command to DUT with the GroupID field set to G1 + and the SceneID field set to 0x01." + PICS: (!S.S.C41.Rsp) && PICS_SDK_CI_ONLY + command: "ViewScene" + arguments: + values: + - name: "GroupID" + value: G1 + - name: "SceneID" + value: 0x01 + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: G1 + - name: "SceneID" + value: 0x01 + - name: "TransitionTime" + value: 0x0001 + - name: "ExtensionFieldSets" + value: + [ + { + ClusterID: 0x0006, + AttributeValueList: + [{ AttributeID: 0x0000, AttributeValue: 0x01 }], + }, + { + ClusterID: 0x0008, + AttributeValueList: + [ + { + AttributeID: 0x0000, + AttributeValue: 0x64, + }, + { + AttributeID: 0x0001, + AttributeValue: 0x00, + }, + ], + }, + ] + + - label: + "TH sends a EnhancedViewScene command to DUT with the GroupID field + set to G1 and the SceneID field set to 0x01." + PICS: S.S.C41.Rsp && PICS_SKIP_SAMPLE_APP verification: | - DUT sends a EnhancedViewSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to G1, the SceneID field set to 0x01, the TransitionTime field set to 0x000a (1s) and a set of extension fields appropriate to AC1. - disabled: true + Execute the following command in TH to generate the pre-condition to execute this test case: + + ./chip-tool scenes enhanced-view-scene GroupId SceneId Node-Id EndpointId + Note: The number of ExtensionFieldSets, the value of clusterId of each ExtensionFieldSet, the number of attributes in attributeValueList and their values varies for each application + + Verify that the extension fields in the log match the ones expected and that + Status = 0x00 + GroupID = 0x0001 + SceneID = 0x01 + TransitionTime = 0x000a + cluster: "LogCommands" + command: "UserPrompt" + arguments: + values: + - name: "message" + value: + "Please execute the ehanced-view-scene command and verify + that the extensionfieldsets, status, groupID and SceneID are + in accordance with AC1 on DUT and enter 'y' if the command + is successful" + - name: "expectedValue" + value: "y" - label: "TH sends a ViewScene command to DUT with the GroupID field set to G1 and the SceneID field set to 0x01." - PICS: "!S.S.C41.Rsp" + PICS: (!S.S.C41.Rsp) && PICS_SKIP_SAMPLE_APP verification: | - DUT sends a ViewSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to G1 and the SceneID field set to 0x01, the TransitionTime field set to 0x0001 (1s) and a set of extension fields appropriate to AC1. - disabled: true + Execute the following command in TH to generate the pre-condition to execute this test case: + + ./chip-tool scenes view-scene GroupId SceneId Node-Id EndpointId + + Note: The number of ExtensionFieldSets, the value of clusterId of each ExtensionFieldSet, the number of attributes in attributeValueList and their values varies for each application + + Verify that the extension fields in the log match the ones expected and that + Status = 0x00 + GroupID = 0x0001 + SceneID = 0x01 + TransitionTime = 0x0001 + cluster: "LogCommands" + command: "UserPrompt" + arguments: + values: + - name: "message" + value: + "Please execute the view-scene command and verify that the + extensionfieldsets, status, groupID and SceneID are in + accordance with AC1 on DUT and enter 'y' if the command is + successful" + - name: "expectedValue" + value: "y" - label: "TH sends a GetSceneMembership command to DUT with the GroupID field set to G1." PICS: S.S.C06.Rsp - verification: | - DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values (SC0 - 1), 0xfe or null, the GroupID field set to G1, the SceneCount field set to 0x01 and the SceneList field containing only the scene ID 0x01. - disabled: true + command: "GetSceneMembership" + arguments: + values: + - name: "GroupID" + value: G1 + response: + values: + - name: "Status" + value: 0x00 + - name: "Capacity" + value: (maxScenes/2) - 1 + - name: "GroupID" + value: G1 + - name: "SceneList" + value: [0x01] + + - label: + "TH configures AC2 on DUT for all implemented application clusters + supporting scenes." + cluster: "Level Control" + PICS: PICS_SDK_CI_ONLY + command: "MoveToLevelWithOnOff" + arguments: + values: + - name: "Level" + value: 200 + - name: "TransitionTime" + value: 0 + - name: "OptionsMask" + value: 0 + - name: "OptionsOverride" + value: 0 - label: "TH configures AC2 on DUT for all implemented application clusters supporting scenes." - PICS: S.S.C04.Rsp verification: | - DUT is configured with AC2 which is different from AC1. - disabled: true + Is DUT configured with AC2? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please configure AC2 on DUT and enter 'y' after the + configuration is complete" + - name: "expectedValue" + value: "y" - label: "TH sends a RecallScene command to group G1 with the GroupID field set to G1 and the scene ID field set to 0x01." PICS: S.S.C05.Rsp + command: "RecallScene" + groupId: 0x0001 + arguments: + values: + - name: "GroupID" + value: G1 + - name: "SceneID" + value: 0x01 + + - label: "Wait 1s" + PICS: PICS_SDK_CI_ONLY + cluster: "DelayCommands" + command: "WaitForMs" + arguments: + values: + - name: "ms" + value: 1000 + + - label: + "TH confirm the DUT reached AC1 (on level control cluster) after 1s" + PICS: PICS_SDK_CI_ONLY + cluster: "Level Control" + command: "readAttribute" + attribute: "CurrentLevel" + response: + value: 100 + + - label: "Verify DUT returns to AC1." verification: | - (There is no Status response since this was a groupcast) DUT returns to AC1. - disabled: true + Is DUT configured with AC1? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: "Please confirm AC1 on DUT and enter 'y'." + - name: "expectedValue" + value: "y" - label: "TH sends a CopyScene command to DUT with the mode field set to 0x00, @@ -122,12 +603,44 @@ tests: PICS: S.S.C42.Rsp verification: | DUT sends a CopySceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the group identifier from field set to G1 and the scene identifier from field set to 0x01. - disabled: true + command: "CopyScene" + arguments: + values: + - name: "Mode" + value: 0x00 + - name: "GroupIdentifierFrom" + value: G1 + - name: "SceneIdentifierFrom" + value: 0x01 + - name: "GroupIdentifierTo" + value: G1 + - name: "SceneIdentifierTo" + value: 0x02 + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupIdentifierFrom" + value: G1 + - name: "SceneIdentifierFrom" + value: 0x01 - label: "TH sends a GetSceneMembership command to DUT with the GroupID field set to G1." PICS: S.S.C06.Rsp - verification: | - DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values (SC0 - 2), 0xfe or null, the GroupID field set to G1, the SceneCount field set to 0x02 and the SceneList field containing the scene IDs 0x01 and 0x02. - disabled: true + command: "GetSceneMembership" + arguments: + values: + - name: "GroupID" + value: G1 + response: + values: + - name: "Status" + value: 0x00 + - name: "Capacity" + value: (maxScenes/2) - 2 + - name: "GroupID" + value: G1 + - name: "SceneList" + value: [0x01, 0x02] diff --git a/src/app/tests/suites/certification/Test_TC_S_2_4.yaml b/src/app/tests/suites/certification/Test_TC_S_2_4.yaml new file mode 100644 index 00000000000000..ad1c65b921cfc3 --- /dev/null +++ b/src/app/tests/suites/certification/Test_TC_S_2_4.yaml @@ -0,0 +1,414 @@ +# 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. +# Auto-generated scripts for harness use only, please review before automation. The endpoints and cluster names are currently set to default + +name: 123.2.4. [TC-S-2.4] Recall scene with transition time functionality + +PICS: + - S.S + +config: + nodeId: 0x12344321 + cluster: "Scenes" + endpoint: 1 + +tests: + - label: "Wait for the commissioned device to be retrieved" + cluster: "DelayCommands" + command: "WaitForCommissionee" + arguments: + values: + - name: "nodeId" + value: nodeId + + - label: "TH sends a RemoveAllGroups command to DUT." + PICS: G.S.C04.Rsp + cluster: "Groups" + endpoint: "1" + command: "RemoveAllGroups" + + - label: + "preparation step for using commands from Groups cluster: Add KeySet" + cluster: "Group Key Management" + endpoint: 0 + command: "KeySetWrite" + arguments: + values: + - name: "GroupKeySet" + value: + { + GroupKeySetID: 0x01a1, + GroupKeySecurityPolicy: 0, + EpochKey0: "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf", + EpochStartTime0: 0, + EpochKey1: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf", + EpochStartTime1: 0, + EpochKey2: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf", + EpochStartTime2: 0, + } + + - label: + "Preparation step for using commands from Groups cluster: Write Group + Keys" + cluster: "Group Key Management" + endpoint: 0 + command: "writeAttribute" + attribute: "GroupKeyMap" + arguments: + value: [{ FabricIndex: 1, GroupId: 0x0001, GroupKeySetID: 0x01a1 }] + + - label: + "TH sends a AddGroup command to DUT with the GroupID field set to + 0x0001." + PICS: G.S.C00.Rsp + cluster: "Groups" + command: "AddGroup" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "GroupName" + value: "Group1" + response: + values: + - name: "Status" + value: 0 + - name: "GroupID" + value: 0x0001 + + - label: + "TH sends a RemoveAllScenes command to DUT with the GroupID field set + to 0x0001." + PICS: S.S.C03.Rsp + command: "RemoveAllScenes" + arguments: + values: + - name: "GroupID" + value: 0x0001 + response: + values: + - name: "Status" + value: 0 + - name: "GroupID" + value: 0x0001 + + - label: + "TH sends a AddScene command to DUT with the GroupID field set to + 0x0001, the SceneID field set to 0x01, the TransitionTime field set to + 0x0001 and a set of extension fields appropriate to AC1." + PICS: S.S.C00.Rsp + command: "AddScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x0001 + - name: "TransitionTime" + value: 0x0014 + - name: "SceneName" + value: "Scene1" + - name: "ExtensionFieldSets" + value: [] + + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + + - label: + "TH configures AC1 on DUT for all implemented application clusters + supporting scenes." + PICS: PICS_SDK_CI_ONLY + cluster: "Level Control" + command: "MoveToLevelWithOnOff" + arguments: + values: + - name: "Level" + value: 100 + - name: "TransitionTime" + value: 0 + - name: "OptionsMask" + value: 0 + - name: "OptionsOverride" + value: 0 + + - label: + "TH configures AC1 on DUT for all implemented application clusters + supporting scenes." + verification: | + Is DUT configured with AC1? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please configure AC1 on DUT and enter 'y' after the + configuration is complete" + - name: "expectedValue" + value: "y" + + - label: + "TH sends a StoreScene command to DUT with the GroupID field set to + 0x0001 and the SceneID field set to 0x01." + PICS: S.S.C04.Rsp + command: "StoreScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + response: + values: + - name: "Status" + value: 0x00 + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + + - label: + "TH configures AC2 on DUT for all implemented application clusters + supporting scenes." + PICS: PICS_SDK_CI_ONLY + cluster: "Level Control" + command: "MoveToLevelWithOnOff" + arguments: + values: + - name: "Level" + value: 200 + - name: "TransitionTime" + value: 0 + - name: "OptionsMask" + value: 0 + - name: "OptionsOverride" + value: 0 + + - label: "Wait 1s for level to change" + PICS: PICS_SDK_CI_ONLY + cluster: "DelayCommands" + command: "WaitForMs" + arguments: + values: + - name: "ms" + value: 1000 + + - label: + "TH confirm the DUT reached AC2 (on level control cluster) after 1s, + which is different from AC1" + PICS: PICS_SDK_CI_ONLY + cluster: "Level Control" + command: "readAttribute" + attribute: "CurrentLevel" + response: + value: 200 + + - label: + "TH configures AC2 on DUT for all implemented application clusters + supporting scenes." + verification: | + Is DUT configured with AC2? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please configure AC2 on DUT and enter 'y' after the + configuration is complete" + - name: "expectedValue" + value: "y" + + - label: + "TH sends a RecallScene command to DUT with the GroupID field set to + 0x0001 and the SceneID field set to 0x01 and the TransitionTime field + omitted." + PICS: S.S.C05.Rsp + command: "RecallScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + + - label: "Wait 20s" + PICS: PICS_SDK_CI_ONLY + cluster: "DelayCommands" + command: "WaitForMs" + arguments: + values: + - name: "ms" + value: 20000 + + - label: + "TH confirm the DUT reached AC1 (on level control cluster) after 20s" + PICS: PICS_SDK_CI_ONLY + cluster: "Level Control" + command: "readAttribute" + attribute: "CurrentLevel" + response: + value: 100 + + - label: "DUT transitions to AC1 over 20s." + verification: | + Is the transition done over 20s? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: "Please confirm that transition to AC1 was made over 20s" + - name: "expectedValue" + value: "y" + + - label: + "TH configures AC2 on DUT for all implemented application clusters + supporting scenes." + PICS: PICS_SDK_CI_ONLY + cluster: "Level Control" + command: "MoveToLevelWithOnOff" + arguments: + values: + - name: "Level" + value: 200 + - name: "TransitionTime" + value: 0 + - name: "OptionsMask" + value: 0 + - name: "OptionsOverride" + value: 0 + + - label: + "TH configures AC2 on DUT for all implemented application clusters + supporting scenes." + verification: | + Is DUT configured with AC2? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please configure AC2 on DUT and enter 'y' after the + configuration is complete" + - name: "expectedValue" + value: "y" + + - label: + "TH sends a RecallScene command to DUT with the GroupID field set to + 0x0001, the SceneID field set to 0x01 and the TransitionTime field set + to 0x0032 (5s)." + PICS: S.S.C05.Rsp + command: "RecallScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + - name: "TransitionTime" + value: 0x0032 + + - label: "Wait 5s" + PICS: PICS_SDK_CI_ONLY + cluster: "DelayCommands" + command: "WaitForMs" + arguments: + values: + - name: "ms" + value: 5000 + + - label: + "TH confirm the DUT reached AC2 (on level control cluster) after 5s" + PICS: PICS_SDK_CI_ONLY + cluster: "Level Control" + command: "readAttribute" + attribute: "CurrentLevel" + response: + value: 100 + + - label: "DUT transitions to AC1 over 5." + verification: | + Is the transition done over 5s? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: "Please confirm that transition to AC1 was made over 5s" + - name: "expectedValue" + value: "y" + + - label: + "TH configures AC2 on DUT for all implemented application clusters + supporting scenes." + PICS: PICS_SDK_CI_ONLY + cluster: "Level Control" + command: "MoveToLevelWithOnOff" + arguments: + values: + - name: "Level" + value: 200 + - name: "TransitionTime" + value: 0 + - name: "OptionsMask" + value: 0 + - name: "OptionsOverride" + value: 0 + + - label: + "TH configures AC2 on DUT for all implemented application clusters + supporting scenes." + verification: | + Is DUT configured with AC2? + cluster: "LogCommands" + command: "UserPrompt" + PICS: PICS_SKIP_SAMPLE_APP + arguments: + values: + - name: "message" + value: + "Please configure AC2 on DUT and enter 'y' after the + configuration is complete" + - name: "expectedValue" + value: "y" + + - label: + "TH sends a RecallScene command to DUT with the GroupID field set to + 0x0001, the SceneID field set to 0x01 and the TransitionTime field set + to null (no transition time override)." + PICS: S.S.C05.Rsp + command: "RecallScene" + arguments: + values: + - name: "GroupID" + value: 0x0001 + - name: "SceneID" + value: 0x01 + - name: "TransitionTime" + value: null + response: + error: 0x00 diff --git a/src/app/tests/suites/certification/ci-pics-values b/src/app/tests/suites/certification/ci-pics-values index 3cb6b999f9ea01..a65644227d2a41 100644 --- a/src/app/tests/suites/certification/ci-pics-values +++ b/src/app/tests/suites/certification/ci-pics-values @@ -619,6 +619,8 @@ S.S.A0002=0 S.S.A0003=0 S.S.A0004=0 S.S.A0005=0 +S.S.A0006=0 +S.S.A0007=0 S.S.C00.Rsp=0 S.S.C01.Rsp=0 S.S.C02.Rsp=0 diff --git a/src/app/tests/suites/manualTests.json b/src/app/tests/suites/manualTests.json index b7e47c41445dac..ad01f9f5eb80ec 100644 --- a/src/app/tests/suites/manualTests.json +++ b/src/app/tests/suites/manualTests.json @@ -284,6 +284,7 @@ "Test_TC_S_2_1", "Test_TC_S_2_2", "Test_TC_S_2_3", + "Test_TC_S_2_4", "Test_TC_S_3_1" ], "PumpConfigurationControl": [], diff --git a/src/app/zap-templates/zcl/data-model/chip/scene.xml b/src/app/zap-templates/zcl/data-model/chip/scene.xml index d8efbe52c7ae35..c05603a8cf77c4 100644 --- a/src/app/zap-templates/zcl/data-model/chip/scene.xml +++ b/src/app/zap-templates/zcl/data-model/chip/scene.xml @@ -23,9 +23,7 @@ limitations under the License. - - - + @@ -51,7 +49,9 @@ limitations under the License. SceneValid NameSupport LastConfiguredBy - + SceneTableSize + RemainingCapacity + Add a scene to the scene table. Extension field sets are supported, and are inputed as '{"ClusterID": VALUE, "AttributeValueList":[{"AttributeId": VALUE, "AttributeValue": VALUE}]}' diff --git a/src/controller/data_model/controller-clusters.matter b/src/controller/data_model/controller-clusters.matter index c05b40f65022c3..ea82d27ad379d5 100644 --- a/src/controller/data_model/controller-clusters.matter +++ b/src/controller/data_model/controller-clusters.matter @@ -146,7 +146,7 @@ client cluster Scenes = 5 { struct AttributeValuePair { optional attrib_id attributeID = 0; - int8u attributeValue[] = 1; + int32u attributeValue = 1; } struct ExtensionFieldSet { @@ -160,6 +160,8 @@ client cluster Scenes = 5 { readonly attribute boolean sceneValid = 3; readonly attribute bitmap8 nameSupport = 4; readonly attribute optional nullable node_id lastConfiguredBy = 5; + readonly attribute int16u sceneTableSize = 6; + readonly attribute int8u remainingCapacity = 7; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; diff --git a/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java b/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java index e8210fe81f5dc4..44feb787102ab3 100644 --- a/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java +++ b/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java @@ -744,6 +744,8 @@ public enum Attribute { SceneValid(3L), NameSupport(4L), LastConfiguredBy(5L), + SceneTableSize(6L), + RemainingCapacity(7L), GeneratedCommandList(65528L), AcceptedCommandList(65529L), EventList(65530L), diff --git a/src/controller/java/generated/java/chip/devicecontroller/ClusterReadMapping.java b/src/controller/java/generated/java/chip/devicecontroller/ClusterReadMapping.java index 94b569becfe308..09cf5141a29be2 100644 --- a/src/controller/java/generated/java/chip/devicecontroller/ClusterReadMapping.java +++ b/src/controller/java/generated/java/chip/devicecontroller/ClusterReadMapping.java @@ -265,6 +265,28 @@ private static Map readScenesInteractionInfo() { readScenesLastConfiguredByCommandParams ); result.put("readLastConfiguredByAttribute", readScenesLastConfiguredByAttributeInteractionInfo); + Map readScenesSceneTableSizeCommandParams = new LinkedHashMap(); + InteractionInfo readScenesSceneTableSizeAttributeInteractionInfo = new InteractionInfo( + (cluster, callback, commandArguments) -> { + ((ChipClusters.ScenesCluster) cluster).readSceneTableSizeAttribute( + (ChipClusters.IntegerAttributeCallback) callback + ); + }, + () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(), + readScenesSceneTableSizeCommandParams + ); + result.put("readSceneTableSizeAttribute", readScenesSceneTableSizeAttributeInteractionInfo); + Map readScenesRemainingCapacityCommandParams = new LinkedHashMap(); + InteractionInfo readScenesRemainingCapacityAttributeInteractionInfo = new InteractionInfo( + (cluster, callback, commandArguments) -> { + ((ChipClusters.ScenesCluster) cluster).readRemainingCapacityAttribute( + (ChipClusters.IntegerAttributeCallback) callback + ); + }, + () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(), + readScenesRemainingCapacityCommandParams + ); + result.put("readRemainingCapacityAttribute", readScenesRemainingCapacityAttributeInteractionInfo); Map readScenesGeneratedCommandListCommandParams = new LinkedHashMap(); InteractionInfo readScenesGeneratedCommandListAttributeInteractionInfo = new InteractionInfo( (cluster, callback, commandArguments) -> { diff --git a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp index da4acdf1eeb54d..5652312cda9d94 100644 --- a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp +++ b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp @@ -455,6 +455,36 @@ jobject DecodeAttributeValue(const app::ConcreteAttributePath & aPath, TLV::TLVR } return value; } + case Attributes::SceneTableSize::Id: { + using TypeInfo = Attributes::SceneTableSize::TypeInfo; + TypeInfo::DecodableType cppValue; + *aError = app::DataModel::Decode(aReader, cppValue); + if (*aError != CHIP_NO_ERROR) + { + return nullptr; + } + jobject value; + std::string valueClassName = "java/lang/Integer"; + std::string valueCtorSignature = "(I)V"; + chip::JniReferences::GetInstance().CreateBoxedObject(valueClassName.c_str(), valueCtorSignature.c_str(), + cppValue, value); + return value; + } + case Attributes::RemainingCapacity::Id: { + using TypeInfo = Attributes::RemainingCapacity::TypeInfo; + TypeInfo::DecodableType cppValue; + *aError = app::DataModel::Decode(aReader, cppValue); + if (*aError != CHIP_NO_ERROR) + { + return nullptr; + } + jobject value; + std::string valueClassName = "java/lang/Integer"; + std::string valueCtorSignature = "(I)V"; + chip::JniReferences::GetInstance().CreateBoxedObject(valueClassName.c_str(), valueCtorSignature.c_str(), + cppValue, value); + return value; + } case Attributes::GeneratedCommandList::Id: { using TypeInfo = Attributes::GeneratedCommandList::TypeInfo; TypeInfo::DecodableType cppValue; diff --git a/src/controller/java/zap-generated/CHIPInvokeCallbacks.cpp b/src/controller/java/zap-generated/CHIPInvokeCallbacks.cpp index fed93140fc0ac8..8f2d6b7ee78977 100644 --- a/src/controller/java/zap-generated/CHIPInvokeCallbacks.cpp +++ b/src/controller/java/zap-generated/CHIPInvokeCallbacks.cpp @@ -521,19 +521,11 @@ void CHIPScenesClusterViewSceneResponseCallback::CallbackFn( newElement_3_attributeID); } jobject newElement_3_attributeValue; - chip::JniReferences::GetInstance().CreateArrayList(newElement_3_attributeValue); - - auto iter_newElement_3_attributeValue_5 = entry_3.attributeValue.begin(); - while (iter_newElement_3_attributeValue_5.Next()) - { - auto & entry_5 = iter_newElement_3_attributeValue_5.GetValue(); - jobject newElement_5; - std::string newElement_5ClassName = "java/lang/Integer"; - std::string newElement_5CtorSignature = "(I)V"; - chip::JniReferences::GetInstance().CreateBoxedObject( - newElement_5ClassName.c_str(), newElement_5CtorSignature.c_str(), entry_5, newElement_5); - chip::JniReferences::GetInstance().AddToList(newElement_3_attributeValue, newElement_5); - } + std::string newElement_3_attributeValueClassName = "java/lang/Long"; + std::string newElement_3_attributeValueCtorSignature = "(J)V"; + chip::JniReferences::GetInstance().CreateBoxedObject(newElement_3_attributeValueClassName.c_str(), + newElement_3_attributeValueCtorSignature.c_str(), + entry_3.attributeValue, newElement_3_attributeValue); jclass attributeValuePairStructClass_4; err = chip::JniReferences::GetInstance().GetClassRef( @@ -544,7 +536,7 @@ void CHIPScenesClusterViewSceneResponseCallback::CallbackFn( return; } jmethodID attributeValuePairStructCtor_4 = - env->GetMethodID(attributeValuePairStructClass_4, "", "(Ljava/util/Optional;Ljava/util/ArrayList;)V"); + env->GetMethodID(attributeValuePairStructClass_4, "", "(Ljava/util/Optional;Ljava/lang/Long;)V"); if (attributeValuePairStructCtor_4 == nullptr) { ChipLogError(Zcl, "Could not find ChipStructs$ScenesClusterAttributeValuePair constructor"); @@ -1103,19 +1095,11 @@ void CHIPScenesClusterEnhancedViewSceneResponseCallback::CallbackFn( newElement_3_attributeID); } jobject newElement_3_attributeValue; - chip::JniReferences::GetInstance().CreateArrayList(newElement_3_attributeValue); - - auto iter_newElement_3_attributeValue_5 = entry_3.attributeValue.begin(); - while (iter_newElement_3_attributeValue_5.Next()) - { - auto & entry_5 = iter_newElement_3_attributeValue_5.GetValue(); - jobject newElement_5; - std::string newElement_5ClassName = "java/lang/Integer"; - std::string newElement_5CtorSignature = "(I)V"; - chip::JniReferences::GetInstance().CreateBoxedObject( - newElement_5ClassName.c_str(), newElement_5CtorSignature.c_str(), entry_5, newElement_5); - chip::JniReferences::GetInstance().AddToList(newElement_3_attributeValue, newElement_5); - } + std::string newElement_3_attributeValueClassName = "java/lang/Long"; + std::string newElement_3_attributeValueCtorSignature = "(J)V"; + chip::JniReferences::GetInstance().CreateBoxedObject(newElement_3_attributeValueClassName.c_str(), + newElement_3_attributeValueCtorSignature.c_str(), + entry_3.attributeValue, newElement_3_attributeValue); jclass attributeValuePairStructClass_4; err = chip::JniReferences::GetInstance().GetClassRef( @@ -1126,7 +1110,7 @@ void CHIPScenesClusterEnhancedViewSceneResponseCallback::CallbackFn( return; } jmethodID attributeValuePairStructCtor_4 = - env->GetMethodID(attributeValuePairStructClass_4, "", "(Ljava/util/Optional;Ljava/util/ArrayList;)V"); + env->GetMethodID(attributeValuePairStructClass_4, "", "(Ljava/util/Optional;Ljava/lang/Long;)V"); if (attributeValuePairStructCtor_4 == nullptr) { ChipLogError(Zcl, "Could not find ChipStructs$ScenesClusterAttributeValuePair constructor"); diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java b/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java index 91b5ea6291f0cb..617763b5f12c31 100644 --- a/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java +++ b/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java @@ -945,6 +945,24 @@ public void subscribeLastConfiguredByAttribute( subscribeLastConfiguredByAttribute(chipClusterPtr, callback, minInterval, maxInterval); } + public void readSceneTableSizeAttribute(IntegerAttributeCallback callback) { + readSceneTableSizeAttribute(chipClusterPtr, callback); + } + + public void subscribeSceneTableSizeAttribute( + IntegerAttributeCallback callback, int minInterval, int maxInterval) { + subscribeSceneTableSizeAttribute(chipClusterPtr, callback, minInterval, maxInterval); + } + + public void readRemainingCapacityAttribute(IntegerAttributeCallback callback) { + readRemainingCapacityAttribute(chipClusterPtr, callback); + } + + public void subscribeRemainingCapacityAttribute( + IntegerAttributeCallback callback, int minInterval, int maxInterval) { + subscribeRemainingCapacityAttribute(chipClusterPtr, callback, minInterval, maxInterval); + } + public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) { readGeneratedCommandListAttribute(chipClusterPtr, callback); } @@ -1038,6 +1056,18 @@ private native void subscribeLastConfiguredByAttribute( int minInterval, int maxInterval); + private native void readSceneTableSizeAttribute( + long chipClusterPtr, IntegerAttributeCallback callback); + + private native void subscribeSceneTableSizeAttribute( + long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval); + + private native void readRemainingCapacityAttribute( + long chipClusterPtr, IntegerAttributeCallback callback); + + private native void subscribeRemainingCapacityAttribute( + long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval); + private native void readGeneratedCommandListAttribute( long chipClusterPtr, GeneratedCommandListAttributeCallback callback); diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ChipIdLookup.java b/src/controller/java/zap-generated/chip/devicecontroller/ChipIdLookup.java index 778858d9ac89c6..c9e41acc7b91d3 100644 --- a/src/controller/java/zap-generated/chip/devicecontroller/ChipIdLookup.java +++ b/src/controller/java/zap-generated/chip/devicecontroller/ChipIdLookup.java @@ -474,6 +474,12 @@ public static String attributeIdToName(long clusterId, long attributeId) { if (attributeId == 5L) { return "LastConfiguredBy"; } + if (attributeId == 6L) { + return "SceneTableSize"; + } + if (attributeId == 7L) { + return "RemainingCapacity"; + } if (attributeId == 65528L) { return "GeneratedCommandList"; } diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ChipStructs.java b/src/controller/java/zap-generated/chip/devicecontroller/ChipStructs.java index a039df15f6aa64..0fea3804b54e07 100644 --- a/src/controller/java/zap-generated/chip/devicecontroller/ChipStructs.java +++ b/src/controller/java/zap-generated/chip/devicecontroller/ChipStructs.java @@ -26,10 +26,9 @@ public class ChipStructs { public static class ScenesClusterAttributeValuePair { public Optional attributeID; - public ArrayList attributeValue; + public Long attributeValue; - public ScenesClusterAttributeValuePair( - Optional attributeID, ArrayList attributeValue) { + public ScenesClusterAttributeValuePair(Optional attributeID, Long attributeValue) { this.attributeID = attributeID; this.attributeValue = attributeValue; } diff --git a/src/controller/python/chip/clusters/CHIPClusters.py b/src/controller/python/chip/clusters/CHIPClusters.py index 67fbf685e3dcec..6f70b15dc8886d 100644 --- a/src/controller/python/chip/clusters/CHIPClusters.py +++ b/src/controller/python/chip/clusters/CHIPClusters.py @@ -325,6 +325,18 @@ class ChipClusters: "type": "int", "reportable": True, }, + 0x00000006: { + "attributeName": "SceneTableSize", + "attributeId": 0x00000006, + "type": "int", + "reportable": True, + }, + 0x00000007: { + "attributeName": "RemainingCapacity", + "attributeId": 0x00000007, + "type": "int", + "reportable": True, + }, 0x0000FFF8: { "attributeName": "GeneratedCommandList", "attributeId": 0x0000FFF8, diff --git a/src/controller/python/chip/clusters/Objects.py b/src/controller/python/chip/clusters/Objects.py index 4960641ad7c615..48d94a7c929106 100644 --- a/src/controller/python/chip/clusters/Objects.py +++ b/src/controller/python/chip/clusters/Objects.py @@ -596,6 +596,8 @@ def descriptor(cls) -> ClusterObjectDescriptor: ClusterObjectFieldDescriptor(Label="sceneValid", Tag=0x00000003, Type=bool), ClusterObjectFieldDescriptor(Label="nameSupport", Tag=0x00000004, Type=uint), ClusterObjectFieldDescriptor(Label="lastConfiguredBy", Tag=0x00000005, Type=typing.Union[None, Nullable, uint]), + ClusterObjectFieldDescriptor(Label="sceneTableSize", Tag=0x00000006, Type=uint), + ClusterObjectFieldDescriptor(Label="remainingCapacity", Tag=0x00000007, Type=uint), ClusterObjectFieldDescriptor(Label="generatedCommandList", Tag=0x0000FFF8, Type=typing.List[uint]), ClusterObjectFieldDescriptor(Label="acceptedCommandList", Tag=0x0000FFF9, Type=typing.List[uint]), ClusterObjectFieldDescriptor(Label="eventList", Tag=0x0000FFFA, Type=typing.List[uint]), @@ -610,6 +612,8 @@ def descriptor(cls) -> ClusterObjectDescriptor: sceneValid: 'bool' = None nameSupport: 'uint' = None lastConfiguredBy: 'typing.Union[None, Nullable, uint]' = None + sceneTableSize: 'uint' = None + remainingCapacity: 'uint' = None generatedCommandList: 'typing.List[uint]' = None acceptedCommandList: 'typing.List[uint]' = None eventList: 'typing.List[uint]' = None @@ -632,11 +636,11 @@ def descriptor(cls) -> ClusterObjectDescriptor: return ClusterObjectDescriptor( Fields=[ ClusterObjectFieldDescriptor(Label="attributeID", Tag=0, Type=typing.Optional[uint]), - ClusterObjectFieldDescriptor(Label="attributeValue", Tag=1, Type=typing.List[uint]), + ClusterObjectFieldDescriptor(Label="attributeValue", Tag=1, Type=uint), ]) attributeID: 'typing.Optional[uint]' = None - attributeValue: 'typing.List[uint]' = field(default_factory=lambda: []) + attributeValue: 'uint' = 0 @dataclass class ExtensionFieldSet(ClusterObject): @@ -1137,6 +1141,38 @@ def attribute_type(cls) -> ClusterObjectFieldDescriptor: value: 'typing.Union[None, Nullable, uint]' = None + @dataclass + class SceneTableSize(ClusterAttributeDescriptor): + @ChipUtility.classproperty + def cluster_id(cls) -> int: + return 0x0005 + + @ChipUtility.classproperty + def attribute_id(cls) -> int: + return 0x00000006 + + @ChipUtility.classproperty + def attribute_type(cls) -> ClusterObjectFieldDescriptor: + return ClusterObjectFieldDescriptor(Type=uint) + + value: 'uint' = 0 + + @dataclass + class RemainingCapacity(ClusterAttributeDescriptor): + @ChipUtility.classproperty + def cluster_id(cls) -> int: + return 0x0005 + + @ChipUtility.classproperty + def attribute_id(cls) -> int: + return 0x00000007 + + @ChipUtility.classproperty + def attribute_type(cls) -> ClusterObjectFieldDescriptor: + return ClusterObjectFieldDescriptor(Type=uint) + + value: 'uint' = 0 + @dataclass class GeneratedCommandList(ClusterAttributeDescriptor): @ChipUtility.classproperty diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeSpecifiedCheck.mm b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeSpecifiedCheck.mm index 39d62ceb9389e5..214ec3ea26c7c4 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeSpecifiedCheck.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeSpecifiedCheck.mm @@ -108,6 +108,12 @@ static BOOL AttributeIsSpecifiedInScenesCluster(AttributeId aAttributeId) case Attributes::LastConfiguredBy::Id: { return YES; } + case Attributes::SceneTableSize::Id: { + return YES; + } + case Attributes::RemainingCapacity::Id: { + return YES; + } case Attributes::GeneratedCommandList::Id: { return YES; } diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm index e8c48538eebe59..2b0f47983a3736 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm @@ -412,6 +412,28 @@ static id _Nullable DecodeAttributeValueForScenesCluster(AttributeId aAttributeI } return value; } + case Attributes::SceneTableSize::Id: { + using TypeInfo = Attributes::SceneTableSize::TypeInfo; + TypeInfo::DecodableType cppValue; + *aError = DataModel::Decode(aReader, cppValue); + if (*aError != CHIP_NO_ERROR) { + return nil; + } + NSNumber * _Nonnull value; + value = [NSNumber numberWithUnsignedShort:cppValue]; + return value; + } + case Attributes::RemainingCapacity::Id: { + using TypeInfo = Attributes::RemainingCapacity::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 d03181eea53726..30c553c5d53bcd 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h @@ -501,6 +501,30 @@ API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) (void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); +- (void)readAttributeSceneTableSizeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion + MTR_NEWLY_AVAILABLE; +- (void)subscribeAttributeSceneTableSizeWithParams:(MTRSubscribeParams *)params + subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler + MTR_NEWLY_AVAILABLE; ++ (void)readAttributeSceneTableSizeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer + endpoint:(NSNumber *)endpoint + queue:(dispatch_queue_t)queue + completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion + MTR_NEWLY_AVAILABLE; + +- (void)readAttributeRemainingCapacityWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion + MTR_NEWLY_AVAILABLE; +- (void)subscribeAttributeRemainingCapacityWithParams:(MTRSubscribeParams *)params + subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler + MTR_NEWLY_AVAILABLE; ++ (void)readAttributeRemainingCapacityWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer + endpoint:(NSNumber *)endpoint + queue:(dispatch_queue_t)queue + completion:(void (^)(NSNumber * _Nullable value, + NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; + - (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm index 4664c58f278284..86ab427ba3c300 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm @@ -1821,30 +1821,7 @@ - (void)addSceneWithParams:(MTRScenesClusterAddSceneParams *)params auto & definedValue_4 = listHolder_2->mList[i_2].attributeID.Emplace(); definedValue_4 = element_2.attributeID.unsignedIntValue; } - { - using ListType_4 - = std::remove_reference_tmList[i_2].attributeValue)>; - using ListMemberType_4 = ListMemberTypeGetter::Type; - if (element_2.attributeValue.count != 0) { - auto * listHolder_4 = new ListHolder(element_2.attributeValue.count); - if (listHolder_4 == nullptr || listHolder_4->mList == nullptr) { - return CHIP_ERROR_INVALID_ARGUMENT; - } - listFreer.add(listHolder_4); - for (size_t i_4 = 0; i_4 < element_2.attributeValue.count; ++i_4) { - if (![element_2.attributeValue[i_4] isKindOfClass:[NSNumber class]]) { - // Wrong kind of value. - return CHIP_ERROR_INVALID_ARGUMENT; - } - auto element_4 = (NSNumber *) element_2.attributeValue[i_4]; - listHolder_4->mList[i_4] = element_4.unsignedCharValue; - } - listHolder_2->mList[i_2].attributeValue - = ListType_4(listHolder_4->mList, element_2.attributeValue.count); - } else { - listHolder_2->mList[i_2].attributeValue = ListType_4(); - } - } + listHolder_2->mList[i_2].attributeValue = element_2.attributeValue.unsignedIntValue; } listHolder_0->mList[i_0].attributeValueList = ListType_2(listHolder_2->mList, element_0.attributeValueList.count); @@ -2153,30 +2130,7 @@ - (void)enhancedAddSceneWithParams:(MTRScenesClusterEnhancedAddSceneParams *)par auto & definedValue_4 = listHolder_2->mList[i_2].attributeID.Emplace(); definedValue_4 = element_2.attributeID.unsignedIntValue; } - { - using ListType_4 - = std::remove_reference_tmList[i_2].attributeValue)>; - using ListMemberType_4 = ListMemberTypeGetter::Type; - if (element_2.attributeValue.count != 0) { - auto * listHolder_4 = new ListHolder(element_2.attributeValue.count); - if (listHolder_4 == nullptr || listHolder_4->mList == nullptr) { - return CHIP_ERROR_INVALID_ARGUMENT; - } - listFreer.add(listHolder_4); - for (size_t i_4 = 0; i_4 < element_2.attributeValue.count; ++i_4) { - if (![element_2.attributeValue[i_4] isKindOfClass:[NSNumber class]]) { - // Wrong kind of value. - return CHIP_ERROR_INVALID_ARGUMENT; - } - auto element_4 = (NSNumber *) element_2.attributeValue[i_4]; - listHolder_4->mList[i_4] = element_4.unsignedCharValue; - } - listHolder_2->mList[i_2].attributeValue - = ListType_4(listHolder_4->mList, element_2.attributeValue.count); - } else { - listHolder_2->mList[i_2].attributeValue = ListType_4(); - } - } + listHolder_2->mList[i_2].attributeValue = element_2.attributeValue.unsignedIntValue; } listHolder_0->mList[i_0].attributeValueList = ListType_2(listHolder_2->mList, element_0.attributeValueList.count); @@ -2530,6 +2484,93 @@ + (void)readAttributeLastConfiguredByWithClusterStateCache:(MTRClusterStateCache }); } +- (void)readAttributeSceneTableSizeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion +{ + MTRReadParams * params = [[MTRReadParams alloc] init]; + using TypeInfo = Scenes::Attributes::SceneTableSize::TypeInfo; + return MTRReadAttribute( + params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId()); +} + +- (void)subscribeAttributeSceneTableSizeWithParams:(MTRSubscribeParams * _Nonnull)params + subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler +{ + using TypeInfo = Scenes::Attributes::SceneTableSize::TypeInfo; + MTRSubscribeAttribute(params, + subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), + TypeInfo::GetAttributeId()); +} + ++ (void)readAttributeSceneTableSizeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer + endpoint:(NSNumber *)endpoint + queue:(dispatch_queue_t)queue + completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion +{ + auto * bridge = new MTRInt16uAttributeCallbackBridge(queue, completion); + std::move(*bridge).DispatchLocalAction( + clusterStateCacheContainer.baseDevice, ^(Int16uAttributeCallback successCb, MTRErrorCallback failureCb) { + if (clusterStateCacheContainer.cppClusterStateCache) { + chip::app::ConcreteAttributePath path; + using TypeInfo = Scenes::Attributes::SceneTableSize::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); + if (err == CHIP_NO_ERROR) { + successCb(bridge, value); + } + return err; + } + return CHIP_ERROR_NOT_FOUND; + }); +} + +- (void)readAttributeRemainingCapacityWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion +{ + MTRReadParams * params = [[MTRReadParams alloc] init]; + using TypeInfo = Scenes::Attributes::RemainingCapacity::TypeInfo; + return MTRReadAttribute( + params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId()); +} + +- (void)subscribeAttributeRemainingCapacityWithParams:(MTRSubscribeParams * _Nonnull)params + subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler +{ + using TypeInfo = Scenes::Attributes::RemainingCapacity::TypeInfo; + MTRSubscribeAttribute(params, + subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), + TypeInfo::GetAttributeId()); +} + ++ (void)readAttributeRemainingCapacityWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer + endpoint:(NSNumber *)endpoint + queue:(dispatch_queue_t)queue + completion: + (void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion +{ + auto * bridge = new MTRInt8uAttributeCallbackBridge(queue, completion); + std::move(*bridge).DispatchLocalAction( + clusterStateCacheContainer.baseDevice, ^(Int8uAttributeCallback successCb, MTRErrorCallback failureCb) { + if (clusterStateCacheContainer.cppClusterStateCache) { + chip::app::ConcreteAttributePath path; + using TypeInfo = Scenes::Attributes::RemainingCapacity::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); + if (err == CHIP_NO_ERROR) { + successCb(bridge, value); + } + return err; + } + return CHIP_ERROR_NOT_FOUND; + }); +} + - (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion { MTRReadParams * params = [[MTRReadParams alloc] init]; diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h index a5faf0318c819d..6a111ed79f2972 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h @@ -527,6 +527,8 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { = 0x00000004, MTRAttributeIDTypeClusterScenesAttributeLastConfiguredByID API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000005, + MTRAttributeIDTypeClusterScenesAttributeSceneTableSizeID MTR_NEWLY_AVAILABLE = 0x00000006, + MTRAttributeIDTypeClusterScenesAttributeRemainingCapacityID MTR_NEWLY_AVAILABLE = 0x00000007, MTRAttributeIDTypeClusterScenesAttributeGeneratedCommandListID API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, MTRAttributeIDTypeClusterScenesAttributeAcceptedCommandListID API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h index 3a9c6f183d2461..2bcd2f9948ffff 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h @@ -241,6 +241,10 @@ API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) - (NSDictionary *)readAttributeLastConfiguredByWithParams:(MTRReadParams * _Nullable)params API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); +- (NSDictionary *)readAttributeSceneTableSizeWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; + +- (NSDictionary *)readAttributeRemainingCapacityWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; + - (NSDictionary *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm index 282b9722396a6c..961d9946fb1f46 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm @@ -1043,31 +1043,7 @@ - (void)addSceneWithParams:(MTRScenesClusterAddSceneParams *)params auto & definedValue_4 = listHolder_2->mList[i_2].attributeID.Emplace(); definedValue_4 = element_2.attributeID.unsignedIntValue; } - { - using ListType_4 - = std::remove_reference_tmList[i_2].attributeValue)>; - using ListMemberType_4 = ListMemberTypeGetter::Type; - if (element_2.attributeValue.count != 0) { - auto * listHolder_4 - = new ListHolder(element_2.attributeValue.count); - if (listHolder_4 == nullptr || listHolder_4->mList == nullptr) { - return CHIP_ERROR_INVALID_ARGUMENT; - } - listFreer.add(listHolder_4); - for (size_t i_4 = 0; i_4 < element_2.attributeValue.count; ++i_4) { - if (![element_2.attributeValue[i_4] isKindOfClass:[NSNumber class]]) { - // Wrong kind of value. - return CHIP_ERROR_INVALID_ARGUMENT; - } - auto element_4 = (NSNumber *) element_2.attributeValue[i_4]; - listHolder_4->mList[i_4] = element_4.unsignedCharValue; - } - listHolder_2->mList[i_2].attributeValue - = ListType_4(listHolder_4->mList, element_2.attributeValue.count); - } else { - listHolder_2->mList[i_2].attributeValue = ListType_4(); - } - } + listHolder_2->mList[i_2].attributeValue = element_2.attributeValue.unsignedIntValue; } listHolder_0->mList[i_0].attributeValueList = ListType_2(listHolder_2->mList, element_0.attributeValueList.count); @@ -1619,31 +1595,7 @@ - (void)enhancedAddSceneWithParams:(MTRScenesClusterEnhancedAddSceneParams *)par auto & definedValue_4 = listHolder_2->mList[i_2].attributeID.Emplace(); definedValue_4 = element_2.attributeID.unsignedIntValue; } - { - using ListType_4 - = std::remove_reference_tmList[i_2].attributeValue)>; - using ListMemberType_4 = ListMemberTypeGetter::Type; - if (element_2.attributeValue.count != 0) { - auto * listHolder_4 - = new ListHolder(element_2.attributeValue.count); - if (listHolder_4 == nullptr || listHolder_4->mList == nullptr) { - return CHIP_ERROR_INVALID_ARGUMENT; - } - listFreer.add(listHolder_4); - for (size_t i_4 = 0; i_4 < element_2.attributeValue.count; ++i_4) { - if (![element_2.attributeValue[i_4] isKindOfClass:[NSNumber class]]) { - // Wrong kind of value. - return CHIP_ERROR_INVALID_ARGUMENT; - } - auto element_4 = (NSNumber *) element_2.attributeValue[i_4]; - listHolder_4->mList[i_4] = element_4.unsignedCharValue; - } - listHolder_2->mList[i_2].attributeValue - = ListType_4(listHolder_4->mList, element_2.attributeValue.count); - } else { - listHolder_2->mList[i_2].attributeValue = ListType_4(); - } - } + listHolder_2->mList[i_2].attributeValue = element_2.attributeValue.unsignedIntValue; } listHolder_0->mList[i_0].attributeValueList = ListType_2(listHolder_2->mList, element_0.attributeValueList.count); @@ -1869,6 +1821,22 @@ - (void)copySceneWithParams:(MTRScenesClusterCopySceneParams *)params params:params]; } +- (NSDictionary *)readAttributeSceneTableSizeWithParams:(MTRReadParams * _Nullable)params +{ + return [self.device readAttributeWithEndpointID:@(_endpoint) + clusterID:@(MTRClusterIDTypeScenesID) + attributeID:@(MTRAttributeIDTypeClusterScenesAttributeSceneTableSizeID) + params:params]; +} + +- (NSDictionary *)readAttributeRemainingCapacityWithParams:(MTRReadParams * _Nullable)params +{ + return [self.device readAttributeWithEndpointID:@(_endpoint) + clusterID:@(MTRClusterIDTypeScenesID) + attributeID:@(MTRAttributeIDTypeClusterScenesAttributeRemainingCapacityID) + params:params]; +} + - (NSDictionary *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params { return [self.device readAttributeWithEndpointID:@(_endpoint) diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm index 5e9e298fa5b733..71ab972068f489 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm @@ -1119,21 +1119,7 @@ - (CHIP_ERROR)_setFieldsFromDecodableStruct: } else { newElement_3.attributeID = nil; } - { // Scope for our temporary variables - auto * array_5 = [NSMutableArray new]; - auto iter_5 = entry_3.attributeValue.begin(); - while (iter_5.Next()) { - auto & entry_5 = iter_5.GetValue(); - NSNumber * newElement_5; - newElement_5 = [NSNumber numberWithUnsignedChar:entry_5]; - [array_5 addObject:newElement_5]; - } - CHIP_ERROR err = iter_5.GetStatus(); - if (err != CHIP_NO_ERROR) { - return err; - } - newElement_3.attributeValue = array_5; - } + newElement_3.attributeValue = [NSNumber numberWithUnsignedInt:entry_3.attributeValue]; [array_3 addObject:newElement_3]; } CHIP_ERROR err = iter_3.GetStatus(); @@ -2284,21 +2270,7 @@ - (CHIP_ERROR)_setFieldsFromDecodableStruct: } else { newElement_3.attributeID = nil; } - { // Scope for our temporary variables - auto * array_5 = [NSMutableArray new]; - auto iter_5 = entry_3.attributeValue.begin(); - while (iter_5.Next()) { - auto & entry_5 = iter_5.GetValue(); - NSNumber * newElement_5; - newElement_5 = [NSNumber numberWithUnsignedChar:entry_5]; - [array_5 addObject:newElement_5]; - } - CHIP_ERROR err = iter_5.GetStatus(); - if (err != CHIP_NO_ERROR) { - return err; - } - newElement_3.attributeValue = array_5; - } + newElement_3.attributeValue = [NSNumber numberWithUnsignedInt:entry_3.attributeValue]; [array_3 addObject:newElement_3]; } CHIP_ERROR err = iter_3.GetStatus(); diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h index e4be21e114dba3..a61ee5b0006168 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h @@ -24,7 +24,7 @@ API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy) NSNumber * _Nullable attributeID API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); @property (nonatomic, copy) NSNumber * _Nullable attributeId MTR_DEPRECATED( "Please use attributeID", ios(16.1, 16.4), macos(13.0, 13.3), watchos(9.1, 9.4), tvos(16.1, 16.4)); -@property (nonatomic, copy) NSArray * _Nonnull attributeValue API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); +@property (nonatomic, copy) NSNumber * _Nonnull attributeValue API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); @end API_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 a2f6fce25c9eee..082e2ea0c1f1c1 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm @@ -26,7 +26,7 @@ - (instancetype)init _attributeID = nil; - _attributeValue = [NSArray array]; + _attributeValue = @(0); } return self; } 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 ac7008e0f93553..1b4e9e6228c3fa 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 @@ -475,6 +475,68 @@ EmberAfStatus Set(chip::EndpointId endpoint, const chip::app::DataModel::Nullabl } // namespace LastConfiguredBy +namespace SceneTableSize { + +EmberAfStatus Get(chip::EndpointId endpoint, uint16_t * value) +{ + using Traits = NumericAttributeTraits; + Traits::StorageType temp; + uint8_t * readable = Traits::ToAttributeStoreRepresentation(temp); + EmberAfStatus status = emberAfReadAttribute(endpoint, Clusters::Scenes::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, uint16_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 emberAfWriteAttribute(endpoint, Clusters::Scenes::Id, Id, writable, ZCL_INT16U_ATTRIBUTE_TYPE); +} + +} // namespace SceneTableSize + +namespace RemainingCapacity { + +EmberAfStatus Get(chip::EndpointId endpoint, uint8_t * value) +{ + using Traits = NumericAttributeTraits; + Traits::StorageType temp; + uint8_t * readable = Traits::ToAttributeStoreRepresentation(temp); + EmberAfStatus status = emberAfReadAttribute(endpoint, Clusters::Scenes::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 emberAfWriteAttribute(endpoint, Clusters::Scenes::Id, Id, writable, ZCL_INT8U_ATTRIBUTE_TYPE); +} + +} // namespace RemainingCapacity + 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 8885bdcfb3694c..2ea2774cfa89c9 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 @@ -116,6 +116,16 @@ EmberAfStatus SetNull(chip::EndpointId endpoint); EmberAfStatus Set(chip::EndpointId endpoint, const chip::app::DataModel::Nullable & value); } // namespace LastConfiguredBy +namespace SceneTableSize { +EmberAfStatus Get(chip::EndpointId endpoint, uint16_t * value); // int16u +EmberAfStatus Set(chip::EndpointId endpoint, uint16_t value); +} // namespace SceneTableSize + +namespace RemainingCapacity { +EmberAfStatus Get(chip::EndpointId endpoint, uint8_t * value); // int8u +EmberAfStatus Set(chip::EndpointId endpoint, uint8_t value); +} // namespace RemainingCapacity + 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 6bd48bbe03e592..2ae5a2a6bd892e 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 @@ -1665,6 +1665,12 @@ CHIP_ERROR TypeInfo::DecodableType::Decode(TLV::TLVReader & reader, const Concre case Attributes::LastConfiguredBy::TypeInfo::GetAttributeId(): ReturnErrorOnFailure(DataModel::Decode(reader, lastConfiguredBy)); break; + case Attributes::SceneTableSize::TypeInfo::GetAttributeId(): + ReturnErrorOnFailure(DataModel::Decode(reader, sceneTableSize)); + break; + case Attributes::RemainingCapacity::TypeInfo::GetAttributeId(): + ReturnErrorOnFailure(DataModel::Decode(reader, remainingCapacity)); + 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 9f54830f4b4766..ba6e7dacdbbb4d 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 @@ -821,23 +821,16 @@ struct Type { public: Optional attributeID; - DataModel::List attributeValue; + uint32_t attributeValue = static_cast(0); + + CHIP_ERROR Decode(TLV::TLVReader & reader); static constexpr bool kIsFabricScoped = false; CHIP_ERROR Encode(TLV::TLVWriter & writer, TLV::Tag tag) const; }; -struct DecodableType -{ -public: - Optional attributeID; - DataModel::DecodableList attributeValue; - - CHIP_ERROR Decode(TLV::TLVReader & reader); - - static constexpr bool kIsFabricScoped = false; -}; +using DecodableType = Type; } // namespace AttributeValuePair namespace ExtensionFieldSet { @@ -1783,6 +1776,30 @@ struct TypeInfo static constexpr bool MustUseTimedWrite() { return false; } }; } // namespace LastConfiguredBy +namespace SceneTableSize { +struct TypeInfo +{ + using Type = uint16_t; + using DecodableType = uint16_t; + using DecodableArgType = uint16_t; + + static constexpr ClusterId GetClusterId() { return Clusters::Scenes::Id; } + static constexpr AttributeId GetAttributeId() { return Attributes::SceneTableSize::Id; } + static constexpr bool MustUseTimedWrite() { return false; } +}; +} // namespace SceneTableSize +namespace RemainingCapacity { +struct TypeInfo +{ + using Type = uint8_t; + using DecodableType = uint8_t; + using DecodableArgType = uint8_t; + + static constexpr ClusterId GetClusterId() { return Clusters::Scenes::Id; } + static constexpr AttributeId GetAttributeId() { return Attributes::RemainingCapacity::Id; } + static constexpr bool MustUseTimedWrite() { return false; } +}; +} // namespace RemainingCapacity namespace GeneratedCommandList { struct TypeInfo : public Clusters::Globals::Attributes::GeneratedCommandList::TypeInfo { @@ -1834,6 +1851,8 @@ struct TypeInfo Attributes::SceneValid::TypeInfo::DecodableType sceneValid = static_cast(0); Attributes::NameSupport::TypeInfo::DecodableType nameSupport = static_cast(0); Attributes::LastConfiguredBy::TypeInfo::DecodableType lastConfiguredBy; + Attributes::SceneTableSize::TypeInfo::DecodableType sceneTableSize = static_cast(0); + Attributes::RemainingCapacity::TypeInfo::DecodableType remainingCapacity = static_cast(0); Attributes::GeneratedCommandList::TypeInfo::DecodableType generatedCommandList; Attributes::AcceptedCommandList::TypeInfo::DecodableType acceptedCommandList; Attributes::EventList::TypeInfo::DecodableType eventList; 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 b8dd75e35780fa..9bac487c0e5e17 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 @@ -154,6 +154,14 @@ namespace LastConfiguredBy { static constexpr AttributeId Id = 0x00000005; } // namespace LastConfiguredBy +namespace SceneTableSize { +static constexpr AttributeId Id = 0x00000006; +} // namespace SceneTableSize + +namespace RemainingCapacity { +static constexpr AttributeId Id = 0x00000007; +} // namespace RemainingCapacity + 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 ab0969124923b5..d5b2dbb52af1e5 100644 --- a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h +++ b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h @@ -468,6 +468,8 @@ class GroupsAddGroupIfIdentifying : public ClusterCommand | * SceneValid | 0x0003 | | * NameSupport | 0x0004 | | * LastConfiguredBy | 0x0005 | +| * SceneTableSize | 0x0006 | +| * RemainingCapacity | 0x0007 | | * GeneratedCommandList | 0xFFF8 | | * AcceptedCommandList | 0xFFF9 | | * EventList | 0xFFFA | @@ -10589,6 +10591,8 @@ void registerClusterScenes(Commands & commands, CredentialIssuerCommands * creds make_unique(Id, "scene-valid", Attributes::SceneValid::Id, credsIssuerConfig), // make_unique(Id, "name-support", Attributes::NameSupport::Id, credsIssuerConfig), // make_unique(Id, "last-configured-by", Attributes::LastConfiguredBy::Id, credsIssuerConfig), // + make_unique(Id, "scene-table-size", Attributes::SceneTableSize::Id, credsIssuerConfig), // + make_unique(Id, "remaining-capacity", Attributes::RemainingCapacity::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, "event-list", Attributes::EventList::Id, credsIssuerConfig), // @@ -10609,6 +10613,10 @@ void registerClusterScenes(Commands & commands, CredentialIssuerCommands * creds make_unique>>( Id, "last-configured-by", 0, UINT64_MAX, Attributes::LastConfiguredBy::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "scene-table-size", 0, UINT16_MAX, Attributes::SceneTableSize::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "remaining-capacity", 0, UINT8_MAX, Attributes::RemainingCapacity::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>>( Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // @@ -10629,6 +10637,8 @@ void registerClusterScenes(Commands & commands, CredentialIssuerCommands * creds make_unique(Id, "scene-valid", Attributes::SceneValid::Id, credsIssuerConfig), // make_unique(Id, "name-support", Attributes::NameSupport::Id, credsIssuerConfig), // make_unique(Id, "last-configured-by", Attributes::LastConfiguredBy::Id, credsIssuerConfig), // + make_unique(Id, "scene-table-size", Attributes::SceneTableSize::Id, credsIssuerConfig), // + make_unique(Id, "remaining-capacity", Attributes::RemainingCapacity::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, "event-list", Attributes::EventList::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 4ca14a7cb6736d..81653db806d80a 100644 --- a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp +++ b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp @@ -4835,6 +4835,16 @@ CHIP_ERROR DataModelLogger::LogAttribute(const chip::app::ConcreteDataAttributeP ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); return DataModelLogger::LogValue("LastConfiguredBy", 1, value); } + case Scenes::Attributes::SceneTableSize::Id: { + uint16_t value; + ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); + return DataModelLogger::LogValue("SceneTableSize", 1, value); + } + case Scenes::Attributes::RemainingCapacity::Id: { + uint8_t value; + ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); + return DataModelLogger::LogValue("RemainingCapacity", 1, value); + } case Scenes::Attributes::GeneratedCommandList::Id: { chip::app::DataModel::DecodableList value; ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); diff --git a/zzz_generated/chip-tool/zap-generated/test/Commands.h b/zzz_generated/chip-tool/zap-generated/test/Commands.h index 636d4b970ae1d4..5abc3d5e1515fb 100644 --- a/zzz_generated/chip-tool/zap-generated/test/Commands.h +++ b/zzz_generated/chip-tool/zap-generated/test/Commands.h @@ -538,6 +538,7 @@ class ManualTestList : public Command printf("Test_TC_S_2_1\n"); printf("Test_TC_S_2_2\n"); printf("Test_TC_S_2_3\n"); + printf("Test_TC_S_2_4\n"); printf("Test_TC_S_3_1\n"); printf("Test_TC_ACL_2_5\n"); printf("Test_TC_ACL_2_6\n"); @@ -118601,7 +118602,7 @@ class Test_TC_S_1_1Suite : public TestCommand class Test_TC_S_2_1Suite : public TestCommand { public: - Test_TC_S_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_1", 0, credsIssuerConfig) + Test_TC_S_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_1", 10, credsIssuerConfig) { AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); AddArgument("cluster", &mCluster); @@ -118634,6 +118635,84 @@ class Test_TC_S_2_1Suite : public TestCommand switch (mTestIndex - 1) { + case 0: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 1: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + uint8_t value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u")); + } + break; + case 2: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + uint8_t value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u")); + } + break; + case 3: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::GroupId value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckConstraintType("value", "group_id", "groupid")); + } + break; + case 4: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + bool value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckConstraintType("value", "boolean", "uint8")); + } + break; + case 5: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + uint8_t value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("nameSupport", value, 128U)); + VerifyOrReturn(CheckConstraintType("value", "bitmap8", "uint8")); + } + break; + case 6: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + uint8_t value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("nameSupport", value, 0U)); + VerifyOrReturn(CheckConstraintType("value", "bitmap8", "uint8")); + } + break; + case 7: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::DataModel::Nullable value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckConstraintType("value", "node_id", "nodeId")); + } + break; + case 8: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + uint16_t value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckConstraintType("value", "int16u", "uint16")); + } + break; + case 9: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + uint8_t value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckConstraintType("value", "int8u", "uint8")); + } + break; default: LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); } @@ -118648,7 +118727,69 @@ class Test_TC_S_2_1Suite : public TestCommand { using namespace chip::app::Clusters; switch (testIndex) - {} + { + case 0: { + LogStep(0, "Wait for the commissioned device to be retrieved"); + ListFreer listFreer; + chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value; + value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL; + return WaitForCommissionee(kIdentityAlpha, value); + } + case 1: { + LogStep(1, "TH reads from the DUT the (0x0000) SceneCount attribute"); + VerifyOrDo(!ShouldSkip("S.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneCount::Id, true, + chip::NullOptional); + } + case 2: { + LogStep(2, "TH reads from the DUT the (0x0001) CurrentScene attribute"); + VerifyOrDo(!ShouldSkip("S.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::CurrentScene::Id, true, + chip::NullOptional); + } + case 3: { + LogStep(3, "TH reads from the DUT the (0x0002) CurrentGroup attribute"); + VerifyOrDo(!ShouldSkip("S.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::CurrentGroup::Id, true, + chip::NullOptional); + } + case 4: { + LogStep(4, "TH reads from the DUT the (0x0003) SceneValid attribute"); + VerifyOrDo(!ShouldSkip("S.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneValid::Id, true, + chip::NullOptional); + } + case 5: { + LogStep(5, "TH reads from the DUT the (0x0004) NameSupport attribute"); + VerifyOrDo(!ShouldSkip("S.S.A0003 && S.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::NameSupport::Id, true, + chip::NullOptional); + } + case 6: { + LogStep(6, "TH reads from the DUT the (0x0004) NameSupport attribute"); + VerifyOrDo(!ShouldSkip("S.S.A0004 && (!S.S.F00)"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::NameSupport::Id, true, + chip::NullOptional); + } + case 7: { + LogStep(7, "TH reads from the DUT the (0x0005) LastConfiguredBy attribute"); + VerifyOrDo(!ShouldSkip("S.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::LastConfiguredBy::Id, true, + chip::NullOptional); + } + case 8: { + LogStep(8, "TH reads from the DUT the (0x0006) SceneTableSize attribute"); + VerifyOrDo(!ShouldSkip("S.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneTableSize::Id, true, + chip::NullOptional); + } + case 9: { + LogStep(9, "TH reads from the DUT the (0x0007) RemainingCapacity attribute"); + VerifyOrDo(!ShouldSkip("S.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::RemainingCapacity::Id, true, + chip::NullOptional); + } + } return CHIP_NO_ERROR; } }; @@ -118656,7 +118797,7 @@ class Test_TC_S_2_1Suite : public TestCommand class Test_TC_S_2_2Suite : public TestCommand { public: - Test_TC_S_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_2", 0, credsIssuerConfig) + Test_TC_S_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_2", 50, credsIssuerConfig) { AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); AddArgument("cluster", &mCluster); @@ -118677,6 +118818,8 @@ class Test_TC_S_2_2Suite : public TestCommand chip::Optional mEndpoint; chip::Optional mTimeout; + uint16_t maxScenes; + chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } // @@ -118689,6 +118832,426 @@ class Test_TC_S_2_2Suite : public TestCommand switch (mTestIndex - 1) { + case 0: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 1: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 2: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + uint16_t value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + maxScenes = value; + } + break; + case 3: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 4: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 5: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + } + break; + case 6: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::RemoveAllScenesResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + } + break; + case 7: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValueNonNull("capacity", value.capacity)); + VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), (maxScenes / 2))); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + } + break; + case 8: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 9: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 10: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::StoreSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U)); + } + break; + case 11: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 12: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 13: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 14: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + uint8_t value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("sceneCount", value, 1U)); + VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u")); + } + break; + case 15: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + uint8_t value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("currentScene", value, 1U)); + VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u")); + } + break; + case 16: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::GroupId value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("currentGroup", value, 1U)); + VerifyOrReturn(CheckConstraintType("value", "group_id", "groupid")); + } + break; + case 17: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + bool value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("sceneValid", value, true)); + VerifyOrReturn(CheckConstraintType("value", "boolean", "uint8")); + } + break; + case 18: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 19: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 20: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 21: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 22: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 23: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::ViewSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U)); + VerifyOrReturn(CheckValuePresent("transitionTime", value.transitionTime)); + VerifyOrReturn(CheckValue("transitionTime.Value()", value.transitionTime.Value(), 0U)); + VerifyOrReturn(CheckValuePresent("extensionFieldSets", value.extensionFieldSets)); + { + auto iter_1 = value.extensionFieldSets.Value().begin(); + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()", iter_1, 0)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].clusterID", iter_1.GetValue().clusterID, 6UL)); + { + auto iter_3 = iter_1.GetValue().attributeValueList.begin(); + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()[0].attributeValueList", iter_3, 0)); + VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[0].attributeValueList[0].attributeID", + iter_3.GetValue().attributeID)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].attributeValueList[0].attributeID.Value()", + iter_3.GetValue().attributeID.Value(), 0UL)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].attributeValueList[0].attributeValue", + iter_3.GetValue().attributeValue, 1UL)); + VerifyOrReturn(CheckNoMoreListItems( + "extensionFieldSets.Value()[0].attributeValueList", iter_3, 1)); + } + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()", iter_1, 1)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].clusterID", iter_1.GetValue().clusterID, 8UL)); + { + auto iter_3 = iter_1.GetValue().attributeValueList.begin(); + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()[1].attributeValueList", iter_3, 0)); + VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[1].attributeValueList[0].attributeID", + iter_3.GetValue().attributeID)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[0].attributeID.Value()", + iter_3.GetValue().attributeID.Value(), 0UL)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[0].attributeValue", + iter_3.GetValue().attributeValue, 100UL)); + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()[1].attributeValueList", iter_3, 1)); + VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[1].attributeValueList[1].attributeID", + iter_3.GetValue().attributeID)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[1].attributeID.Value()", + iter_3.GetValue().attributeID.Value(), 1UL)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[1].attributeValue", + iter_3.GetValue().attributeValue, 0UL)); + VerifyOrReturn(CheckNoMoreListItems( + "extensionFieldSets.Value()[1].attributeValueList", iter_3, 2)); + } + VerifyOrReturn( + CheckNoMoreListItems("extensionFieldSets.Value()", iter_1, 2)); + } + } + break; + case 24: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::ViewSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U)); + VerifyOrReturn(CheckValuePresent("transitionTime", value.transitionTime)); + VerifyOrReturn(CheckValue("transitionTime.Value()", value.transitionTime.Value(), 0U)); + } + break; + case 25: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValueNonNull("capacity", value.capacity)); + VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast((maxScenes / 2) - 1))); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList)); + { + auto iter_1 = value.sceneList.Value().begin(); + VerifyOrReturn(CheckNextListItemDecodes("sceneList.Value()", iter_1, 0)); + VerifyOrReturn(CheckValue("sceneList.Value()[0]", iter_1.GetValue(), 1U)); + VerifyOrReturn(CheckNoMoreListItems("sceneList.Value()", iter_1, 1)); + } + } + break; + case 26: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::RemoveAllScenesResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + } + break; + case 27: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValueNonNull("capacity", value.capacity)); + VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), (maxScenes / 2))); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + } + break; + case 28: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::AddSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U)); + } + break; + case 29: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 30: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValueNonNull("capacity", value.capacity)); + VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast((maxScenes / 2) - 1))); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList)); + { + auto iter_1 = value.sceneList.Value().begin(); + VerifyOrReturn(CheckNextListItemDecodes("sceneList.Value()", iter_1, 0)); + VerifyOrReturn(CheckValue("sceneList.Value()[0]", iter_1.GetValue(), 1U)); + VerifyOrReturn(CheckNoMoreListItems("sceneList.Value()", iter_1, 1)); + } + } + break; + case 31: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::RemoveSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U)); + } + break; + case 32: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValueNonNull("capacity", value.capacity)); + VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), (maxScenes / 2))); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + } + break; + case 33: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 34: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 35: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND)); + break; + case 36: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 37: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 38: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::StoreSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U)); + } + break; + case 39: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 40: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 41: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::StoreSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 2U)); + } + break; + case 42: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValueNonNull("capacity", value.capacity)); + VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast((maxScenes / 2) - 2))); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList)); + { + auto iter_1 = value.sceneList.Value().begin(); + VerifyOrReturn(CheckNextListItemDecodes("sceneList.Value()", iter_1, 0)); + VerifyOrReturn(CheckValue("sceneList.Value()[0]", iter_1.GetValue(), 1U)); + VerifyOrReturn(CheckNextListItemDecodes("sceneList.Value()", iter_1, 1)); + VerifyOrReturn(CheckValue("sceneList.Value()[1]", iter_1.GetValue(), 2U)); + VerifyOrReturn(CheckNoMoreListItems("sceneList.Value()", iter_1, 2)); + } + } + break; + case 43: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 2U)); + } + break; + case 44: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::RemoveAllScenesResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 2U)); + } + break; + case 45: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValueNonNull("capacity", value.capacity)); + VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast((maxScenes / 2) - 2))); + VerifyOrReturn(CheckValue("groupID", value.groupID, 2U)); + } + break; + case 46: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 47: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 48: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::StoreSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 2U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 3U)); + } + break; + case 49: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValueNonNull("capacity", value.capacity)); + VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast((maxScenes / 2) - 3))); + VerifyOrReturn(CheckValue("groupID", value.groupID, 2U)); + VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList)); + { + auto iter_1 = value.sceneList.Value().begin(); + VerifyOrReturn(CheckNextListItemDecodes("sceneList.Value()", iter_1, 0)); + VerifyOrReturn(CheckValue("sceneList.Value()[0]", iter_1.GetValue(), 3U)); + VerifyOrReturn(CheckNoMoreListItems("sceneList.Value()", iter_1, 1)); + } + } + break; default: LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); } @@ -118703,62 +119266,1949 @@ class Test_TC_S_2_2Suite : public TestCommand { using namespace chip::app::Clusters; switch (testIndex) - {} - return CHIP_NO_ERROR; - } -}; + { + case 0: { + LogStep(0, "Wait for the commissioned device to be retrieved"); + ListFreer listFreer; + chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value; + value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL; + return WaitForCommissionee(kIdentityAlpha, value); + } + case 1: { + LogStep(1, "TH sends a RemoveAllGroups command to DUT."); + VerifyOrDo(!ShouldSkip("G.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Groups::Commands::RemoveAllGroups::Type value; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveAllGroups::Id, value, + chip::NullOptional -class Test_TC_S_2_3Suite : public TestCommand -{ -public: - Test_TC_S_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_3", 0, credsIssuerConfig) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } + ); + } + case 2: { + LogStep(2, "TH reads from the DUT the (0x0006) SceneTableSize attribute"); + VerifyOrDo(!ShouldSkip("S.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneTableSize::Id, true, + chip::NullOptional); + } + case 3: { + LogStep(3, "preparation step for using commands from Groups cluster: Add KeySet"); + ListFreer listFreer; + chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value; - ~Test_TC_S_2_3Suite() {} + value.groupKeySet.groupKeySetID = 417U; + value.groupKeySet.groupKeySecurityPolicy = + static_cast(0); + value.groupKeySet.epochKey0.SetNonNull(); + value.groupKeySet.epochKey0.Value() = chip::ByteSpan( + chip::Uint8::from_const_char( + "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"), + 16); + value.groupKeySet.epochStartTime0.SetNonNull(); + value.groupKeySet.epochStartTime0.Value() = 0ULL; + value.groupKeySet.epochKey1.SetNonNull(); + value.groupKeySet.epochKey1.Value() = chip::ByteSpan( + chip::Uint8::from_const_char( + "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"), + 16); + value.groupKeySet.epochStartTime1.SetNonNull(); + value.groupKeySet.epochStartTime1.Value() = 0ULL; + value.groupKeySet.epochKey2.SetNonNull(); + value.groupKeySet.epochKey2.Value() = chip::ByteSpan( + chip::Uint8::from_const_char( + "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"), + 16); + value.groupKeySet.epochStartTime2.SetNonNull(); + value.groupKeySet.epochStartTime2.Value() = 0ULL; - chip::System::Clock::Timeout GetWaitDuration() const override - { - return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds)); - } + return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, + GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; + ); + } + case 4: { + LogStep(4, "Preparation step for using commands from Groups cluster: Write Group Keys"); + ListFreer listFreer; + chip::app::DataModel::List value; - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } + { + auto * listHolder_0 = new ListHolder(2); + listFreer.add(listHolder_0); - // - // Tests methods - // + listHolder_0->mList[0].groupId = 1U; + listHolder_0->mList[0].groupKeySetID = 417U; + listHolder_0->mList[0].fabricIndex = 1U; - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; + listHolder_0->mList[1].groupId = 2U; + listHolder_0->mList[1].groupKeySetID = 417U; + listHolder_0->mList[1].fabricIndex = 1U; - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); + value = chip::app::DataModel::List( + listHolder_0->mList, 2); + } + return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, + GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional); } + case 5: { + LogStep(5, "TH sends a AddGroup command to DUT with the GroupID field set to 0x0001."); + VerifyOrDo(!ShouldSkip("G.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Groups::Commands::AddGroup::Type value; + value.groupID = 1U; + value.groupName = chip::Span("Group1garbage: not in length on purpose", 6); + return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); + ); } - } + case 6: { + LogStep(6, "TH sends a RemoveAllScenes command to DUT with the GroupID field set to 0x0001."); + VerifyOrDo(!ShouldSkip("S.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::RemoveAllScenes::Type value; + value.groupID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RemoveAllScenes::Id, value, + chip::NullOptional - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - {} + ); + } + case 7: { + LogStep(7, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001."); + VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value; + value.groupID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value, + chip::NullOptional + + ); + } + case 8: { + LogStep(8, "TH configures AC1 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value; + value.level = 100U; + value.transitionTime.SetNonNull(); + value.transitionTime.Value() = 0U; + value.optionsMask = static_cast>(0U); + value.optionsOverride = static_cast>(0U); + return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id, + value, chip::NullOptional + + ); + } + case 9: { + LogStep(9, "TH configures AC1 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please configure AC1 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose", + 77); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 10: { + LogStep(10, + "TH sends a StoreScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01."); + VerifyOrDo(!ShouldSkip("S.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::StoreScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::StoreScene::Id, value, + chip::NullOptional + + ); + } + case 11: { + LogStep(11, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value; + value.level = 200U; + value.transitionTime.SetNonNull(); + value.transitionTime.Value() = 0U; + value.optionsMask = static_cast>(0U); + value.optionsOverride = static_cast>(0U); + return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id, + value, chip::NullOptional + + ); + } + case 12: { + LogStep(12, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose", + 77); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 13: { + LogStep( + 13, + "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01."); + VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::RecallScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RecallScene::Id, value, + chip::NullOptional + + ); + } + case 14: { + LogStep(14, "TH reads the SceneCount attribute from DUT."); + VerifyOrDo(!ShouldSkip("S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003"), + return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneCount::Id, true, + chip::NullOptional); + } + case 15: { + LogStep(15, "TH reads the CurrentScene attribute from DUT."); + VerifyOrDo(!ShouldSkip("S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003"), + return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::CurrentScene::Id, true, + chip::NullOptional); + } + case 16: { + LogStep(16, "TH reads the CurrentGroup attribute from DUT."); + VerifyOrDo(!ShouldSkip("S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003"), + return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::CurrentGroup::Id, true, + chip::NullOptional); + } + case 17: { + LogStep(17, "TH reads the SceneValid attribute from DUT."); + VerifyOrDo(!ShouldSkip("S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003"), + return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneValid::Id, true, + chip::NullOptional); + } + case 18: { + LogStep(18, "Reboot target device"); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::SystemCommands::Commands::Reboot::Type value; + return Reboot(kIdentityAlpha, value); + } + case 19: { + LogStep(19, "Reboot target device(DUT)"); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = + chip::Span("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 20: { + LogStep(20, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value; + value.level = 200U; + value.transitionTime.SetNonNull(); + value.transitionTime.Value() = 0U; + value.optionsMask = static_cast>(0U); + value.optionsOverride = static_cast>(0U); + return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id, + value, chip::NullOptional + + ); + } + case 21: { + LogStep(21, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose", + 77); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 22: { + LogStep( + 22, + "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01."); + VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::RecallScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RecallScene::Id, value, + chip::NullOptional + + ); + } + case 23: { + LogStep(23, + "TH sends a ViewScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01."); + VerifyOrDo(!ShouldSkip("S.S.C01.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::ViewScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::ViewScene::Id, value, + chip::NullOptional + + ); + } + case 24: { + LogStep(24, + "TH sends a ViewScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01."); + VerifyOrDo(!ShouldSkip("S.S.C01.Rsp && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::ViewScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::ViewScene::Id, value, + chip::NullOptional + + ); + } + case 25: { + LogStep(25, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001."); + VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value; + value.groupID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value, + chip::NullOptional + + ); + } + case 26: { + LogStep(26, "TH sends a RemoveAllScenes command to DUT with the GroupID field set to 0x0001."); + VerifyOrDo(!ShouldSkip("S.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::RemoveAllScenes::Type value; + value.groupID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RemoveAllScenes::Id, value, + chip::NullOptional + + ); + } + case 27: { + LogStep(27, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001."); + VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value; + value.groupID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value, + chip::NullOptional + + ); + } + case 28: { + LogStep(28, + "TH sends a AddScene command to DUT with the GroupID field set to 0x0001, the SceneID field set to 0x01, the " + "TransitionTime field set to 0x0001 and a set of extension fields appropriate to AC1."); + VerifyOrDo(!ShouldSkip("S.S.C00.Rsp && && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::AddScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + value.transitionTime = 1U; + value.sceneName = chip::Span("Scene1garbage: not in length on purpose", 6); + + { + auto * listHolder_0 = new ListHolder(2); + listFreer.add(listHolder_0); + + listHolder_0->mList[0].clusterID = 6UL; + + { + auto * listHolder_2 = new ListHolder(1); + listFreer.add(listHolder_2); + + listHolder_2->mList[0].attributeID.Emplace(); + listHolder_2->mList[0].attributeID.Value() = 0UL; + listHolder_2->mList[0].attributeValue = 1UL; + + listHolder_0->mList[0].attributeValueList = + chip::app::DataModel::List( + listHolder_2->mList, 1); + } + + listHolder_0->mList[1].clusterID = 8UL; + + { + auto * listHolder_2 = new ListHolder(2); + listFreer.add(listHolder_2); + + listHolder_2->mList[0].attributeID.Emplace(); + listHolder_2->mList[0].attributeID.Value() = 0UL; + listHolder_2->mList[0].attributeValue = 100UL; + + listHolder_2->mList[1].attributeID.Emplace(); + listHolder_2->mList[1].attributeID.Value() = 1UL; + listHolder_2->mList[1].attributeValue = 0UL; + + listHolder_0->mList[1].attributeValueList = + chip::app::DataModel::List( + listHolder_2->mList, 2); + } + + value.extensionFieldSets = + chip::app::DataModel::List(listHolder_0->mList, + 2); + } + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::AddScene::Id, value, chip::NullOptional + + ); + } + case 29: { + LogStep(29, + "TH sends a AddScene command to DUT with the GroupID field set to 0x0001, the SceneID field set to 0x01, the " + "TransitionTime field set to 0x0001 and a set of extension fields appropriate to AC1."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = + chip::Span("Please execute the add scene command with extensionfieldsets in accordance with AC1 on DUT " + "and enter 'y' if the command is successfulgarbage: not in length on purpose", + 133); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 30: { + LogStep(30, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001."); + VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value; + value.groupID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value, + chip::NullOptional + + ); + } + case 31: { + LogStep( + 31, + "TH sends a RemoveScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01."); + VerifyOrDo(!ShouldSkip("S.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::RemoveScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RemoveScene::Id, value, + chip::NullOptional + + ); + } + case 32: { + LogStep(32, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001."); + VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value; + value.groupID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value, + chip::NullOptional + + ); + } + case 33: { + LogStep(33, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value; + value.level = 200U; + value.transitionTime.SetNonNull(); + value.transitionTime.Value() = 0U; + value.optionsMask = static_cast>(0U); + value.optionsOverride = static_cast>(0U); + return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id, + value, chip::NullOptional + + ); + } + case 34: { + LogStep(34, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose", + 77); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 35: { + LogStep( + 35, + "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01."); + VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::RecallScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RecallScene::Id, value, + chip::NullOptional + + ); + } + case 36: { + LogStep(36, "TH configures AC1 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value; + value.level = 100U; + value.transitionTime.SetNonNull(); + value.transitionTime.Value() = 0U; + value.optionsMask = static_cast>(0U); + value.optionsOverride = static_cast>(0U); + return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id, + value, chip::NullOptional + + ); + } + case 37: { + LogStep(37, "TH configures AC1 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please configure AC1 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose", + 77); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 38: { + LogStep(38, + "TH sends a StoreScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01."); + VerifyOrDo(!ShouldSkip("S.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::StoreScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::StoreScene::Id, value, + chip::NullOptional + + ); + } + case 39: { + LogStep(39, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value; + value.level = 200U; + value.transitionTime.SetNonNull(); + value.transitionTime.Value() = 0U; + value.optionsMask = static_cast>(0U); + value.optionsOverride = static_cast>(0U); + return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id, + value, chip::NullOptional + + ); + } + case 40: { + LogStep(40, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose", + 77); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 41: { + LogStep(41, + "TH sends a StoreScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x02."); + VerifyOrDo(!ShouldSkip("S.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::StoreScene::Type value; + value.groupID = 1U; + value.sceneID = 2U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::StoreScene::Id, value, + chip::NullOptional + + ); + } + case 42: { + LogStep(42, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001."); + VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value; + value.groupID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value, + chip::NullOptional + + ); + } + case 43: { + LogStep(43, "If capacity allows, TH sends a AddGroup command to DUT with the GroupID field set to 0x0002."); + VerifyOrDo(!ShouldSkip("G.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Groups::Commands::AddGroup::Type value; + value.groupID = 2U; + value.groupName = chip::Span("Group2garbage: not in length on purpose", 6); + return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional + + ); + } + case 44: { + LogStep(44, "TH sends a RemoveAllScenes command to DUT with the GroupID field set to 0x0002."); + VerifyOrDo(!ShouldSkip("S.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::RemoveAllScenes::Type value; + value.groupID = 2U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RemoveAllScenes::Id, value, + chip::NullOptional + + ); + } + case 45: { + LogStep(45, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0002."); + VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value; + value.groupID = 2U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value, + chip::NullOptional + + ); + } + case 46: { + LogStep(46, "TH configures AC3 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value; + value.level = 1U; + value.transitionTime.SetNonNull(); + value.transitionTime.Value() = 0U; + value.optionsMask = static_cast>(0U); + value.optionsOverride = static_cast>(0U); + return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id, + value, chip::NullOptional + + ); + } + case 47: { + LogStep(47, "TH configures AC3 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please configure AC3 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose", + 77); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 48: { + LogStep(48, + "TH sends a StoreScene command to DUT with the GroupID field set to 0x0002 and the SceneID field set to 0x03."); + VerifyOrDo(!ShouldSkip("S.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::StoreScene::Type value; + value.groupID = 2U; + value.sceneID = 3U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::StoreScene::Id, value, + chip::NullOptional + + ); + } + case 49: { + LogStep(49, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0002."); + VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value; + value.groupID = 2U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value, + chip::NullOptional + + ); + } + } + return CHIP_NO_ERROR; + } +}; + +class Test_TC_S_2_3Suite : public TestCommand +{ +public: + Test_TC_S_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_3", 24, credsIssuerConfig) + { + AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); + AddArgument("cluster", &mCluster); + AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); + AddArgument("G1", 0, UINT16_MAX, &mG1); + AddArgument("timeout", 0, UINT16_MAX, &mTimeout); + } + + ~Test_TC_S_2_3Suite() {} + + chip::System::Clock::Timeout GetWaitDuration() const override + { + return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds)); + } + +private: + chip::Optional mNodeId; + chip::Optional mCluster; + chip::Optional mEndpoint; + chip::Optional mG1; + chip::Optional mTimeout; + + uint16_t maxScenes; + + chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } + + // + // Tests methods + // + + void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override + { + bool shouldContinue = false; + + switch (mTestIndex - 1) + { + case 0: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 1: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + uint16_t value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + maxScenes = value; + } + break; + case 2: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 3: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 4: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U)); + } + break; + case 5: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::RemoveAllScenesResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U)); + } + break; + case 6: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValueNonNull("capacity", value.capacity)); + VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), (maxScenes / 2))); + VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U)); + VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList)); + { + auto iter_1 = value.sceneList.Value().begin(); + VerifyOrReturn(CheckNoMoreListItems("sceneList.Value()", iter_1, 0)); + } + } + break; + case 7: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::EnhancedAddSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U)); + } + break; + case 8: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::AddSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U)); + } + break; + case 9: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 10: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 11: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::EnhancedViewSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U)); + VerifyOrReturn(CheckValuePresent("transitionTime", value.transitionTime)); + VerifyOrReturn(CheckValue("transitionTime.Value()", value.transitionTime.Value(), 10U)); + VerifyOrReturn(CheckValuePresent("extensionFieldSets", value.extensionFieldSets)); + { + auto iter_1 = value.extensionFieldSets.Value().begin(); + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()", iter_1, 0)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].clusterID", iter_1.GetValue().clusterID, 6UL)); + { + auto iter_3 = iter_1.GetValue().attributeValueList.begin(); + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()[0].attributeValueList", iter_3, 0)); + VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[0].attributeValueList[0].attributeID", + iter_3.GetValue().attributeID)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].attributeValueList[0].attributeID.Value()", + iter_3.GetValue().attributeID.Value(), 0UL)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].attributeValueList[0].attributeValue", + iter_3.GetValue().attributeValue, 1UL)); + VerifyOrReturn(CheckNoMoreListItems( + "extensionFieldSets.Value()[0].attributeValueList", iter_3, 1)); + } + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()", iter_1, 1)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].clusterID", iter_1.GetValue().clusterID, 8UL)); + { + auto iter_3 = iter_1.GetValue().attributeValueList.begin(); + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()[1].attributeValueList", iter_3, 0)); + VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[1].attributeValueList[0].attributeID", + iter_3.GetValue().attributeID)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[0].attributeID.Value()", + iter_3.GetValue().attributeID.Value(), 0UL)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[0].attributeValue", + iter_3.GetValue().attributeValue, 100UL)); + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()[1].attributeValueList", iter_3, 1)); + VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[1].attributeValueList[1].attributeID", + iter_3.GetValue().attributeID)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[1].attributeID.Value()", + iter_3.GetValue().attributeID.Value(), 1UL)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[1].attributeValue", + iter_3.GetValue().attributeValue, 0UL)); + VerifyOrReturn(CheckNoMoreListItems( + "extensionFieldSets.Value()[1].attributeValueList", iter_3, 2)); + } + VerifyOrReturn( + CheckNoMoreListItems("extensionFieldSets.Value()", iter_1, 2)); + } + } + break; + case 12: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::ViewSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U)); + VerifyOrReturn(CheckValuePresent("transitionTime", value.transitionTime)); + VerifyOrReturn(CheckValue("transitionTime.Value()", value.transitionTime.Value(), 1U)); + VerifyOrReturn(CheckValuePresent("extensionFieldSets", value.extensionFieldSets)); + { + auto iter_1 = value.extensionFieldSets.Value().begin(); + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()", iter_1, 0)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].clusterID", iter_1.GetValue().clusterID, 6UL)); + { + auto iter_3 = iter_1.GetValue().attributeValueList.begin(); + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()[0].attributeValueList", iter_3, 0)); + VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[0].attributeValueList[0].attributeID", + iter_3.GetValue().attributeID)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].attributeValueList[0].attributeID.Value()", + iter_3.GetValue().attributeID.Value(), 0UL)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].attributeValueList[0].attributeValue", + iter_3.GetValue().attributeValue, 1UL)); + VerifyOrReturn(CheckNoMoreListItems( + "extensionFieldSets.Value()[0].attributeValueList", iter_3, 1)); + } + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()", iter_1, 1)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].clusterID", iter_1.GetValue().clusterID, 8UL)); + { + auto iter_3 = iter_1.GetValue().attributeValueList.begin(); + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()[1].attributeValueList", iter_3, 0)); + VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[1].attributeValueList[0].attributeID", + iter_3.GetValue().attributeID)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[0].attributeID.Value()", + iter_3.GetValue().attributeID.Value(), 0UL)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[0].attributeValue", + iter_3.GetValue().attributeValue, 100UL)); + VerifyOrReturn(CheckNextListItemDecodes( + "extensionFieldSets.Value()[1].attributeValueList", iter_3, 1)); + VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[1].attributeValueList[1].attributeID", + iter_3.GetValue().attributeID)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[1].attributeID.Value()", + iter_3.GetValue().attributeID.Value(), 1UL)); + VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[1].attributeValue", + iter_3.GetValue().attributeValue, 0UL)); + VerifyOrReturn(CheckNoMoreListItems( + "extensionFieldSets.Value()[1].attributeValueList", iter_3, 2)); + } + VerifyOrReturn( + CheckNoMoreListItems("extensionFieldSets.Value()", iter_1, 2)); + } + } + break; + case 13: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 14: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 15: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValueNonNull("capacity", value.capacity)); + VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast((maxScenes / 2) - 1))); + VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U)); + VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList)); + { + auto iter_1 = value.sceneList.Value().begin(); + VerifyOrReturn(CheckNextListItemDecodes("sceneList.Value()", iter_1, 0)); + VerifyOrReturn(CheckValue("sceneList.Value()[0]", iter_1.GetValue(), 1U)); + VerifyOrReturn(CheckNoMoreListItems("sceneList.Value()", iter_1, 1)); + } + } + break; + case 16: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 17: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 18: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 19: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 20: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::DataModel::Nullable value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValueNonNull("currentLevel", value)); + VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U)); + } + break; + case 21: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 22: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::CopySceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupIdentifierFrom", value.groupIdentifierFrom, mG1.HasValue() ? mG1.Value() : 1U)); + VerifyOrReturn(CheckValue("sceneIdentifierFrom", value.sceneIdentifierFrom, 1U)); + } + break; + case 23: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValueNonNull("capacity", value.capacity)); + VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast((maxScenes / 2) - 2))); + VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U)); + VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList)); + { + auto iter_1 = value.sceneList.Value().begin(); + VerifyOrReturn(CheckNextListItemDecodes("sceneList.Value()", iter_1, 0)); + VerifyOrReturn(CheckValue("sceneList.Value()[0]", iter_1.GetValue(), 1U)); + VerifyOrReturn(CheckNextListItemDecodes("sceneList.Value()", iter_1, 1)); + VerifyOrReturn(CheckValue("sceneList.Value()[1]", iter_1.GetValue(), 2U)); + VerifyOrReturn(CheckNoMoreListItems("sceneList.Value()", iter_1, 2)); + } + } + break; + default: + LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); + } + + if (shouldContinue) + { + ContinueOnChipMainThread(CHIP_NO_ERROR); + } + } + + CHIP_ERROR DoTestStep(uint16_t testIndex) override + { + using namespace chip::app::Clusters; + switch (testIndex) + { + case 0: { + LogStep(0, "Wait for the commissioned device to be retrieved"); + ListFreer listFreer; + chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value; + value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL; + return WaitForCommissionee(kIdentityAlpha, value); + } + case 1: { + LogStep(1, "TH reads from the DUT the (0x0006) SceneTableSize attribute"); + VerifyOrDo(!ShouldSkip("S.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneTableSize::Id, true, + chip::NullOptional); + } + case 2: { + LogStep(2, "preparation step for using commands from Groups cluster: Add KeySet"); + ListFreer listFreer; + chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value; + + value.groupKeySet.groupKeySetID = 417U; + value.groupKeySet.groupKeySecurityPolicy = + static_cast(0); + value.groupKeySet.epochKey0.SetNonNull(); + value.groupKeySet.epochKey0.Value() = chip::ByteSpan( + chip::Uint8::from_const_char( + "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"), + 16); + value.groupKeySet.epochStartTime0.SetNonNull(); + value.groupKeySet.epochStartTime0.Value() = 0ULL; + value.groupKeySet.epochKey1.SetNonNull(); + value.groupKeySet.epochKey1.Value() = chip::ByteSpan( + chip::Uint8::from_const_char( + "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"), + 16); + value.groupKeySet.epochStartTime1.SetNonNull(); + value.groupKeySet.epochStartTime1.Value() = 0ULL; + value.groupKeySet.epochKey2.SetNonNull(); + value.groupKeySet.epochKey2.Value() = chip::ByteSpan( + chip::Uint8::from_const_char( + "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"), + 16); + value.groupKeySet.epochStartTime2.SetNonNull(); + value.groupKeySet.epochStartTime2.Value() = 0ULL; + + return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, + GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional + + ); + } + case 3: { + LogStep(3, "Preparation step for using commands from Groups cluster: Write Group Keys"); + ListFreer listFreer; + chip::app::DataModel::List value; + + { + auto * listHolder_0 = new ListHolder(1); + listFreer.add(listHolder_0); + + listHolder_0->mList[0].groupId = mG1.HasValue() ? mG1.Value() : 1U; + listHolder_0->mList[0].groupKeySetID = 417U; + listHolder_0->mList[0].fabricIndex = 1U; + + value = chip::app::DataModel::List( + listHolder_0->mList, 1); + } + return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, + GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional); + } + case 4: { + LogStep(4, "TH sends a AddGroup command to DUT with the GroupID field set to G1."); + VerifyOrDo(!ShouldSkip("G.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Groups::Commands::AddGroup::Type value; + value.groupID = mG1.HasValue() ? mG1.Value() : 1U; + value.groupName = chip::Span("Group1garbage: not in length on purpose", 6); + return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional + + ); + } + case 5: { + LogStep(5, "TH sends a RemoveAllScenes command to DUT with the GroupID field set to G1."); + VerifyOrDo(!ShouldSkip("S.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::RemoveAllScenes::Type value; + value.groupID = mG1.HasValue() ? mG1.Value() : 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RemoveAllScenes::Id, value, + chip::NullOptional + + ); + } + case 6: { + LogStep(6, "TH sends a GetSceneMembership command to DUT with the GroupID field set to G1."); + VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value; + value.groupID = mG1.HasValue() ? mG1.Value() : 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value, + chip::NullOptional + + ); + } + case 7: { + LogStep(7, + "TH sends a EnhancedAddScene command to DUT with the GroupID field set to G1, the SceneID field set to 0x01, " + "the TransitionTime field set to 0x000a (1s) and a set of extension fields appropriate to AC1."); + VerifyOrDo(!ShouldSkip("S.S.C40.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::EnhancedAddScene::Type value; + value.groupID = mG1.HasValue() ? mG1.Value() : 1U; + value.sceneID = 1U; + value.transitionTime = 10U; + value.sceneName = chip::Span("Scene1garbage: not in length on purpose", 6); + + { + auto * listHolder_0 = new ListHolder(2); + listFreer.add(listHolder_0); + + listHolder_0->mList[0].clusterID = 6UL; + + { + auto * listHolder_2 = new ListHolder(1); + listFreer.add(listHolder_2); + + listHolder_2->mList[0].attributeID.Emplace(); + listHolder_2->mList[0].attributeID.Value() = 0UL; + listHolder_2->mList[0].attributeValue = 1UL; + + listHolder_0->mList[0].attributeValueList = + chip::app::DataModel::List( + listHolder_2->mList, 1); + } + + listHolder_0->mList[1].clusterID = 8UL; + + { + auto * listHolder_2 = new ListHolder(2); + listFreer.add(listHolder_2); + + listHolder_2->mList[0].attributeID.Emplace(); + listHolder_2->mList[0].attributeID.Value() = 0UL; + listHolder_2->mList[0].attributeValue = 100UL; + + listHolder_2->mList[1].attributeID.Emplace(); + listHolder_2->mList[1].attributeID.Value() = 1UL; + listHolder_2->mList[1].attributeValue = 0UL; + + listHolder_0->mList[1].attributeValueList = + chip::app::DataModel::List( + listHolder_2->mList, 2); + } + + value.extensionFieldSets = + chip::app::DataModel::List(listHolder_0->mList, + 2); + } + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::EnhancedAddScene::Id, value, + chip::NullOptional + + ); + } + case 8: { + LogStep(8, + "TH sends a AddScene command to DUT with the GroupID field set to G1, the SceneID field set to 0x01, the " + "TransitionTime field set to 0x0001 (1s) and a set of extension fields appropriate to AC1."); + VerifyOrDo(!ShouldSkip("(!S.S.C40.Rsp) && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::AddScene::Type value; + value.groupID = mG1.HasValue() ? mG1.Value() : 1U; + value.sceneID = 1U; + value.transitionTime = 1U; + value.sceneName = chip::Span("Scene1garbage: not in length on purpose", 6); + + { + auto * listHolder_0 = new ListHolder(2); + listFreer.add(listHolder_0); + + listHolder_0->mList[0].clusterID = 6UL; + + { + auto * listHolder_2 = new ListHolder(1); + listFreer.add(listHolder_2); + + listHolder_2->mList[0].attributeID.Emplace(); + listHolder_2->mList[0].attributeID.Value() = 0UL; + listHolder_2->mList[0].attributeValue = 1UL; + + listHolder_0->mList[0].attributeValueList = + chip::app::DataModel::List( + listHolder_2->mList, 1); + } + + listHolder_0->mList[1].clusterID = 8UL; + + { + auto * listHolder_2 = new ListHolder(2); + listFreer.add(listHolder_2); + + listHolder_2->mList[0].attributeID.Emplace(); + listHolder_2->mList[0].attributeID.Value() = 0UL; + listHolder_2->mList[0].attributeValue = 100UL; + + listHolder_2->mList[1].attributeID.Emplace(); + listHolder_2->mList[1].attributeID.Value() = 1UL; + listHolder_2->mList[1].attributeValue = 0UL; + + listHolder_0->mList[1].attributeValueList = + chip::app::DataModel::List( + listHolder_2->mList, 2); + } + + value.extensionFieldSets = + chip::app::DataModel::List(listHolder_0->mList, + 2); + } + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::AddScene::Id, value, chip::NullOptional + + ); + } + case 9: { + LogStep(9, + "TH sends a EnhancedAddScene command to DUT with the GroupID field set to G1, the SceneID field set to 0x01, " + "the TransitionTime field set to 0x000a and a set of extension fields appropriate to AC1."); + VerifyOrDo(!ShouldSkip("S.S.C40.Rsp && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = + chip::Span("Please execute the enhanced add scene command with extensionfieldsets in accordance with " + "AC1 on DUT and enter 'y' if the command is successfulgarbage: not in length on purpose", + 142); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 10: { + LogStep(10, + "TH sends a AddScene command to DUT with the GroupID field set to G1, the SceneID field set to 0x01, the " + "TransitionTime field set to 0x0001 and a set of extension fields appropriate to AC1."); + VerifyOrDo(!ShouldSkip("(!S.S.C40.Rsp) && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = + chip::Span("Please execute the add scene command with extensionfieldsets in accordance with AC1 on DUT " + "and enter 'y' if the command is successfulgarbage: not in length on purpose", + 133); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 11: { + LogStep( + 11, + "TH sends a EnhancedViewScene command to DUT with the GroupID field set to G1 and the SceneID field set to 0x01."); + VerifyOrDo(!ShouldSkip("S.S.C41.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::EnhancedViewScene::Type value; + value.groupID = mG1.HasValue() ? mG1.Value() : 1U; + value.sceneID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::EnhancedViewScene::Id, value, + chip::NullOptional + + ); + } + case 12: { + LogStep(12, "TH sends a ViewScene command to DUT with the GroupID field set to G1 and the SceneID field set to 0x01."); + VerifyOrDo(!ShouldSkip("(!S.S.C41.Rsp) && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::ViewScene::Type value; + value.groupID = mG1.HasValue() ? mG1.Value() : 1U; + value.sceneID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::ViewScene::Id, value, + chip::NullOptional + + ); + } + case 13: { + LogStep( + 13, + "TH sends a EnhancedViewScene command to DUT with the GroupID field set to G1 and the SceneID field set to 0x01."); + VerifyOrDo(!ShouldSkip("S.S.C41.Rsp && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please execute the ehanced-view-scene command and verify that the extensionfieldsets, status, groupID and SceneID " + "are in accordance with AC1 on DUT and enter 'y' if the command is successfulgarbage: not in length on purpose", + 190); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 14: { + LogStep(14, "TH sends a ViewScene command to DUT with the GroupID field set to G1 and the SceneID field set to 0x01."); + VerifyOrDo(!ShouldSkip("(!S.S.C41.Rsp) && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please execute the view-scene command and verify that the extensionfieldsets, status, groupID and SceneID are in " + "accordance with AC1 on DUT and enter 'y' if the command is successfulgarbage: not in length on purpose", + 182); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 15: { + LogStep(15, "TH sends a GetSceneMembership command to DUT with the GroupID field set to G1."); + VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value; + value.groupID = mG1.HasValue() ? mG1.Value() : 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value, + chip::NullOptional + + ); + } + case 16: { + LogStep(16, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value; + value.level = 200U; + value.transitionTime.SetNonNull(); + value.transitionTime.Value() = 0U; + value.optionsMask = static_cast>(0U); + value.optionsOverride = static_cast>(0U); + return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id, + value, chip::NullOptional + + ); + } + case 17: { + LogStep(17, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose", + 77); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 18: { + LogStep( + 18, + "TH sends a RecallScene command to group G1 with the GroupID field set to G1 and the scene ID field set to 0x01."); + VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::RecallScene::Type value; + value.groupID = mG1.HasValue() ? mG1.Value() : 1U; + value.sceneID = 1U; + return SendGroupCommand(kIdentityAlpha, 1, Scenes::Id, Scenes::Commands::RecallScene::Id, value); + } + case 19: { + LogStep(19, "Wait 1s"); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; + value.ms = 1000UL; + return WaitForMs(kIdentityAlpha, value); + } + case 20: { + LogStep(20, "TH confirm the DUT reached AC1 (on level control cluster) after 1s"); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true, + chip::NullOptional); + } + case 21: { + LogStep(21, "Verify DUT returns to AC1."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span("Please confirm AC1 on DUT and enter 'y'.garbage: not in length on purpose", 40); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 22: { + LogStep(22, + "TH sends a CopyScene command to DUT with the mode field set to 0x00, the group identifier from field set to " + "G1, the scene identifier from field set to 0x01, the group identifier to field set to G1 and the scene " + "identifier to field set to 0x02."); + VerifyOrDo(!ShouldSkip("S.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::CopyScene::Type value; + value.mode = static_cast>(0U); + value.groupIdentifierFrom = mG1.HasValue() ? mG1.Value() : 1U; + value.sceneIdentifierFrom = 1U; + value.groupIdentifierTo = mG1.HasValue() ? mG1.Value() : 1U; + value.sceneIdentifierTo = 2U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::CopyScene::Id, value, + chip::NullOptional + + ); + } + case 23: { + LogStep(23, "TH sends a GetSceneMembership command to DUT with the GroupID field set to G1."); + VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value; + value.groupID = mG1.HasValue() ? mG1.Value() : 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value, + chip::NullOptional + + ); + } + } + return CHIP_NO_ERROR; + } +}; + +class Test_TC_S_2_4Suite : public TestCommand +{ +public: + Test_TC_S_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_4", 27, credsIssuerConfig) + { + AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); + AddArgument("cluster", &mCluster); + AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); + AddArgument("timeout", 0, UINT16_MAX, &mTimeout); + } + + ~Test_TC_S_2_4Suite() {} + + chip::System::Clock::Timeout GetWaitDuration() const override + { + return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds)); + } + +private: + chip::Optional mNodeId; + chip::Optional mCluster; + chip::Optional mEndpoint; + chip::Optional mTimeout; + + chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } + + // + // Tests methods + // + + void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override + { + bool shouldContinue = false; + + switch (mTestIndex - 1) + { + case 0: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 1: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 2: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 3: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 4: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + } + break; + case 5: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::RemoveAllScenesResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + } + break; + case 6: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::AddSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U)); + } + break; + case 7: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 8: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 9: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::Clusters::Scenes::Commands::StoreSceneResponse::DecodableType value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("status", value.status, 0U)); + VerifyOrReturn(CheckValue("groupID", value.groupID, 1U)); + VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U)); + } + break; + case 10: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 11: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 12: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::DataModel::Nullable value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValueNonNull("currentLevel", value)); + VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 200U)); + } + break; + case 13: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 14: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 15: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 16: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::DataModel::Nullable value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValueNonNull("currentLevel", value)); + VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U)); + } + break; + case 17: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 18: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 19: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 20: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 21: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 22: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::DataModel::Nullable value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValueNonNull("currentLevel", value)); + VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U)); + } + break; + case 23: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 24: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 25: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 26: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + default: + LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); + } + + if (shouldContinue) + { + ContinueOnChipMainThread(CHIP_NO_ERROR); + } + } + + CHIP_ERROR DoTestStep(uint16_t testIndex) override + { + using namespace chip::app::Clusters; + switch (testIndex) + { + case 0: { + LogStep(0, "Wait for the commissioned device to be retrieved"); + ListFreer listFreer; + chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value; + value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL; + return WaitForCommissionee(kIdentityAlpha, value); + } + case 1: { + LogStep(1, "TH sends a RemoveAllGroups command to DUT."); + VerifyOrDo(!ShouldSkip("G.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Groups::Commands::RemoveAllGroups::Type value; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveAllGroups::Id, value, + chip::NullOptional + + ); + } + case 2: { + LogStep(2, "preparation step for using commands from Groups cluster: Add KeySet"); + ListFreer listFreer; + chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value; + + value.groupKeySet.groupKeySetID = 417U; + value.groupKeySet.groupKeySecurityPolicy = + static_cast(0); + value.groupKeySet.epochKey0.SetNonNull(); + value.groupKeySet.epochKey0.Value() = chip::ByteSpan( + chip::Uint8::from_const_char( + "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"), + 16); + value.groupKeySet.epochStartTime0.SetNonNull(); + value.groupKeySet.epochStartTime0.Value() = 0ULL; + value.groupKeySet.epochKey1.SetNonNull(); + value.groupKeySet.epochKey1.Value() = chip::ByteSpan( + chip::Uint8::from_const_char( + "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"), + 16); + value.groupKeySet.epochStartTime1.SetNonNull(); + value.groupKeySet.epochStartTime1.Value() = 0ULL; + value.groupKeySet.epochKey2.SetNonNull(); + value.groupKeySet.epochKey2.Value() = chip::ByteSpan( + chip::Uint8::from_const_char( + "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"), + 16); + value.groupKeySet.epochStartTime2.SetNonNull(); + value.groupKeySet.epochStartTime2.Value() = 0ULL; + + return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, + GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional + + ); + } + case 3: { + LogStep(3, "Preparation step for using commands from Groups cluster: Write Group Keys"); + ListFreer listFreer; + chip::app::DataModel::List value; + + { + auto * listHolder_0 = new ListHolder(1); + listFreer.add(listHolder_0); + + listHolder_0->mList[0].groupId = 1U; + listHolder_0->mList[0].groupKeySetID = 417U; + listHolder_0->mList[0].fabricIndex = 1U; + + value = chip::app::DataModel::List( + listHolder_0->mList, 1); + } + return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, + GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional); + } + case 4: { + LogStep(4, "TH sends a AddGroup command to DUT with the GroupID field set to 0x0001."); + VerifyOrDo(!ShouldSkip("G.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Groups::Commands::AddGroup::Type value; + value.groupID = 1U; + value.groupName = chip::Span("Group1garbage: not in length on purpose", 6); + return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional + + ); + } + case 5: { + LogStep(5, "TH sends a RemoveAllScenes command to DUT with the GroupID field set to 0x0001."); + VerifyOrDo(!ShouldSkip("S.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::RemoveAllScenes::Type value; + value.groupID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RemoveAllScenes::Id, value, + chip::NullOptional + + ); + } + case 6: { + LogStep(6, + "TH sends a AddScene command to DUT with the GroupID field set to 0x0001, the SceneID field set to 0x01, the " + "TransitionTime field set to 0x0001 and a set of extension fields appropriate to AC1."); + VerifyOrDo(!ShouldSkip("S.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::AddScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + value.transitionTime = 20U; + value.sceneName = chip::Span("Scene1garbage: not in length on purpose", 6); + + value.extensionFieldSets = chip::app::DataModel::List(); + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::AddScene::Id, value, chip::NullOptional + + ); + } + case 7: { + LogStep(7, "TH configures AC1 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value; + value.level = 100U; + value.transitionTime.SetNonNull(); + value.transitionTime.Value() = 0U; + value.optionsMask = static_cast>(0U); + value.optionsOverride = static_cast>(0U); + return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id, + value, chip::NullOptional + + ); + } + case 8: { + LogStep(8, "TH configures AC1 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please configure AC1 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose", + 77); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 9: { + LogStep(9, + "TH sends a StoreScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01."); + VerifyOrDo(!ShouldSkip("S.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::StoreScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::StoreScene::Id, value, + chip::NullOptional + + ); + } + case 10: { + LogStep(10, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value; + value.level = 200U; + value.transitionTime.SetNonNull(); + value.transitionTime.Value() = 0U; + value.optionsMask = static_cast>(0U); + value.optionsOverride = static_cast>(0U); + return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id, + value, chip::NullOptional + + ); + } + case 11: { + LogStep(11, "Wait 1s for level to change"); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; + value.ms = 1000UL; + return WaitForMs(kIdentityAlpha, value); + } + case 12: { + LogStep(12, "TH confirm the DUT reached AC2 (on level control cluster) after 1s, which is different from AC1"); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true, + chip::NullOptional); + } + case 13: { + LogStep(13, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose", + 77); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 14: { + LogStep(14, + "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01 " + "and the TransitionTime field omitted."); + VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::RecallScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RecallScene::Id, value, + chip::NullOptional + + ); + } + case 15: { + LogStep(15, "Wait 20s"); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; + value.ms = 20000UL; + return WaitForMs(kIdentityAlpha, value); + } + case 16: { + LogStep(16, "TH confirm the DUT reached AC1 (on level control cluster) after 20s"); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true, + chip::NullOptional); + } + case 17: { + LogStep(17, "DUT transitions to AC1 over 20s."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please confirm that transition to AC1 was made over 20sgarbage: not in length on purpose", 55); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 18: { + LogStep(18, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value; + value.level = 200U; + value.transitionTime.SetNonNull(); + value.transitionTime.Value() = 0U; + value.optionsMask = static_cast>(0U); + value.optionsOverride = static_cast>(0U); + return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id, + value, chip::NullOptional + + ); + } + case 19: { + LogStep(19, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose", + 77); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 20: { + LogStep(20, + "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001, the SceneID field set to 0x01 and " + "the TransitionTime field set to 0x0032 (5s)."); + VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::RecallScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + value.transitionTime.Emplace(); + value.transitionTime.Value().SetNonNull(); + value.transitionTime.Value().Value() = 50U; + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RecallScene::Id, value, + chip::NullOptional + + ); + } + case 21: { + LogStep(21, "Wait 5s"); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; + value.ms = 5000UL; + return WaitForMs(kIdentityAlpha, value); + } + case 22: { + LogStep(22, "TH confirm the DUT reached AC2 (on level control cluster) after 5s"); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true, + chip::NullOptional); + } + case 23: { + LogStep(23, "DUT transitions to AC1 over 5."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please confirm that transition to AC1 was made over 5sgarbage: not in length on purpose", 54); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 24: { + LogStep(24, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value; + value.level = 200U; + value.transitionTime.SetNonNull(); + value.transitionTime.Value() = 0U; + value.optionsMask = static_cast>(0U); + value.optionsOverride = static_cast>(0U); + return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id, + value, chip::NullOptional + + ); + } + case 25: { + LogStep(25, "TH configures AC2 on DUT for all implemented application clusters supporting scenes."); + VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value; + value.message = chip::Span( + "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose", + 77); + value.expectedValue.Emplace(); + value.expectedValue.Value() = chip::Span("ygarbage: not in length on purpose", 1); + return UserPrompt(kIdentityAlpha, value); + } + case 26: { + LogStep(26, + "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001, the SceneID field set to 0x01 and " + "the TransitionTime field set to null (no transition time override)."); + VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); + ListFreer listFreer; + chip::app::Clusters::Scenes::Commands::RecallScene::Type value; + value.groupID = 1U; + value.sceneID = 1U; + value.transitionTime.Emplace(); + value.transitionTime.Value().SetNull(); + return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RecallScene::Id, value, + chip::NullOptional + + ); + } + } return CHIP_NO_ERROR; } }; @@ -119652,6 +122102,7 @@ void registerCommandsTests(Commands & commands, CredentialIssuerCommands * creds make_unique(credsIssuerConfig), make_unique(credsIssuerConfig), make_unique(credsIssuerConfig), + make_unique(credsIssuerConfig), make_unique(credsIssuerConfig), make_unique(credsIssuerConfig), make_unique(credsIssuerConfig), 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 5222462cfdd881..be76b9e826e391 100644 --- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h +++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h @@ -1629,6 +1629,8 @@ class SubscribeAttributeGroupsClusterRevision : public SubscribeAttribute { | * SceneValid | 0x0003 | | * NameSupport | 0x0004 | | * LastConfiguredBy | 0x0005 | +| * SceneTableSize | 0x0006 | +| * RemainingCapacity | 0x0007 | | * GeneratedCommandList | 0xFFF8 | | * AcceptedCommandList | 0xFFF9 | | * EventList | 0xFFFA | @@ -1687,15 +1689,7 @@ class ScenesAddScene : public ClusterCommand { } else { newElement_2.attributeID = nil; } - { // Scope for our temporary variables - auto * array_4 = [NSMutableArray new]; - for (auto & entry_4 : entry_2.attributeValue) { - NSNumber * newElement_4; - newElement_4 = [NSNumber numberWithUnsignedChar:entry_4]; - [array_4 addObject:newElement_4]; - } - newElement_2.attributeValue = array_4; - } + newElement_2.attributeValue = [NSNumber numberWithUnsignedInt:entry_2.attributeValue]; [array_2 addObject:newElement_2]; } newElement_0.attributeValueList = array_2; @@ -2068,15 +2062,7 @@ class ScenesEnhancedAddScene : public ClusterCommand { } else { newElement_2.attributeID = nil; } - { // Scope for our temporary variables - auto * array_4 = [NSMutableArray new]; - for (auto & entry_4 : entry_2.attributeValue) { - NSNumber * newElement_4; - newElement_4 = [NSNumber numberWithUnsignedChar:entry_4]; - [array_4 addObject:newElement_4]; - } - newElement_2.attributeValue = array_4; - } + newElement_2.attributeValue = [NSNumber numberWithUnsignedInt:entry_2.attributeValue]; [array_2 addObject:newElement_2]; } newElement_0.attributeValueList = array_2; @@ -2608,6 +2594,138 @@ class SubscribeAttributeScenesLastConfiguredBy : public SubscribeAttribute { } }; +/* + * Attribute SceneTableSize + */ +class ReadScenesSceneTableSize : public ReadAttribute { +public: + ReadScenesSceneTableSize() + : ReadAttribute("scene-table-size") + { + } + + ~ReadScenesSceneTableSize() {} + + CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override + { + ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x00000006) on endpoint %u", endpointId); + + dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); + __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; + [cluster readAttributeSceneTableSizeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) { + NSLog(@"Scenes.SceneTableSize response %@", [value description]); + if (error != nil) { + LogNSError("Scenes SceneTableSize read Error", error); + } + SetCommandExitStatus(error); + }]; + return CHIP_NO_ERROR; + } +}; + +class SubscribeAttributeScenesSceneTableSize : public SubscribeAttribute { +public: + SubscribeAttributeScenesSceneTableSize() + : SubscribeAttribute("scene-table-size") + { + } + + ~SubscribeAttributeScenesSceneTableSize() {} + + CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override + { + ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x00000006) on endpoint %u", endpointId); + dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); + __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; + __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)]; + if (mKeepSubscriptions.HasValue()) { + params.replaceExistingSubscriptions = !mKeepSubscriptions.Value(); + } + if (mFabricFiltered.HasValue()) { + params.filterByFabric = mFabricFiltered.Value(); + } + if (mAutoResubscribe.HasValue()) { + params.resubscribeAutomatically = mAutoResubscribe.Value(); + } + [cluster subscribeAttributeSceneTableSizeWithParams:params + subscriptionEstablished:^() { + mSubscriptionEstablished = YES; + } + reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) { + NSLog(@"Scenes.SceneTableSize response %@", [value description]); + SetCommandExitStatus(error); + }]; + + return CHIP_NO_ERROR; + } +}; + +/* + * Attribute RemainingCapacity + */ +class ReadScenesRemainingCapacity : public ReadAttribute { +public: + ReadScenesRemainingCapacity() + : ReadAttribute("remaining-capacity") + { + } + + ~ReadScenesRemainingCapacity() {} + + CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override + { + ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x00000007) on endpoint %u", endpointId); + + dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); + __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; + [cluster readAttributeRemainingCapacityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) { + NSLog(@"Scenes.RemainingCapacity response %@", [value description]); + if (error != nil) { + LogNSError("Scenes RemainingCapacity read Error", error); + } + SetCommandExitStatus(error); + }]; + return CHIP_NO_ERROR; + } +}; + +class SubscribeAttributeScenesRemainingCapacity : public SubscribeAttribute { +public: + SubscribeAttributeScenesRemainingCapacity() + : SubscribeAttribute("remaining-capacity") + { + } + + ~SubscribeAttributeScenesRemainingCapacity() {} + + CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override + { + ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x00000007) on endpoint %u", endpointId); + dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); + __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; + __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)]; + if (mKeepSubscriptions.HasValue()) { + params.replaceExistingSubscriptions = !mKeepSubscriptions.Value(); + } + if (mFabricFiltered.HasValue()) { + params.filterByFabric = mFabricFiltered.Value(); + } + if (mAutoResubscribe.HasValue()) { + params.resubscribeAutomatically = mAutoResubscribe.Value(); + } + [cluster subscribeAttributeRemainingCapacityWithParams:params + subscriptionEstablished:^() { + mSubscriptionEstablished = YES; + } + reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) { + NSLog(@"Scenes.RemainingCapacity response %@", [value description]); + SetCommandExitStatus(error); + }]; + + return CHIP_NO_ERROR; + } +}; + /* * Attribute GeneratedCommandList */ @@ -158958,6 +159076,10 @@ void registerClusterScenes(Commands & commands) make_unique(), // make_unique(), // make_unique(), // + make_unique(), // + make_unique(), // + make_unique(), // + make_unique(), // make_unique(), // make_unique(), // make_unique(), //