diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index dc152c1a714f19..4297e791326786 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -26,14 +26,14 @@ on:
run-codeql:
required: false
type: boolean
-
+
concurrency:
group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }}
cancel-in-progress: true
env:
CHIP_NO_LOG_TIMESTAMPS: true
-
+
jobs:
build_linux_gcc_debug:
name: Build on Linux (gcc_debug)
@@ -210,7 +210,7 @@ jobs:
./scripts/run_in_build_env.sh \
"./scripts/run-clang-tidy-on-compile-commands.py \
--compile-database out/sanitizers/compile_commands.json \
- --file-exclude-regex '/(repo|zzz_generated|lwip/standalone)/|-ReadImpl|-InvokeSubscribeImpl|CodegenDataModel_Write' \
+ --file-exclude-regex '/(repo|zzz_generated|lwip/standalone)/|-ReadImpl|-InvokeSubscribeImpl|CodegenDataModel_Write|QuieterReporting' \
check \
"
- name: Clean output
@@ -243,7 +243,7 @@ jobs:
run: |
rm -rf ./zzz_pregenerated
mv scripts/codegen.py.renamed scripts/codegen.py
- mv scripts/tools/zap/generate.py.renamed scripts/tools/zap/generate.py
+ mv scripts/tools/zap/generate.py.renamed scripts/tools/zap/generate.py
- name: Run fake linux tests with build_examples
run: |
./scripts/run_in_build_env.sh \
@@ -253,7 +253,7 @@ jobs:
uses: ./.github/actions/perform-codeql-analysis
with:
language: cpp
-
+
- name: Uploading core files
uses: actions/upload-artifact@v4
if: ${{ failure() && !env.ACT }}
@@ -430,7 +430,7 @@ jobs:
./scripts/run_in_build_env.sh \
"./scripts/run-clang-tidy-on-compile-commands.py \
--compile-database out/default/compile_commands.json \
- --file-exclude-regex '/(repo|zzz_generated|lwip/standalone)/|CodegenDataModel_Write' \
+ --file-exclude-regex '/(repo|zzz_generated|lwip/standalone)/|CodegenDataModel_Write|QuieterReporting' \
check \
"
- name: Uploading diagnostic logs
@@ -445,7 +445,7 @@ jobs:
uses: ./.github/actions/perform-codeql-analysis
with:
language: cpp
-
+
# TODO Log Upload https://github.com/project-chip/connectedhomeip/issues/2227
# TODO https://github.com/project-chip/connectedhomeip/issues/1512
diff --git a/.github/workflows/examples-nxp.yaml b/.github/workflows/examples-nxp.yaml
index 05d434b0a67792..07ab55d1315bb5 100644
--- a/.github/workflows/examples-nxp.yaml
+++ b/.github/workflows/examples-nxp.yaml
@@ -60,14 +60,14 @@ jobs:
run: |
scripts/run_in_build_env.sh "\
./scripts/build/build_examples.py \
- --target nxp-k32w0-lighting \
- --target nxp-k32w0-lighting-factory \
- --target nxp-k32w0-lighting-rotating-id \
- --target nxp-k32w0-contact-sensor \
- --target nxp-k32w0-contact-sensor-low-power \
- --target nxp-k32w0-contact-sensor-low-power-factory \
- --target nxp-k32w1-lighting \
- --target nxp-k32w1-contact-sensor-low-power \
+ --target nxp-k32w0-freertos-lighting \
+ --target nxp-k32w0-freertos-lighting-factory \
+ --target nxp-k32w0-freertos-lighting-rotating-id \
+ --target nxp-k32w0-freertos-contact-sensor \
+ --target nxp-k32w0-freertos-contact-sensor-low-power \
+ --target nxp-k32w0-freertos-contact-sensor-low-power-factory \
+ --target nxp-k32w1-freertos-lighting \
+ --target nxp-k32w1-freertos-contact-sensor-low-power \
build \
--copy-artifacts-to out/artifacts \
"
@@ -75,21 +75,21 @@ jobs:
run: |
.environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \
nxp k32w0+release light \
- out/artifacts/nxp-k32w0-lighting/chip-k32w0x-light-example.elf \
+ out/artifacts/nxp-k32w0-freertos-lighting/chip-k32w0x-light-example.elf \
/tmp/bloat_reports/
.environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \
nxp k32w1+release light \
- out/artifacts/nxp-k32w1-lighting/chip-k32w1-light-example.elf \
+ out/artifacts/nxp-k32w1-freertos-lighting/chip-k32w1-light-example.elf \
/tmp/bloat_reports/
- name: Get contact sensor size stats
run: |
.environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \
nxp k32w0+release contact \
- out/artifacts/nxp-k32w0-contact-sensor-low-power/chip-k32w0x-contact-example.elf \
+ out/artifacts/nxp-k32w0-freertos-contact-sensor-low-power/chip-k32w0x-contact-example.elf \
/tmp/bloat_reports/
.environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \
nxp k32w1+release contact \
- out/artifacts/nxp-k32w1-contact-sensor-low-power/chip-k32w1-contact-example.elf \
+ out/artifacts/nxp-k32w1-freertos-contact-sensor-low-power/chip-k32w1-contact-example.elf \
/tmp/bloat_reports/
- name: Uploading Size Reports
uses: ./.github/actions/upload-size-reports
diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml
index 866a30f17c4419..7a3d516f06c64b 100644
--- a/.github/workflows/tests.yaml
+++ b/.github/workflows/tests.yaml
@@ -112,6 +112,7 @@ jobs:
src/app/zap-templates/zcl/data-model/chip/channel-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/clusters-extensions.xml \
src/app/zap-templates/zcl/data-model/chip/color-control-cluster.xml \
+ src/app/zap-templates/zcl/data-model/chip/commissioner-control-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/concentration-measurement-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/content-launch-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/content-app-observer-cluster.xml \
@@ -494,7 +495,7 @@ jobs:
- name: Run Tests
run: |
mkdir -p out/trace_data
- scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --quiet --app-args "--trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script-args "--log-level INFO -t 3600 --disable-test ClusterObjectTests.TestTimedRequestTimeout --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/controller/python/test/test_scripts/mobile-device-test.py'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/python_testing/TC_ACE_1_2.py'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/python_testing/TC_ACE_1_3.py'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/python_testing/TC_ACE_1_4.py'
diff --git a/data_model/1.3/clusters/ACL-Cluster.xml b/data_model/1.3/clusters/ACL-Cluster.xml
index a193ef2ac3206f..deed8c409337a5 100644
--- a/data_model/1.3/clusters/ACL-Cluster.xml
+++ b/data_model/1.3/clusters/ACL-Cluster.xml
@@ -169,19 +169,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/AdminCommissioningCluster.xml b/data_model/1.3/clusters/AdminCommissioningCluster.xml
index ccbb579134dc00..8e95e46f128db0 100644
--- a/data_model/1.3/clusters/AdminCommissioningCluster.xml
+++ b/data_model/1.3/clusters/AdminCommissioningCluster.xml
@@ -91,12 +91,12 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/1.3/clusters/AlarmBase.xml b/data_model/1.3/clusters/AlarmBase.xml
index fd0ccb5bc19d46..e374dcc382d208 100644
--- a/data_model/1.3/clusters/AlarmBase.xml
+++ b/data_model/1.3/clusters/AlarmBase.xml
@@ -80,7 +80,7 @@ Davis, CA 95616, USA
-
+
@@ -91,7 +91,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/ApplicationBasic.xml b/data_model/1.3/clusters/ApplicationBasic.xml
index ee39b8a421209d..28e47e7800352e 100644
--- a/data_model/1.3/clusters/ApplicationBasic.xml
+++ b/data_model/1.3/clusters/ApplicationBasic.xml
@@ -92,29 +92,29 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -125,14 +125,14 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/1.3/clusters/ApplicationLauncher.xml b/data_model/1.3/clusters/ApplicationLauncher.xml
index 57d6858dd8ce14..27fa528a81e8cf 100644
--- a/data_model/1.3/clusters/ApplicationLauncher.xml
+++ b/data_model/1.3/clusters/ApplicationLauncher.xml
@@ -103,14 +103,14 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/1.3/clusters/BallastConfiguration.xml b/data_model/1.3/clusters/BallastConfiguration.xml
index 0f37d86067e994..9dbf4e61887d76 100644
--- a/data_model/1.3/clusters/BallastConfiguration.xml
+++ b/data_model/1.3/clusters/BallastConfiguration.xml
@@ -65,7 +65,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -116,12 +118,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -141,12 +143,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -155,7 +157,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/BasicInformationCluster.xml b/data_model/1.3/clusters/BasicInformationCluster.xml
index 137e8b70408bf8..69a882a09490d8 100644
--- a/data_model/1.3/clusters/BasicInformationCluster.xml
+++ b/data_model/1.3/clusters/BasicInformationCluster.xml
@@ -174,100 +174,100 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -276,29 +276,29 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/Binding-Cluster.xml b/data_model/1.3/clusters/Binding-Cluster.xml
index 444c99b315348d..055725f0b9ee47 100644
--- a/data_model/1.3/clusters/Binding-Cluster.xml
+++ b/data_model/1.3/clusters/Binding-Cluster.xml
@@ -97,7 +97,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/BooleanState.xml b/data_model/1.3/clusters/BooleanState.xml
index 5bb29f53ae0c3e..ddb16e26a1d6ad 100644
--- a/data_model/1.3/clusters/BooleanState.xml
+++ b/data_model/1.3/clusters/BooleanState.xml
@@ -68,7 +68,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/BooleanStateConfiguration.xml b/data_model/1.3/clusters/BooleanStateConfiguration.xml
index 01444d565294b3..719cd9569b5ae2 100644
--- a/data_model/1.3/clusters/BooleanStateConfiguration.xml
+++ b/data_model/1.3/clusters/BooleanStateConfiguration.xml
@@ -106,7 +106,7 @@ Davis, CA 95616, USA
-
+
@@ -114,7 +114,7 @@ Davis, CA 95616, USA
-
+
@@ -122,7 +122,7 @@ Davis, CA 95616, USA
-
+
@@ -145,7 +145,7 @@ Davis, CA 95616, USA
-
+
@@ -155,7 +155,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/Channel.xml b/data_model/1.3/clusters/Channel.xml
index 17144c9032c3e5..6177bfe6a652cc 100644
--- a/data_model/1.3/clusters/Channel.xml
+++ b/data_model/1.3/clusters/Channel.xml
@@ -307,7 +307,7 @@ Davis, CA 95616, USA
-
+
@@ -315,7 +315,7 @@ Davis, CA 95616, USA
-
+
@@ -366,6 +366,7 @@ Davis, CA 95616, USA
+
@@ -400,6 +401,7 @@ Davis, CA 95616, USA
+
@@ -412,6 +414,7 @@ Davis, CA 95616, USA
+
@@ -437,6 +440,7 @@ Davis, CA 95616, USA
+
diff --git a/data_model/1.3/clusters/ColorControl.xml b/data_model/1.3/clusters/ColorControl.xml
index 456b3ff14cfff9..ebf29e0b51e758 100644
--- a/data_model/1.3/clusters/ColorControl.xml
+++ b/data_model/1.3/clusters/ColorControl.xml
@@ -74,16 +74,16 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -91,7 +91,7 @@ Davis, CA 95616, USA
-
+
@@ -99,7 +99,7 @@ Davis, CA 95616, USA
-
+
@@ -112,7 +112,7 @@ Davis, CA 95616, USA
-
+
@@ -120,7 +120,7 @@ Davis, CA 95616, USA
-
+
@@ -155,7 +155,7 @@ Davis, CA 95616, USA
-
+
@@ -174,7 +174,7 @@ Davis, CA 95616, USA
-
+
@@ -191,110 +191,110 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -319,7 +319,7 @@ Davis, CA 95616, USA
-
+
@@ -334,7 +334,7 @@ Davis, CA 95616, USA
-
+
@@ -349,12 +349,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -375,27 +375,27 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -439,11 +439,11 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/1.3/clusters/ConcentrationMeasurement.xml b/data_model/1.3/clusters/ConcentrationMeasurement.xml
index 4b51cffa124321..b622a3560b4ff0 100644
--- a/data_model/1.3/clusters/ConcentrationMeasurement.xml
+++ b/data_model/1.3/clusters/ConcentrationMeasurement.xml
@@ -62,16 +62,16 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -181,7 +181,7 @@ Davis, CA 95616, USA
-
+
@@ -189,7 +189,7 @@ Davis, CA 95616, USA
-
+
@@ -197,7 +197,7 @@ Davis, CA 95616, USA
-
+
@@ -205,7 +205,7 @@ Davis, CA 95616, USA
-
+
@@ -213,7 +213,7 @@ Davis, CA 95616, USA
-
+
@@ -221,7 +221,7 @@ Davis, CA 95616, USA
-
+
@@ -229,7 +229,7 @@ Davis, CA 95616, USA
-
+
@@ -244,14 +244,14 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/1.3/clusters/ContentControl.xml b/data_model/1.3/clusters/ContentControl.xml
index b2539cf445c289..6848886c43ac02 100644
--- a/data_model/1.3/clusters/ContentControl.xml
+++ b/data_model/1.3/clusters/ContentControl.xml
@@ -60,7 +60,9 @@ Davis, CA 95616, USA
-
+
+
+
diff --git a/data_model/1.3/clusters/ContentLauncher.xml b/data_model/1.3/clusters/ContentLauncher.xml
index 9a5674efa8eb64..b4d6e7fa26500c 100644
--- a/data_model/1.3/clusters/ContentLauncher.xml
+++ b/data_model/1.3/clusters/ContentLauncher.xml
@@ -299,7 +299,7 @@ Davis, CA 95616, USA
-
+
@@ -307,7 +307,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/Descriptor-Cluster.xml b/data_model/1.3/clusters/Descriptor-Cluster.xml
index 659b2ffaa5ddc0..d648f1c7f1be91 100644
--- a/data_model/1.3/clusters/Descriptor-Cluster.xml
+++ b/data_model/1.3/clusters/Descriptor-Cluster.xml
@@ -84,20 +84,20 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -108,7 +108,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/DeviceEnergyManagement.xml b/data_model/1.3/clusters/DeviceEnergyManagement.xml
index f74d7e572550cc..0fe30cc92e5506 100644
--- a/data_model/1.3/clusters/DeviceEnergyManagement.xml
+++ b/data_model/1.3/clusters/DeviceEnergyManagement.xml
@@ -64,7 +64,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -473,6 +475,63 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data_model/1.3/clusters/DiagnosticsEthernet.xml b/data_model/1.3/clusters/DiagnosticsEthernet.xml
index dfcd3d11c41f52..fd2bb0341ca06c 100644
--- a/data_model/1.3/clusters/DiagnosticsEthernet.xml
+++ b/data_model/1.3/clusters/DiagnosticsEthernet.xml
@@ -62,7 +62,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -108,57 +110,57 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/DiagnosticsGeneral.xml b/data_model/1.3/clusters/DiagnosticsGeneral.xml
index 4da912b03dc3df..ff78100fe3a7d3 100644
--- a/data_model/1.3/clusters/DiagnosticsGeneral.xml
+++ b/data_model/1.3/clusters/DiagnosticsGeneral.xml
@@ -223,17 +223,17 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -310,7 +310,6 @@ Davis, CA 95616, USA
-
diff --git a/data_model/1.3/clusters/DiagnosticsSoftware.xml b/data_model/1.3/clusters/DiagnosticsSoftware.xml
index 7cb3c9ff39ad2f..c7ee8ee842bf02 100644
--- a/data_model/1.3/clusters/DiagnosticsSoftware.xml
+++ b/data_model/1.3/clusters/DiagnosticsSoftware.xml
@@ -62,7 +62,9 @@ Davis, CA 95616, USA
-
+
+
+
diff --git a/data_model/1.3/clusters/DiagnosticsThread.xml b/data_model/1.3/clusters/DiagnosticsThread.xml
index 120efaddf8c08e..1da3eba21a4e4e 100644
--- a/data_model/1.3/clusters/DiagnosticsThread.xml
+++ b/data_model/1.3/clusters/DiagnosticsThread.xml
@@ -63,7 +63,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -257,38 +259,38 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -305,356 +307,356 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/DiagnosticsWiFi.xml b/data_model/1.3/clusters/DiagnosticsWiFi.xml
index b3951d967dc31f..6ef28ee4cc09e0 100644
--- a/data_model/1.3/clusters/DiagnosticsWiFi.xml
+++ b/data_model/1.3/clusters/DiagnosticsWiFi.xml
@@ -55,14 +55,16 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
+
-
+
-
+
+
+
@@ -141,81 +143,81 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/DoorLock.xml b/data_model/1.3/clusters/DoorLock.xml
index fcf86f3a95aa24..11b5de565e2afb 100644
--- a/data_model/1.3/clusters/DoorLock.xml
+++ b/data_model/1.3/clusters/DoorLock.xml
@@ -570,7 +570,7 @@ Davis, CA 95616, USA
-
+
@@ -738,7 +738,7 @@ Davis, CA 95616, USA
-
+
@@ -753,7 +753,7 @@ Davis, CA 95616, USA
-
+
@@ -779,167 +779,167 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -950,7 +950,7 @@ Davis, CA 95616, USA
-
+
@@ -961,7 +961,7 @@ Davis, CA 95616, USA
-
+
@@ -973,7 +973,7 @@ Davis, CA 95616, USA
-
+
@@ -986,7 +986,7 @@ Davis, CA 95616, USA
-
+
@@ -994,12 +994,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -1009,21 +1009,21 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -1033,7 +1033,7 @@ Davis, CA 95616, USA
-
+
@@ -1043,14 +1043,14 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/1.3/clusters/ElectricalEnergyMeasurement.xml b/data_model/1.3/clusters/ElectricalEnergyMeasurement.xml
index f8bbec4c03db95..9a4012eebc5327 100644
--- a/data_model/1.3/clusters/ElectricalEnergyMeasurement.xml
+++ b/data_model/1.3/clusters/ElectricalEnergyMeasurement.xml
@@ -135,12 +135,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -150,7 +150,7 @@ Davis, CA 95616, USA
-
+
@@ -160,7 +160,7 @@ Davis, CA 95616, USA
-
+
@@ -170,7 +170,7 @@ Davis, CA 95616, USA
-
+
@@ -180,7 +180,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/ElectricalPowerMeasurement.xml b/data_model/1.3/clusters/ElectricalPowerMeasurement.xml
index cfb8ce9018e73c..3f4e79ccdefcec 100644
--- a/data_model/1.3/clusters/ElectricalPowerMeasurement.xml
+++ b/data_model/1.3/clusters/ElectricalPowerMeasurement.xml
@@ -170,39 +170,39 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
@@ -210,7 +210,7 @@ Davis, CA 95616, USA
-
+
@@ -218,13 +218,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -232,7 +232,7 @@ Davis, CA 95616, USA
-
+
@@ -240,7 +240,7 @@ Davis, CA 95616, USA
-
+
@@ -248,7 +248,7 @@ Davis, CA 95616, USA
-
+
@@ -256,7 +256,7 @@ Davis, CA 95616, USA
-
+
@@ -264,7 +264,7 @@ Davis, CA 95616, USA
-
+
@@ -273,7 +273,7 @@ Davis, CA 95616, USA
-
+
@@ -282,7 +282,7 @@ Davis, CA 95616, USA
-
+
@@ -290,7 +290,7 @@ Davis, CA 95616, USA
-
+
@@ -298,7 +298,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/EnergyEVSE.xml b/data_model/1.3/clusters/EnergyEVSE.xml
index 4b881f5a1135a4..13052281c5157c 100644
--- a/data_model/1.3/clusters/EnergyEVSE.xml
+++ b/data_model/1.3/clusters/EnergyEVSE.xml
@@ -252,7 +252,7 @@ Davis, CA 95616, USA
-
+
@@ -265,37 +265,37 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
@@ -303,33 +303,33 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -337,14 +337,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -352,14 +352,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -367,7 +367,7 @@ Davis, CA 95616, USA
-
+
@@ -375,23 +375,23 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/EnergyPreference.xml b/data_model/1.3/clusters/EnergyPreference.xml
index eafb527a868b22..c43161d8dff6f9 100644
--- a/data_model/1.3/clusters/EnergyPreference.xml
+++ b/data_model/1.3/clusters/EnergyPreference.xml
@@ -62,7 +62,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -102,7 +104,7 @@ Davis, CA 95616, USA
-
+
@@ -110,7 +112,7 @@ Davis, CA 95616, USA
-
+
@@ -118,7 +120,7 @@ Davis, CA 95616, USA
-
+
@@ -127,7 +129,7 @@ Davis, CA 95616, USA
-
+
@@ -135,7 +137,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/FanControl.xml b/data_model/1.3/clusters/FanControl.xml
index 224f811261f68b..1016b8923ba308 100644
--- a/data_model/1.3/clusters/FanControl.xml
+++ b/data_model/1.3/clusters/FanControl.xml
@@ -119,36 +119,36 @@ Davis, CA 95616, USA
- -
+
-
- -
+
-
- -
+
-
- -
+
-
- -
+
-
- -
+
-
@@ -187,13 +187,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -201,13 +201,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -218,7 +218,7 @@ Davis, CA 95616, USA
-
+
@@ -226,7 +226,7 @@ Davis, CA 95616, USA
-
+
@@ -234,7 +234,7 @@ Davis, CA 95616, USA
-
+
@@ -242,7 +242,7 @@ Davis, CA 95616, USA
-
+
@@ -250,7 +250,7 @@ Davis, CA 95616, USA
-
+
@@ -258,7 +258,7 @@ Davis, CA 95616, USA
-
+
@@ -266,7 +266,7 @@ Davis, CA 95616, USA
-
+
@@ -274,7 +274,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/FlowMeasurement.xml b/data_model/1.3/clusters/FlowMeasurement.xml
index 71178874d57c14..717641eacb84eb 100644
--- a/data_model/1.3/clusters/FlowMeasurement.xml
+++ b/data_model/1.3/clusters/FlowMeasurement.xml
@@ -70,19 +70,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/GeneralCommissioningCluster.xml b/data_model/1.3/clusters/GeneralCommissioningCluster.xml
index e440222780ea02..285bb4455d8f49 100644
--- a/data_model/1.3/clusters/GeneralCommissioningCluster.xml
+++ b/data_model/1.3/clusters/GeneralCommissioningCluster.xml
@@ -109,7 +109,7 @@ Davis, CA 95616, USA
-
+
@@ -119,12 +119,12 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/1.3/clusters/Group-Key-Management-Cluster.xml b/data_model/1.3/clusters/Group-Key-Management-Cluster.xml
index c1819628e34d7b..4e9ae482a064ed 100644
--- a/data_model/1.3/clusters/Group-Key-Management-Cluster.xml
+++ b/data_model/1.3/clusters/Group-Key-Management-Cluster.xml
@@ -167,7 +167,7 @@ Davis, CA 95616, USA
-
+
@@ -179,12 +179,12 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/1.3/clusters/Groups.xml b/data_model/1.3/clusters/Groups.xml
index 1f168e13fad933..6c53c1a602f255 100644
--- a/data_model/1.3/clusters/Groups.xml
+++ b/data_model/1.3/clusters/Groups.xml
@@ -83,7 +83,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/ICDManagement.xml b/data_model/1.3/clusters/ICDManagement.xml
index 512dfd119efef7..b1b478a166ee80 100644
--- a/data_model/1.3/clusters/ICDManagement.xml
+++ b/data_model/1.3/clusters/ICDManagement.xml
@@ -120,24 +120,24 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -145,14 +145,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -160,7 +160,7 @@ Davis, CA 95616, USA
-
+
@@ -171,7 +171,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/IlluminanceMeasurement.xml b/data_model/1.3/clusters/IlluminanceMeasurement.xml
index d3228b845ca058..02aa466de6b8a6 100644
--- a/data_model/1.3/clusters/IlluminanceMeasurement.xml
+++ b/data_model/1.3/clusters/IlluminanceMeasurement.xml
@@ -83,20 +83,20 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -107,7 +107,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/Label-Cluster-FixedLabelCluster.xml b/data_model/1.3/clusters/Label-Cluster-FixedLabelCluster.xml
index 98106b6fc33e40..b915e77bb5a01f 100644
--- a/data_model/1.3/clusters/Label-Cluster-FixedLabelCluster.xml
+++ b/data_model/1.3/clusters/Label-Cluster-FixedLabelCluster.xml
@@ -70,7 +70,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/Label-Cluster-LabelCluster.xml b/data_model/1.3/clusters/Label-Cluster-LabelCluster.xml
index 0ca5566f0dc132..43148b6dc9186f 100644
--- a/data_model/1.3/clusters/Label-Cluster-LabelCluster.xml
+++ b/data_model/1.3/clusters/Label-Cluster-LabelCluster.xml
@@ -80,7 +80,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/Label-Cluster-UserLabelCluster.xml b/data_model/1.3/clusters/Label-Cluster-UserLabelCluster.xml
index eba0099ffb59d2..40dac53a4242cd 100644
--- a/data_model/1.3/clusters/Label-Cluster-UserLabelCluster.xml
+++ b/data_model/1.3/clusters/Label-Cluster-UserLabelCluster.xml
@@ -70,7 +70,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/LaundryDryerControls.xml b/data_model/1.3/clusters/LaundryDryerControls.xml
index af4f787c0432b7..d860d2ef9dcf21 100644
--- a/data_model/1.3/clusters/LaundryDryerControls.xml
+++ b/data_model/1.3/clusters/LaundryDryerControls.xml
@@ -88,7 +88,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/LaundryWasherControls.xml b/data_model/1.3/clusters/LaundryWasherControls.xml
index 6c4f4bc0b0c3a5..2718142b74f991 100644
--- a/data_model/1.3/clusters/LaundryWasherControls.xml
+++ b/data_model/1.3/clusters/LaundryWasherControls.xml
@@ -108,7 +108,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/LevelControl.xml b/data_model/1.3/clusters/LevelControl.xml
index fa6cbe397a672a..2753325511ada6 100644
--- a/data_model/1.3/clusters/LevelControl.xml
+++ b/data_model/1.3/clusters/LevelControl.xml
@@ -68,7 +68,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -120,7 +122,7 @@ Davis, CA 95616, USA
-
+
@@ -153,7 +155,7 @@ Davis, CA 95616, USA
-
+
@@ -184,28 +186,28 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/LocalizationConfiguration.xml b/data_model/1.3/clusters/LocalizationConfiguration.xml
index 66809f545389be..7ddfba8efcc9cb 100644
--- a/data_model/1.3/clusters/LocalizationConfiguration.xml
+++ b/data_model/1.3/clusters/LocalizationConfiguration.xml
@@ -66,7 +66,7 @@ Davis, CA 95616, USA
-
+
@@ -75,7 +75,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/LocalizationTimeFormat.xml b/data_model/1.3/clusters/LocalizationTimeFormat.xml
index db8b809b0341a9..2ede281c7352a9 100644
--- a/data_model/1.3/clusters/LocalizationTimeFormat.xml
+++ b/data_model/1.3/clusters/LocalizationTimeFormat.xml
@@ -125,12 +125,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -138,7 +138,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/LocalizationUnit.xml b/data_model/1.3/clusters/LocalizationUnit.xml
index 2c6e1ecbd648e6..0157ebb53b0d39 100644
--- a/data_model/1.3/clusters/LocalizationUnit.xml
+++ b/data_model/1.3/clusters/LocalizationUnit.xml
@@ -84,7 +84,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/MediaPlayback.xml b/data_model/1.3/clusters/MediaPlayback.xml
index 03175277dc12c5..dae60d7a1b2572 100644
--- a/data_model/1.3/clusters/MediaPlayback.xml
+++ b/data_model/1.3/clusters/MediaPlayback.xml
@@ -223,7 +223,7 @@ Davis, CA 95616, USA
-
+
@@ -231,7 +231,7 @@ Davis, CA 95616, USA
-
+
@@ -239,7 +239,7 @@ Davis, CA 95616, USA
-
+
@@ -254,7 +254,7 @@ Davis, CA 95616, USA
-
+
@@ -262,7 +262,7 @@ Davis, CA 95616, USA
-
+
@@ -270,7 +270,7 @@ Davis, CA 95616, USA
-
+
@@ -279,7 +279,7 @@ Davis, CA 95616, USA
-
+
@@ -287,7 +287,7 @@ Davis, CA 95616, USA
-
+
@@ -296,7 +296,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/MicrowaveOvenControl.xml b/data_model/1.3/clusters/MicrowaveOvenControl.xml
index ecc9d23b143d4b..5c92c309d6de00 100644
--- a/data_model/1.3/clusters/MicrowaveOvenControl.xml
+++ b/data_model/1.3/clusters/MicrowaveOvenControl.xml
@@ -89,7 +89,7 @@ Davis, CA 95616, USA
-
+
@@ -102,7 +102,7 @@ Davis, CA 95616, USA
-
+
@@ -110,7 +110,7 @@ Davis, CA 95616, USA
-
+
@@ -118,7 +118,7 @@ Davis, CA 95616, USA
-
+
@@ -127,7 +127,7 @@ Davis, CA 95616, USA
-
+
@@ -148,7 +148,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/ModeBase.xml b/data_model/1.3/clusters/ModeBase.xml
index dcd6cf1c448028..0fcc581d07aaf1 100644
--- a/data_model/1.3/clusters/ModeBase.xml
+++ b/data_model/1.3/clusters/ModeBase.xml
@@ -99,25 +99,25 @@ Require at least one standard mode tag. Define reserved ranges for base/derived
-
+
-
+
-
+
-
+
@@ -134,7 +134,6 @@ Require at least one standard mode tag. Define reserved ranges for base/derived
-
diff --git a/data_model/1.3/clusters/ModeSelect.xml b/data_model/1.3/clusters/ModeSelect.xml
index cfdf7adb92761c..76ebf5874af273 100644
--- a/data_model/1.3/clusters/ModeSelect.xml
+++ b/data_model/1.3/clusters/ModeSelect.xml
@@ -97,38 +97,38 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/Mode_DeviceEnergyManagement.xml b/data_model/1.3/clusters/Mode_DeviceEnergyManagement.xml
index e167e8649650ba..ff849a081ff573 100644
--- a/data_model/1.3/clusters/Mode_DeviceEnergyManagement.xml
+++ b/data_model/1.3/clusters/Mode_DeviceEnergyManagement.xml
@@ -62,7 +62,9 @@ Davis, CA 95616, USA
-
+
+
+
diff --git a/data_model/1.3/clusters/NetworkCommissioningCluster.xml b/data_model/1.3/clusters/NetworkCommissioningCluster.xml
index 855947e5dda349..fdd404312f446d 100644
--- a/data_model/1.3/clusters/NetworkCommissioningCluster.xml
+++ b/data_model/1.3/clusters/NetworkCommissioningCluster.xml
@@ -161,13 +161,13 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -262,7 +262,7 @@ Davis, CA 95616, USA
-
+
@@ -274,7 +274,7 @@ Davis, CA 95616, USA
-
+
@@ -285,7 +285,7 @@ Davis, CA 95616, USA
-
+
@@ -296,29 +296,29 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -326,14 +326,14 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/1.3/clusters/OTARequestor.xml b/data_model/1.3/clusters/OTARequestor.xml
index f6a5ff0365abed..3a562c9f18a046 100644
--- a/data_model/1.3/clusters/OTARequestor.xml
+++ b/data_model/1.3/clusters/OTARequestor.xml
@@ -149,7 +149,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/OccupancySensing.xml b/data_model/1.3/clusters/OccupancySensing.xml
index 48756121d24769..b576e91078e663 100644
--- a/data_model/1.3/clusters/OccupancySensing.xml
+++ b/data_model/1.3/clusters/OccupancySensing.xml
@@ -103,7 +103,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/OnOff.xml b/data_model/1.3/clusters/OnOff.xml
index 9366985e5ce35e..1072b96d56a243 100644
--- a/data_model/1.3/clusters/OnOff.xml
+++ b/data_model/1.3/clusters/OnOff.xml
@@ -145,7 +145,7 @@ Davis, CA 95616, USA
-
+
@@ -168,7 +168,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/OperationalCredentialCluster.xml b/data_model/1.3/clusters/OperationalCredentialCluster.xml
index 2aa070f96b2573..b3811db4a5774a 100644
--- a/data_model/1.3/clusters/OperationalCredentialCluster.xml
+++ b/data_model/1.3/clusters/OperationalCredentialCluster.xml
@@ -155,26 +155,26 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -183,7 +183,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/OperationalState.xml b/data_model/1.3/clusters/OperationalState.xml
index 3648a8c81ec8f4..44567fa726f6fd 100644
--- a/data_model/1.3/clusters/OperationalState.xml
+++ b/data_model/1.3/clusters/OperationalState.xml
@@ -114,19 +114,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -179,7 +179,6 @@ Davis, CA 95616, USA
-
diff --git a/data_model/1.3/clusters/PowerSourceCluster.xml b/data_model/1.3/clusters/PowerSourceCluster.xml
index 1c01cc548bfdee..4596880e32b938 100644
--- a/data_model/1.3/clusters/PowerSourceCluster.xml
+++ b/data_model/1.3/clusters/PowerSourceCluster.xml
@@ -556,32 +556,32 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -589,21 +589,21 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -624,14 +624,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -639,7 +639,7 @@ Davis, CA 95616, USA
-
+
@@ -659,7 +659,7 @@ Davis, CA 95616, USA
-
+
@@ -680,7 +680,7 @@ Davis, CA 95616, USA
-
+
@@ -688,7 +688,7 @@ Davis, CA 95616, USA
-
+
@@ -696,7 +696,7 @@ Davis, CA 95616, USA
-
+
@@ -704,7 +704,7 @@ Davis, CA 95616, USA
-
+
@@ -712,7 +712,7 @@ Davis, CA 95616, USA
-
+
@@ -720,7 +720,7 @@ Davis, CA 95616, USA
-
+
@@ -730,7 +730,7 @@ Davis, CA 95616, USA
-
+
@@ -744,7 +744,7 @@ Davis, CA 95616, USA
-
+
@@ -757,7 +757,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/PowerSourceConfigurationCluster.xml b/data_model/1.3/clusters/PowerSourceConfigurationCluster.xml
index 6a47ce1b54cdbd..5348f6f0b091b6 100644
--- a/data_model/1.3/clusters/PowerSourceConfigurationCluster.xml
+++ b/data_model/1.3/clusters/PowerSourceConfigurationCluster.xml
@@ -67,7 +67,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/PowerTopology.xml b/data_model/1.3/clusters/PowerTopology.xml
index 4ebdda614a4aec..b958d03c01aeb1 100644
--- a/data_model/1.3/clusters/PowerTopology.xml
+++ b/data_model/1.3/clusters/PowerTopology.xml
@@ -83,7 +83,7 @@ Davis, CA 95616, USA
-
+
@@ -92,7 +92,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/PressureMeasurement.xml b/data_model/1.3/clusters/PressureMeasurement.xml
index a46e911253941f..bf9b6a9286e381 100644
--- a/data_model/1.3/clusters/PressureMeasurement.xml
+++ b/data_model/1.3/clusters/PressureMeasurement.xml
@@ -75,19 +75,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -98,7 +98,7 @@ Davis, CA 95616, USA
-
+
@@ -106,7 +106,7 @@ Davis, CA 95616, USA
-
+
@@ -114,7 +114,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/ProxyConfiguration-Cluster.xml b/data_model/1.3/clusters/ProxyConfiguration-Cluster.xml
index 8ad566ec8527b2..c33ed5cd03b841 100644
--- a/data_model/1.3/clusters/ProxyConfiguration-Cluster.xml
+++ b/data_model/1.3/clusters/ProxyConfiguration-Cluster.xml
@@ -60,7 +60,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -82,7 +84,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/ProxyDiscovery-Cluster.xml b/data_model/1.3/clusters/ProxyDiscovery-Cluster.xml
index 6fa4a9eb6f3a06..159bdff7333853 100644
--- a/data_model/1.3/clusters/ProxyDiscovery-Cluster.xml
+++ b/data_model/1.3/clusters/ProxyDiscovery-Cluster.xml
@@ -60,7 +60,9 @@ Davis, CA 95616, USA
-
+
+
+
diff --git a/data_model/1.3/clusters/PumpConfigurationControl.xml b/data_model/1.3/clusters/PumpConfigurationControl.xml
index 79fafe659c95e2..b197f63bb4373f 100644
--- a/data_model/1.3/clusters/PumpConfigurationControl.xml
+++ b/data_model/1.3/clusters/PumpConfigurationControl.xml
@@ -175,22 +175,22 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -202,7 +202,7 @@ Davis, CA 95616, USA
-
+
@@ -214,7 +214,7 @@ Davis, CA 95616, USA
-
+
@@ -226,7 +226,7 @@ Davis, CA 95616, USA
-
+
@@ -238,7 +238,7 @@ Davis, CA 95616, USA
-
+
@@ -250,7 +250,7 @@ Davis, CA 95616, USA
-
+
@@ -262,7 +262,7 @@ Davis, CA 95616, USA
-
+
@@ -274,7 +274,7 @@ Davis, CA 95616, USA
-
+
@@ -286,7 +286,7 @@ Davis, CA 95616, USA
-
+
@@ -299,7 +299,7 @@ Davis, CA 95616, USA
-
+
@@ -312,62 +312,62 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/ResourceMonitoring.xml b/data_model/1.3/clusters/ResourceMonitoring.xml
index 6b0e8f3a203ded..09cc479618295f 100644
--- a/data_model/1.3/clusters/ResourceMonitoring.xml
+++ b/data_model/1.3/clusters/ResourceMonitoring.xml
@@ -62,8 +62,8 @@ Davis, CA 95616, USA
-
-
+
+
@@ -73,7 +73,7 @@ Davis, CA 95616, USA
-
+
@@ -103,13 +103,13 @@ Davis, CA 95616, USA
-
- -
+
-
-
- -
+
-
-
@@ -136,7 +136,7 @@ Davis, CA 95616, USA
-
+
@@ -152,13 +152,13 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/1.3/clusters/Scenes.xml b/data_model/1.3/clusters/Scenes.xml
index 9150a754d3041a..2bbd2e246a06cc 100644
--- a/data_model/1.3/clusters/Scenes.xml
+++ b/data_model/1.3/clusters/Scenes.xml
@@ -1,61 +1,61 @@
-
@@ -165,12 +165,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -398,4 +398,4 @@ Davis, CA 95616, USA
-
+
\ No newline at end of file
diff --git a/data_model/1.3/clusters/SmokeCOAlarm.xml b/data_model/1.3/clusters/SmokeCOAlarm.xml
index 25c034ac94082c..4ba9bd2708b476 100644
--- a/data_model/1.3/clusters/SmokeCOAlarm.xml
+++ b/data_model/1.3/clusters/SmokeCOAlarm.xml
@@ -163,31 +163,31 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -196,12 +196,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -226,7 +226,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/Switch.xml b/data_model/1.3/clusters/Switch.xml
index c7b607c637c74c..14912208782baa 100644
--- a/data_model/1.3/clusters/Switch.xml
+++ b/data_model/1.3/clusters/Switch.xml
@@ -95,19 +95,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/TemperatureControl.xml b/data_model/1.3/clusters/TemperatureControl.xml
index 3f5fa9c00332d6..2f2527ce4ad0fa 100644
--- a/data_model/1.3/clusters/TemperatureControl.xml
+++ b/data_model/1.3/clusters/TemperatureControl.xml
@@ -86,7 +86,7 @@ Davis, CA 95616, USA
-
+
@@ -94,7 +94,7 @@ Davis, CA 95616, USA
-
+
@@ -102,7 +102,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/TemperatureMeasurement.xml b/data_model/1.3/clusters/TemperatureMeasurement.xml
index 176fad6b246a60..0935b18edab675 100644
--- a/data_model/1.3/clusters/TemperatureMeasurement.xml
+++ b/data_model/1.3/clusters/TemperatureMeasurement.xml
@@ -71,19 +71,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/Thermostat.xml b/data_model/1.3/clusters/Thermostat.xml
index 75640c697e0478..66d927c3bc6ad0 100644
--- a/data_model/1.3/clusters/Thermostat.xml
+++ b/data_model/1.3/clusters/Thermostat.xml
@@ -472,12 +472,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -489,7 +489,7 @@ Davis, CA 95616, USA
-
+
@@ -497,7 +497,7 @@ Davis, CA 95616, USA
-
+
@@ -505,7 +505,7 @@ Davis, CA 95616, USA
-
+
@@ -513,7 +513,7 @@ Davis, CA 95616, USA
-
+
@@ -521,7 +521,7 @@ Davis, CA 95616, USA
-
+
@@ -529,7 +529,7 @@ Davis, CA 95616, USA
-
+
@@ -537,13 +537,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -553,7 +553,7 @@ Davis, CA 95616, USA
-
+
@@ -561,7 +561,7 @@ Davis, CA 95616, USA
-
+
@@ -569,7 +569,7 @@ Davis, CA 95616, USA
-
+
@@ -580,7 +580,7 @@ Davis, CA 95616, USA
-
+
@@ -591,7 +591,7 @@ Davis, CA 95616, USA
-
+
@@ -599,7 +599,7 @@ Davis, CA 95616, USA
-
+
@@ -607,7 +607,7 @@ Davis, CA 95616, USA
-
+
@@ -615,7 +615,7 @@ Davis, CA 95616, USA
-
+
@@ -623,7 +623,7 @@ Davis, CA 95616, USA
-
+
@@ -631,19 +631,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -663,7 +663,7 @@ Davis, CA 95616, USA
-
+
@@ -671,33 +671,33 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -713,7 +713,7 @@ Davis, CA 95616, USA
-
+
@@ -722,7 +722,7 @@ Davis, CA 95616, USA
-
+
@@ -730,7 +730,7 @@ Davis, CA 95616, USA
-
+
@@ -738,7 +738,7 @@ Davis, CA 95616, USA
-
+
@@ -746,7 +746,7 @@ Davis, CA 95616, USA
-
+
@@ -757,7 +757,7 @@ Davis, CA 95616, USA
-
+
@@ -768,7 +768,7 @@ Davis, CA 95616, USA
-
+
@@ -779,29 +779,29 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -811,18 +811,18 @@ Davis, CA 95616, USA
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/TimeSync.xml b/data_model/1.3/clusters/TimeSync.xml
index 9d4057db8bdb85..a506a647aeb8a3 100644
--- a/data_model/1.3/clusters/TimeSync.xml
+++ b/data_model/1.3/clusters/TimeSync.xml
@@ -213,7 +213,7 @@ Davis, CA 95616, USA
-
+
@@ -228,14 +228,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -244,7 +244,7 @@ Davis, CA 95616, USA
-
+
@@ -253,21 +253,21 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -280,7 +280,7 @@ Davis, CA 95616, USA
-
+
@@ -288,7 +288,7 @@ Davis, CA 95616, USA
-
+
@@ -296,7 +296,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/ValidProxies-Cluster.xml b/data_model/1.3/clusters/ValidProxies-Cluster.xml
index b9db8e1762647f..c5740c90e52433 100644
--- a/data_model/1.3/clusters/ValidProxies-Cluster.xml
+++ b/data_model/1.3/clusters/ValidProxies-Cluster.xml
@@ -60,7 +60,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -75,7 +77,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/ValveConfigurationControl.xml b/data_model/1.3/clusters/ValveConfigurationControl.xml
index b0f2ec91b0fa95..86e511505fd12b 100644
--- a/data_model/1.3/clusters/ValveConfigurationControl.xml
+++ b/data_model/1.3/clusters/ValveConfigurationControl.xml
@@ -108,55 +108,55 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -168,7 +168,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/WakeOnLAN.xml b/data_model/1.3/clusters/WakeOnLAN.xml
index 4f6e032c084b38..7f5c08bdd624ad 100644
--- a/data_model/1.3/clusters/WakeOnLAN.xml
+++ b/data_model/1.3/clusters/WakeOnLAN.xml
@@ -68,13 +68,13 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/1.3/clusters/WaterContentMeasurement.xml b/data_model/1.3/clusters/WaterContentMeasurement.xml
index 85d44793c93ae4..af11c9cf8d514c 100644
--- a/data_model/1.3/clusters/WaterContentMeasurement.xml
+++ b/data_model/1.3/clusters/WaterContentMeasurement.xml
@@ -70,19 +70,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
diff --git a/data_model/1.3/clusters/WindowCovering.xml b/data_model/1.3/clusters/WindowCovering.xml
index af59da5a9f72de..88d7e3dc512cba 100644
--- a/data_model/1.3/clusters/WindowCovering.xml
+++ b/data_model/1.3/clusters/WindowCovering.xml
@@ -391,13 +391,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -408,7 +408,7 @@ Davis, CA 95616, USA
-
+
@@ -419,7 +419,7 @@ Davis, CA 95616, USA
-
+
@@ -431,7 +431,7 @@ Davis, CA 95616, USA
-
+
@@ -443,27 +443,27 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -473,7 +473,7 @@ Davis, CA 95616, USA
-
+
@@ -484,13 +484,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -500,7 +500,7 @@ Davis, CA 95616, USA
-
+
@@ -510,13 +510,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -527,7 +527,7 @@ Davis, CA 95616, USA
-
+
@@ -538,7 +538,7 @@ Davis, CA 95616, USA
-
+
@@ -550,7 +550,7 @@ Davis, CA 95616, USA
-
+
@@ -562,7 +562,7 @@ Davis, CA 95616, USA
-
+
@@ -574,7 +574,7 @@ Davis, CA 95616, USA
-
+
@@ -595,7 +595,7 @@ Davis, CA 95616, USA
-
+
@@ -607,7 +607,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/clusters/cluster_ids.json b/data_model/1.3/clusters/cluster_ids.json
index 40a46edd00722e..82a258ee0c6d7f 100644
--- a/data_model/1.3/clusters/cluster_ids.json
+++ b/data_model/1.3/clusters/cluster_ids.json
@@ -22,7 +22,7 @@
"51": "General Diagnostics",
"52": "Software Diagnostics",
"53": "Thread Network Diagnostics",
- "54": "Wi",
+ "54": "Wi-Fi Network Diagnostics",
"55": "Ethernet Network Diagnostics",
"56": "Time Synchronization",
"57": "Bridged Device Basic Information",
@@ -88,7 +88,7 @@
"1037": "Carbon Dioxide Concentration Measurement",
"1043": "Nitrogen Dioxide Concentration Measurement",
"1045": "Ozone Concentration Measurement",
- "1066": "PM2",
+ "1066": "PM2.5 Concentration Measurement",
"1067": "Formaldehyde Concentration Measurement",
"1068": "PM1 Concentration Measurement",
"1069": "PM10 Concentration Measurement",
diff --git a/data_model/1.3/device_types/AirQualitySensor.xml b/data_model/1.3/device_types/AirQualitySensor.xml
index 602781819d1696..bf56eb754f24c6 100644
--- a/data_model/1.3/device_types/AirQualitySensor.xml
+++ b/data_model/1.3/device_types/AirQualitySensor.xml
@@ -86,7 +86,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/device_types/DimmablePlug-InUnit.xml b/data_model/1.3/device_types/DimmablePlug-InUnit.xml
index 4d344bfc9fb89c..65f6b6e1dd2e9c 100644
--- a/data_model/1.3/device_types/DimmablePlug-InUnit.xml
+++ b/data_model/1.3/device_types/DimmablePlug-InUnit.xml
@@ -55,7 +55,7 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/1.3/device_types/DoorLockController.xml b/data_model/1.3/device_types/DoorLockController.xml
index 4d031a37be1eec..64d26eba8d8eeb 100644
--- a/data_model/1.3/device_types/DoorLockController.xml
+++ b/data_model/1.3/device_types/DoorLockController.xml
@@ -74,10 +74,7 @@ Davis, CA 95616, USA
-
-
-
-
+
diff --git a/data_model/1.3/device_types/OnOffPlug-inUnit.xml b/data_model/1.3/device_types/OnOffPlug-inUnit.xml
index 3be1ed0f9eb13d..888f365bed0b83 100644
--- a/data_model/1.3/device_types/OnOffPlug-inUnit.xml
+++ b/data_model/1.3/device_types/OnOffPlug-inUnit.xml
@@ -55,7 +55,7 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/1.3/device_types/RootNodeDeviceType.xml b/data_model/1.3/device_types/RootNodeDeviceType.xml
index c2028f07d91548..0288e8848cb321 100644
--- a/data_model/1.3/device_types/RootNodeDeviceType.xml
+++ b/data_model/1.3/device_types/RootNodeDeviceType.xml
@@ -124,7 +124,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/1.3/device_types/Thermostat.xml b/data_model/1.3/device_types/Thermostat.xml
index 49ba4b6779f084..62c7060bf03584 100644
--- a/data_model/1.3/device_types/Thermostat.xml
+++ b/data_model/1.3/device_types/Thermostat.xml
@@ -83,16 +83,10 @@ Davis, CA 95616, USA
-
-
-
-
+
-
-
-
-
+
diff --git a/data_model/1.3/scraper_version b/data_model/1.3/scraper_version
index e8ea05db81420d..c813fe116c9f9e 100644
--- a/data_model/1.3/scraper_version
+++ b/data_model/1.3/scraper_version
@@ -1 +1 @@
-1.2.4
+1.2.5
diff --git a/data_model/1.3/spec_sha b/data_model/1.3/spec_sha
index 274f0d55122714..9166e9f7a4977c 100644
--- a/data_model/1.3/spec_sha
+++ b/data_model/1.3/spec_sha
@@ -1 +1 @@
-ab9cf4653d40fe9193bbc7fe9febf74c08bf7dfa
+6b8d0a46a59d5ec5e2d2662e0b4a0b4810118bd6
diff --git a/data_model/master/clusters/ACL-Cluster.xml b/data_model/master/clusters/ACL-Cluster.xml
index 5c4c96a687cb13..d5fbf419ba4daf 100644
--- a/data_model/master/clusters/ACL-Cluster.xml
+++ b/data_model/master/clusters/ACL-Cluster.xml
@@ -180,19 +180,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
diff --git a/data_model/master/clusters/AdminCommissioningCluster.xml b/data_model/master/clusters/AdminCommissioningCluster.xml
index ccbb579134dc00..8e95e46f128db0 100644
--- a/data_model/master/clusters/AdminCommissioningCluster.xml
+++ b/data_model/master/clusters/AdminCommissioningCluster.xml
@@ -91,12 +91,12 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/AlarmBase.xml b/data_model/master/clusters/AlarmBase.xml
index fd0ccb5bc19d46..e374dcc382d208 100644
--- a/data_model/master/clusters/AlarmBase.xml
+++ b/data_model/master/clusters/AlarmBase.xml
@@ -80,7 +80,7 @@ Davis, CA 95616, USA
-
+
@@ -91,7 +91,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/ApplicationBasic.xml b/data_model/master/clusters/ApplicationBasic.xml
index ee39b8a421209d..28e47e7800352e 100644
--- a/data_model/master/clusters/ApplicationBasic.xml
+++ b/data_model/master/clusters/ApplicationBasic.xml
@@ -92,29 +92,29 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -125,14 +125,14 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/ApplicationLauncher.xml b/data_model/master/clusters/ApplicationLauncher.xml
index 57d6858dd8ce14..27fa528a81e8cf 100644
--- a/data_model/master/clusters/ApplicationLauncher.xml
+++ b/data_model/master/clusters/ApplicationLauncher.xml
@@ -103,14 +103,14 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/BallastConfiguration.xml b/data_model/master/clusters/BallastConfiguration.xml
index 0f37d86067e994..9dbf4e61887d76 100644
--- a/data_model/master/clusters/BallastConfiguration.xml
+++ b/data_model/master/clusters/BallastConfiguration.xml
@@ -65,7 +65,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -116,12 +118,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -141,12 +143,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -155,7 +157,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/BasicInformationCluster.xml b/data_model/master/clusters/BasicInformationCluster.xml
index 428c683a0ea803..538b4f5e9e9f8b 100644
--- a/data_model/master/clusters/BasicInformationCluster.xml
+++ b/data_model/master/clusters/BasicInformationCluster.xml
@@ -54,8 +54,6 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-
-:xrefstyle: basic
-->
@@ -182,100 +180,100 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -284,35 +282,35 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
@@ -322,6 +320,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/master/clusters/Binding-Cluster.xml b/data_model/master/clusters/Binding-Cluster.xml
index 444c99b315348d..055725f0b9ee47 100644
--- a/data_model/master/clusters/Binding-Cluster.xml
+++ b/data_model/master/clusters/Binding-Cluster.xml
@@ -97,7 +97,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/BooleanState.xml b/data_model/master/clusters/BooleanState.xml
index 5bb29f53ae0c3e..ddb16e26a1d6ad 100644
--- a/data_model/master/clusters/BooleanState.xml
+++ b/data_model/master/clusters/BooleanState.xml
@@ -68,7 +68,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/BooleanStateConfiguration.xml b/data_model/master/clusters/BooleanStateConfiguration.xml
index 01444d565294b3..719cd9569b5ae2 100644
--- a/data_model/master/clusters/BooleanStateConfiguration.xml
+++ b/data_model/master/clusters/BooleanStateConfiguration.xml
@@ -106,7 +106,7 @@ Davis, CA 95616, USA
-
+
@@ -114,7 +114,7 @@ Davis, CA 95616, USA
-
+
@@ -122,7 +122,7 @@ Davis, CA 95616, USA
-
+
@@ -145,7 +145,7 @@ Davis, CA 95616, USA
-
+
@@ -155,7 +155,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/Channel.xml b/data_model/master/clusters/Channel.xml
index 17144c9032c3e5..6177bfe6a652cc 100644
--- a/data_model/master/clusters/Channel.xml
+++ b/data_model/master/clusters/Channel.xml
@@ -307,7 +307,7 @@ Davis, CA 95616, USA
-
+
@@ -315,7 +315,7 @@ Davis, CA 95616, USA
-
+
@@ -366,6 +366,7 @@ Davis, CA 95616, USA
+
@@ -400,6 +401,7 @@ Davis, CA 95616, USA
+
@@ -412,6 +414,7 @@ Davis, CA 95616, USA
+
@@ -437,6 +440,7 @@ Davis, CA 95616, USA
+
diff --git a/data_model/master/clusters/ColorControl.xml b/data_model/master/clusters/ColorControl.xml
index 90d999fa20b4ac..6901b6ee4130c6 100644
--- a/data_model/master/clusters/ColorControl.xml
+++ b/data_model/master/clusters/ColorControl.xml
@@ -65,7 +65,8 @@ Davis, CA 95616, USA
-
+
@@ -111,19 +112,10 @@ Davis, CA 95616, USA
- -
+
-
- -
-
-
- -
-
-
- -
-
-
- -
+
-
@@ -252,7 +244,7 @@ Davis, CA 95616, USA
-
+
@@ -260,7 +252,7 @@ Davis, CA 95616, USA
-
+
@@ -268,13 +260,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -282,7 +274,7 @@ Davis, CA 95616, USA
-
+
@@ -299,7 +291,7 @@ Davis, CA 95616, USA
-
+
@@ -307,7 +299,7 @@ Davis, CA 95616, USA
-
+
@@ -317,13 +309,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -337,7 +329,7 @@ Davis, CA 95616, USA
-
+
@@ -351,7 +343,7 @@ Davis, CA 95616, USA
-
+
@@ -364,7 +356,7 @@ Davis, CA 95616, USA
-
+
@@ -378,7 +370,7 @@ Davis, CA 95616, USA
-
+
@@ -392,7 +384,7 @@ Davis, CA 95616, USA
-
+
@@ -405,7 +397,7 @@ Davis, CA 95616, USA
-
+
@@ -419,7 +411,7 @@ Davis, CA 95616, USA
-
+
@@ -433,7 +425,7 @@ Davis, CA 95616, USA
-
+
@@ -446,7 +438,7 @@ Davis, CA 95616, USA
-
+
@@ -460,7 +452,7 @@ Davis, CA 95616, USA
-
+
@@ -474,7 +466,7 @@ Davis, CA 95616, USA
-
+
@@ -487,7 +479,7 @@ Davis, CA 95616, USA
-
+
@@ -501,7 +493,7 @@ Davis, CA 95616, USA
-
+
@@ -515,7 +507,7 @@ Davis, CA 95616, USA
-
+
@@ -528,7 +520,7 @@ Davis, CA 95616, USA
-
+
@@ -542,7 +534,7 @@ Davis, CA 95616, USA
-
+
@@ -556,7 +548,7 @@ Davis, CA 95616, USA
-
+
@@ -589,7 +581,7 @@ Davis, CA 95616, USA
-
+
@@ -604,7 +596,7 @@ Davis, CA 95616, USA
-
+
@@ -619,24 +611,24 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -644,7 +636,7 @@ Davis, CA 95616, USA
-
+
@@ -652,7 +644,7 @@ Davis, CA 95616, USA
-
+
@@ -696,11 +688,11 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/ConcentrationMeasurement.xml b/data_model/master/clusters/ConcentrationMeasurement.xml
index 4b51cffa124321..b622a3560b4ff0 100644
--- a/data_model/master/clusters/ConcentrationMeasurement.xml
+++ b/data_model/master/clusters/ConcentrationMeasurement.xml
@@ -62,16 +62,16 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -181,7 +181,7 @@ Davis, CA 95616, USA
-
+
@@ -189,7 +189,7 @@ Davis, CA 95616, USA
-
+
@@ -197,7 +197,7 @@ Davis, CA 95616, USA
-
+
@@ -205,7 +205,7 @@ Davis, CA 95616, USA
-
+
@@ -213,7 +213,7 @@ Davis, CA 95616, USA
-
+
@@ -221,7 +221,7 @@ Davis, CA 95616, USA
-
+
@@ -229,7 +229,7 @@ Davis, CA 95616, USA
-
+
@@ -244,14 +244,14 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/ContentControl.xml b/data_model/master/clusters/ContentControl.xml
index b2539cf445c289..6848886c43ac02 100644
--- a/data_model/master/clusters/ContentControl.xml
+++ b/data_model/master/clusters/ContentControl.xml
@@ -60,7 +60,9 @@ Davis, CA 95616, USA
-
+
+
+
diff --git a/data_model/master/clusters/ContentLauncher.xml b/data_model/master/clusters/ContentLauncher.xml
index 9a5674efa8eb64..b4d6e7fa26500c 100644
--- a/data_model/master/clusters/ContentLauncher.xml
+++ b/data_model/master/clusters/ContentLauncher.xml
@@ -299,7 +299,7 @@ Davis, CA 95616, USA
-
+
@@ -307,7 +307,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/DemandResponseLoadControl.xml b/data_model/master/clusters/DemandResponseLoadControl.xml
index c20a7c3b7f013f..1acd1ea26c6088 100644
--- a/data_model/master/clusters/DemandResponseLoadControl.xml
+++ b/data_model/master/clusters/DemandResponseLoadControl.xml
@@ -311,51 +311,51 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/master/clusters/Descriptor-Cluster.xml b/data_model/master/clusters/Descriptor-Cluster.xml
index 94d262473d4c9c..9c0bcf0b2348e3 100644
--- a/data_model/master/clusters/Descriptor-Cluster.xml
+++ b/data_model/master/clusters/Descriptor-Cluster.xml
@@ -85,20 +85,20 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -109,7 +109,7 @@ Davis, CA 95616, USA
-
+
@@ -117,7 +117,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/DeviceEnergyManagement.xml b/data_model/master/clusters/DeviceEnergyManagement.xml
index ee1b2f0f2725e6..efc027f27cdeee 100644
--- a/data_model/master/clusters/DeviceEnergyManagement.xml
+++ b/data_model/master/clusters/DeviceEnergyManagement.xml
@@ -65,7 +65,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -118,6 +120,7 @@ Davis, CA 95616, USA
+
-
@@ -472,12 +475,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -495,14 +498,14 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/DiagnosticsEthernet.xml b/data_model/master/clusters/DiagnosticsEthernet.xml
index dfcd3d11c41f52..fd2bb0341ca06c 100644
--- a/data_model/master/clusters/DiagnosticsEthernet.xml
+++ b/data_model/master/clusters/DiagnosticsEthernet.xml
@@ -62,7 +62,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -108,57 +110,57 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/master/clusters/DiagnosticsGeneral.xml b/data_model/master/clusters/DiagnosticsGeneral.xml
index 4da912b03dc3df..ff78100fe3a7d3 100644
--- a/data_model/master/clusters/DiagnosticsGeneral.xml
+++ b/data_model/master/clusters/DiagnosticsGeneral.xml
@@ -223,17 +223,17 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -310,7 +310,6 @@ Davis, CA 95616, USA
-
diff --git a/data_model/master/clusters/DiagnosticsSoftware.xml b/data_model/master/clusters/DiagnosticsSoftware.xml
index 7cb3c9ff39ad2f..c7ee8ee842bf02 100644
--- a/data_model/master/clusters/DiagnosticsSoftware.xml
+++ b/data_model/master/clusters/DiagnosticsSoftware.xml
@@ -62,7 +62,9 @@ Davis, CA 95616, USA
-
+
+
+
diff --git a/data_model/master/clusters/DiagnosticsThread.xml b/data_model/master/clusters/DiagnosticsThread.xml
index 120efaddf8c08e..1da3eba21a4e4e 100644
--- a/data_model/master/clusters/DiagnosticsThread.xml
+++ b/data_model/master/clusters/DiagnosticsThread.xml
@@ -63,7 +63,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -257,38 +259,38 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -305,356 +307,356 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/master/clusters/DiagnosticsWiFi.xml b/data_model/master/clusters/DiagnosticsWiFi.xml
index b3951d967dc31f..6ef28ee4cc09e0 100644
--- a/data_model/master/clusters/DiagnosticsWiFi.xml
+++ b/data_model/master/clusters/DiagnosticsWiFi.xml
@@ -55,14 +55,16 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
+
-
+
-
+
+
+
@@ -141,81 +143,81 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/master/clusters/DoorLock.xml b/data_model/master/clusters/DoorLock.xml
index ea4b9fe1ebbbf8..138d40bdd544d6 100644
--- a/data_model/master/clusters/DoorLock.xml
+++ b/data_model/master/clusters/DoorLock.xml
@@ -66,7 +66,7 @@ Davis, CA 95616, USA
-
@@ -703,7 +703,7 @@ Davis, CA 95616, USA
-
+
@@ -871,7 +871,7 @@ Davis, CA 95616, USA
-
+
@@ -886,7 +886,7 @@ Davis, CA 95616, USA
-
+
@@ -912,153 +912,156 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
+
-
+
+
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -1069,7 +1072,7 @@ Davis, CA 95616, USA
-
+
@@ -1080,7 +1083,7 @@ Davis, CA 95616, USA
-
+
@@ -1092,7 +1095,7 @@ Davis, CA 95616, USA
-
+
@@ -1106,7 +1109,7 @@ Davis, CA 95616, USA
-
+
@@ -1114,12 +1117,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -1129,21 +1132,21 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -1153,7 +1156,7 @@ Davis, CA 95616, USA
-
+
@@ -1163,14 +1166,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -1180,7 +1183,7 @@ Davis, CA 95616, USA
-
+
@@ -1188,7 +1191,7 @@ Davis, CA 95616, USA
-
+
@@ -1196,7 +1199,7 @@ Davis, CA 95616, USA
-
+
@@ -1207,7 +1210,7 @@ Davis, CA 95616, USA
-
+
@@ -1215,7 +1218,7 @@ Davis, CA 95616, USA
-
+
@@ -1226,7 +1229,7 @@ Davis, CA 95616, USA
-
+
@@ -1234,21 +1237,21 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -1872,18 +1875,12 @@ Davis, CA 95616, USA
-
-
-
-
-
-
+
+
+
+
+
+
@@ -2034,18 +2031,12 @@ Davis, CA 95616, USA
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/data_model/master/clusters/ElectricalEnergyMeasurement.xml b/data_model/master/clusters/ElectricalEnergyMeasurement.xml
index d89b19472a6bbb..77e05665b2d031 100644
--- a/data_model/master/clusters/ElectricalEnergyMeasurement.xml
+++ b/data_model/master/clusters/ElectricalEnergyMeasurement.xml
@@ -124,12 +124,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -139,7 +139,7 @@ Davis, CA 95616, USA
-
+
@@ -149,7 +149,7 @@ Davis, CA 95616, USA
-
+
@@ -159,7 +159,7 @@ Davis, CA 95616, USA
-
+
@@ -169,7 +169,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/ElectricalPowerMeasurement.xml b/data_model/master/clusters/ElectricalPowerMeasurement.xml
index 89ad5fa3255fcd..ba9dd22f3fa799 100644
--- a/data_model/master/clusters/ElectricalPowerMeasurement.xml
+++ b/data_model/master/clusters/ElectricalPowerMeasurement.xml
@@ -170,39 +170,39 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
@@ -210,7 +210,7 @@ Davis, CA 95616, USA
-
+
@@ -218,13 +218,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -232,7 +232,7 @@ Davis, CA 95616, USA
-
+
@@ -240,7 +240,7 @@ Davis, CA 95616, USA
-
+
@@ -248,7 +248,7 @@ Davis, CA 95616, USA
-
+
@@ -256,7 +256,7 @@ Davis, CA 95616, USA
-
+
@@ -264,7 +264,7 @@ Davis, CA 95616, USA
-
+
@@ -273,7 +273,7 @@ Davis, CA 95616, USA
-
+
@@ -282,7 +282,7 @@ Davis, CA 95616, USA
-
+
@@ -290,7 +290,7 @@ Davis, CA 95616, USA
-
+
@@ -298,7 +298,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/EnergyCalendar.xml b/data_model/master/clusters/EnergyCalendar.xml
index 40a8a87f04ec17..5e9b3b782a435c 100644
--- a/data_model/master/clusters/EnergyCalendar.xml
+++ b/data_model/master/clusters/EnergyCalendar.xml
@@ -196,17 +196,17 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -215,70 +215,70 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/master/clusters/EnergyEVSE.xml b/data_model/master/clusters/EnergyEVSE.xml
index 53605899d05550..e481e06aa4e5d4 100644
--- a/data_model/master/clusters/EnergyEVSE.xml
+++ b/data_model/master/clusters/EnergyEVSE.xml
@@ -254,7 +254,12 @@ Davis, CA 95616, USA
-
+
+
+
+
+
+
@@ -262,7 +267,7 @@ Davis, CA 95616, USA
-
+
@@ -275,37 +280,37 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
@@ -313,33 +318,33 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -347,14 +352,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -362,14 +367,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -377,7 +382,7 @@ Davis, CA 95616, USA
-
+
@@ -385,23 +390,23 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -525,7 +530,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/EnergyPreference.xml b/data_model/master/clusters/EnergyPreference.xml
index 37559dfbc30850..cd2b722607a45b 100644
--- a/data_model/master/clusters/EnergyPreference.xml
+++ b/data_model/master/clusters/EnergyPreference.xml
@@ -62,7 +62,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -102,7 +104,7 @@ Davis, CA 95616, USA
-
+
@@ -110,7 +112,7 @@ Davis, CA 95616, USA
-
+
@@ -118,7 +120,7 @@ Davis, CA 95616, USA
-
+
@@ -127,7 +129,7 @@ Davis, CA 95616, USA
-
+
@@ -135,7 +137,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/EnergyPrice.xml b/data_model/master/clusters/EnergyPrice.xml
index fa46810900890f..a4efa28e1b0dbf 100644
--- a/data_model/master/clusters/EnergyPrice.xml
+++ b/data_model/master/clusters/EnergyPrice.xml
@@ -166,7 +166,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/FanControl.xml b/data_model/master/clusters/FanControl.xml
index 12d57967801646..daae13aff910d4 100644
--- a/data_model/master/clusters/FanControl.xml
+++ b/data_model/master/clusters/FanControl.xml
@@ -120,36 +120,36 @@ Davis, CA 95616, USA
- -
+
-
- -
+
-
- -
+
-
- -
+
-
- -
+
-
- -
+
-
@@ -188,36 +188,36 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
@@ -225,7 +225,7 @@ Davis, CA 95616, USA
-
+
@@ -233,7 +233,7 @@ Davis, CA 95616, USA
-
+
@@ -241,7 +241,7 @@ Davis, CA 95616, USA
-
+
@@ -249,7 +249,7 @@ Davis, CA 95616, USA
-
+
@@ -257,7 +257,7 @@ Davis, CA 95616, USA
-
+
@@ -265,7 +265,7 @@ Davis, CA 95616, USA
-
+
@@ -273,7 +273,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/FlowMeasurement.xml b/data_model/master/clusters/FlowMeasurement.xml
index d488b5899b05f0..85879977faa509 100644
--- a/data_model/master/clusters/FlowMeasurement.xml
+++ b/data_model/master/clusters/FlowMeasurement.xml
@@ -70,19 +70,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
diff --git a/data_model/master/clusters/GeneralCommissioningCluster.xml b/data_model/master/clusters/GeneralCommissioningCluster.xml
index 519285af02f103..ed10afa8406a5a 100644
--- a/data_model/master/clusters/GeneralCommissioningCluster.xml
+++ b/data_model/master/clusters/GeneralCommissioningCluster.xml
@@ -65,7 +65,7 @@ Davis, CA 95616, USA
-
+
@@ -130,7 +130,7 @@ Davis, CA 95616, USA
-
+
@@ -140,12 +140,12 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/Group-Key-Management-Cluster.xml b/data_model/master/clusters/Group-Key-Management-Cluster.xml
index c1819628e34d7b..35de0890bd87d3 100644
--- a/data_model/master/clusters/Group-Key-Management-Cluster.xml
+++ b/data_model/master/clusters/Group-Key-Management-Cluster.xml
@@ -66,7 +66,7 @@ Davis, CA 95616, USA
-
+
@@ -167,7 +167,7 @@ Davis, CA 95616, USA
-
+
@@ -179,12 +179,12 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/Groups.xml b/data_model/master/clusters/Groups.xml
index 1f168e13fad933..6c53c1a602f255 100644
--- a/data_model/master/clusters/Groups.xml
+++ b/data_model/master/clusters/Groups.xml
@@ -83,7 +83,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/Humidistat.xml b/data_model/master/clusters/Humidistat.xml
index b709b5d50d2f24..c3aac1dab85a20 100644
--- a/data_model/master/clusters/Humidistat.xml
+++ b/data_model/master/clusters/Humidistat.xml
@@ -174,17 +174,17 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -192,7 +192,7 @@ Davis, CA 95616, USA
-
+
@@ -200,7 +200,7 @@ Davis, CA 95616, USA
-
+
@@ -208,7 +208,7 @@ Davis, CA 95616, USA
-
+
@@ -228,28 +228,28 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
diff --git a/data_model/master/clusters/ICDManagement.xml b/data_model/master/clusters/ICDManagement.xml
index 0f15a2729052fa..d4731fb545ad9a 100644
--- a/data_model/master/clusters/ICDManagement.xml
+++ b/data_model/master/clusters/ICDManagement.xml
@@ -115,7 +115,7 @@ Davis, CA 95616, USA
-
+
@@ -125,24 +125,24 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -150,14 +150,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -165,7 +165,7 @@ Davis, CA 95616, USA
-
+
@@ -176,7 +176,7 @@ Davis, CA 95616, USA
-
+
@@ -190,7 +190,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/Identify.xml b/data_model/master/clusters/Identify.xml
index dbb9daca72fce4..0ab68abb8b1635 100644
--- a/data_model/master/clusters/Identify.xml
+++ b/data_model/master/clusters/Identify.xml
@@ -122,7 +122,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/IlluminanceMeasurement.xml b/data_model/master/clusters/IlluminanceMeasurement.xml
index 75cf30cd35d931..f24df314ca2ead 100644
--- a/data_model/master/clusters/IlluminanceMeasurement.xml
+++ b/data_model/master/clusters/IlluminanceMeasurement.xml
@@ -83,20 +83,20 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -107,7 +107,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/Label-Cluster-FixedLabelCluster.xml b/data_model/master/clusters/Label-Cluster-FixedLabelCluster.xml
index 98106b6fc33e40..b915e77bb5a01f 100644
--- a/data_model/master/clusters/Label-Cluster-FixedLabelCluster.xml
+++ b/data_model/master/clusters/Label-Cluster-FixedLabelCluster.xml
@@ -70,7 +70,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/Label-Cluster-LabelCluster.xml b/data_model/master/clusters/Label-Cluster-LabelCluster.xml
index 0ca5566f0dc132..43148b6dc9186f 100644
--- a/data_model/master/clusters/Label-Cluster-LabelCluster.xml
+++ b/data_model/master/clusters/Label-Cluster-LabelCluster.xml
@@ -80,7 +80,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/Label-Cluster-UserLabelCluster.xml b/data_model/master/clusters/Label-Cluster-UserLabelCluster.xml
index eba0099ffb59d2..40dac53a4242cd 100644
--- a/data_model/master/clusters/Label-Cluster-UserLabelCluster.xml
+++ b/data_model/master/clusters/Label-Cluster-UserLabelCluster.xml
@@ -70,7 +70,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/LaundryDryerControls.xml b/data_model/master/clusters/LaundryDryerControls.xml
index af4f787c0432b7..d860d2ef9dcf21 100644
--- a/data_model/master/clusters/LaundryDryerControls.xml
+++ b/data_model/master/clusters/LaundryDryerControls.xml
@@ -88,7 +88,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/LaundryWasherControls.xml b/data_model/master/clusters/LaundryWasherControls.xml
index ff001c3a405652..6fbfc0a882d3d1 100644
--- a/data_model/master/clusters/LaundryWasherControls.xml
+++ b/data_model/master/clusters/LaundryWasherControls.xml
@@ -109,7 +109,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/LevelControl.xml b/data_model/master/clusters/LevelControl.xml
index c98db485e6e00a..5da823bc1dceb0 100644
--- a/data_model/master/clusters/LevelControl.xml
+++ b/data_model/master/clusters/LevelControl.xml
@@ -65,7 +65,9 @@ Davis, CA 95616, USA
-
+
@@ -118,13 +120,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -152,7 +154,7 @@ Davis, CA 95616, USA
-
+
@@ -183,28 +185,29 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
+
-
+
diff --git a/data_model/master/clusters/LocalizationConfiguration.xml b/data_model/master/clusters/LocalizationConfiguration.xml
index 66809f545389be..7ddfba8efcc9cb 100644
--- a/data_model/master/clusters/LocalizationConfiguration.xml
+++ b/data_model/master/clusters/LocalizationConfiguration.xml
@@ -66,7 +66,7 @@ Davis, CA 95616, USA
-
+
@@ -75,7 +75,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/LocalizationTimeFormat.xml b/data_model/master/clusters/LocalizationTimeFormat.xml
index db8b809b0341a9..2ede281c7352a9 100644
--- a/data_model/master/clusters/LocalizationTimeFormat.xml
+++ b/data_model/master/clusters/LocalizationTimeFormat.xml
@@ -125,12 +125,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -138,7 +138,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/LocalizationUnit.xml b/data_model/master/clusters/LocalizationUnit.xml
index 2c6e1ecbd648e6..0157ebb53b0d39 100644
--- a/data_model/master/clusters/LocalizationUnit.xml
+++ b/data_model/master/clusters/LocalizationUnit.xml
@@ -84,7 +84,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/MediaPlayback.xml b/data_model/master/clusters/MediaPlayback.xml
index 03175277dc12c5..dae60d7a1b2572 100644
--- a/data_model/master/clusters/MediaPlayback.xml
+++ b/data_model/master/clusters/MediaPlayback.xml
@@ -223,7 +223,7 @@ Davis, CA 95616, USA
-
+
@@ -231,7 +231,7 @@ Davis, CA 95616, USA
-
+
@@ -239,7 +239,7 @@ Davis, CA 95616, USA
-
+
@@ -254,7 +254,7 @@ Davis, CA 95616, USA
-
+
@@ -262,7 +262,7 @@ Davis, CA 95616, USA
-
+
@@ -270,7 +270,7 @@ Davis, CA 95616, USA
-
+
@@ -279,7 +279,7 @@ Davis, CA 95616, USA
-
+
@@ -287,7 +287,7 @@ Davis, CA 95616, USA
-
+
@@ -296,7 +296,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/MicrowaveOvenControl.xml b/data_model/master/clusters/MicrowaveOvenControl.xml
index b927685e534e0c..360b9edeaa55f1 100644
--- a/data_model/master/clusters/MicrowaveOvenControl.xml
+++ b/data_model/master/clusters/MicrowaveOvenControl.xml
@@ -89,7 +89,7 @@ Davis, CA 95616, USA
-
+
@@ -102,7 +102,7 @@ Davis, CA 95616, USA
-
+
@@ -110,7 +110,7 @@ Davis, CA 95616, USA
-
+
@@ -118,7 +118,7 @@ Davis, CA 95616, USA
-
+
@@ -127,7 +127,7 @@ Davis, CA 95616, USA
-
+
@@ -148,7 +148,7 @@ Davis, CA 95616, USA
-
+
@@ -157,21 +157,21 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
diff --git a/data_model/master/clusters/ModeBase.xml b/data_model/master/clusters/ModeBase.xml
index 48b4d4adac1634..4a70ad670d0dca 100644
--- a/data_model/master/clusters/ModeBase.xml
+++ b/data_model/master/clusters/ModeBase.xml
@@ -99,25 +99,25 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
diff --git a/data_model/master/clusters/ModeSelect.xml b/data_model/master/clusters/ModeSelect.xml
index cfdf7adb92761c..76ebf5874af273 100644
--- a/data_model/master/clusters/ModeSelect.xml
+++ b/data_model/master/clusters/ModeSelect.xml
@@ -97,38 +97,38 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/master/clusters/Mode_DeviceEnergyManagement.xml b/data_model/master/clusters/Mode_DeviceEnergyManagement.xml
index 9cb426eb51785d..08c4044617d716 100644
--- a/data_model/master/clusters/Mode_DeviceEnergyManagement.xml
+++ b/data_model/master/clusters/Mode_DeviceEnergyManagement.xml
@@ -62,7 +62,9 @@ Davis, CA 95616, USA
-
+
+
+
diff --git a/data_model/master/clusters/Mode_EVSE.xml b/data_model/master/clusters/Mode_EVSE.xml
index ffce1a6a2980ce..f139ab3cbfaf9a 100644
--- a/data_model/master/clusters/Mode_EVSE.xml
+++ b/data_model/master/clusters/Mode_EVSE.xml
@@ -79,4 +79,23 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/master/clusters/NetworkCommissioningCluster.xml b/data_model/master/clusters/NetworkCommissioningCluster.xml
index cb6e935dcd189e..63efd6c3d3cbb2 100644
--- a/data_model/master/clusters/NetworkCommissioningCluster.xml
+++ b/data_model/master/clusters/NetworkCommissioningCluster.xml
@@ -125,22 +125,22 @@ Davis, CA 95616, USA
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
@@ -167,16 +167,16 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -287,7 +287,7 @@ Davis, CA 95616, USA
-
+
@@ -299,7 +299,7 @@ Davis, CA 95616, USA
-
+
@@ -310,7 +310,7 @@ Davis, CA 95616, USA
-
+
@@ -321,29 +321,29 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -351,14 +351,14 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/NetworkIdentityManagement.xml b/data_model/master/clusters/NetworkIdentityManagement.xml
index 0cb3ee17251741..b432b8b68f6b23 100644
--- a/data_model/master/clusters/NetworkIdentityManagement.xml
+++ b/data_model/master/clusters/NetworkIdentityManagement.xml
@@ -99,26 +99,26 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
diff --git a/data_model/master/clusters/OTARequestor.xml b/data_model/master/clusters/OTARequestor.xml
index f6a5ff0365abed..3a562c9f18a046 100644
--- a/data_model/master/clusters/OTARequestor.xml
+++ b/data_model/master/clusters/OTARequestor.xml
@@ -149,7 +149,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/OccupancySensing.xml b/data_model/master/clusters/OccupancySensing.xml
index 2aae8530b1d512..2852ce812f9308 100644
--- a/data_model/master/clusters/OccupancySensing.xml
+++ b/data_model/master/clusters/OccupancySensing.xml
@@ -63,7 +63,7 @@ Davis, CA 95616, USA
-
-
+
-
+
@@ -164,7 +164,7 @@ Davis, CA 95616, USA
-
+
@@ -178,7 +178,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/OnOff.xml b/data_model/master/clusters/OnOff.xml
index a12de2b2e25eb8..b06c96a64376ac 100644
--- a/data_model/master/clusters/OnOff.xml
+++ b/data_model/master/clusters/OnOff.xml
@@ -145,7 +145,7 @@ Davis, CA 95616, USA
-
+
@@ -168,7 +168,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/OperationalCredentialCluster.xml b/data_model/master/clusters/OperationalCredentialCluster.xml
index 2aa070f96b2573..b3811db4a5774a 100644
--- a/data_model/master/clusters/OperationalCredentialCluster.xml
+++ b/data_model/master/clusters/OperationalCredentialCluster.xml
@@ -155,26 +155,26 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -183,7 +183,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/OperationalState.xml b/data_model/master/clusters/OperationalState.xml
index 124362e459e429..06c77fc29a2c19 100644
--- a/data_model/master/clusters/OperationalState.xml
+++ b/data_model/master/clusters/OperationalState.xml
@@ -115,19 +115,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -180,7 +180,6 @@ Davis, CA 95616, USA
-
diff --git a/data_model/master/clusters/PowerSourceCluster.xml b/data_model/master/clusters/PowerSourceCluster.xml
index 1c01cc548bfdee..4596880e32b938 100644
--- a/data_model/master/clusters/PowerSourceCluster.xml
+++ b/data_model/master/clusters/PowerSourceCluster.xml
@@ -556,32 +556,32 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -589,21 +589,21 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -624,14 +624,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -639,7 +639,7 @@ Davis, CA 95616, USA
-
+
@@ -659,7 +659,7 @@ Davis, CA 95616, USA
-
+
@@ -680,7 +680,7 @@ Davis, CA 95616, USA
-
+
@@ -688,7 +688,7 @@ Davis, CA 95616, USA
-
+
@@ -696,7 +696,7 @@ Davis, CA 95616, USA
-
+
@@ -704,7 +704,7 @@ Davis, CA 95616, USA
-
+
@@ -712,7 +712,7 @@ Davis, CA 95616, USA
-
+
@@ -720,7 +720,7 @@ Davis, CA 95616, USA
-
+
@@ -730,7 +730,7 @@ Davis, CA 95616, USA
-
+
@@ -744,7 +744,7 @@ Davis, CA 95616, USA
-
+
@@ -757,7 +757,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/PowerSourceConfigurationCluster.xml b/data_model/master/clusters/PowerSourceConfigurationCluster.xml
index 6a47ce1b54cdbd..5348f6f0b091b6 100644
--- a/data_model/master/clusters/PowerSourceConfigurationCluster.xml
+++ b/data_model/master/clusters/PowerSourceConfigurationCluster.xml
@@ -67,7 +67,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/PowerTopology.xml b/data_model/master/clusters/PowerTopology.xml
index 4ebdda614a4aec..b958d03c01aeb1 100644
--- a/data_model/master/clusters/PowerTopology.xml
+++ b/data_model/master/clusters/PowerTopology.xml
@@ -83,7 +83,7 @@ Davis, CA 95616, USA
-
+
@@ -92,7 +92,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/PressureMeasurement.xml b/data_model/master/clusters/PressureMeasurement.xml
index a46e911253941f..bf9b6a9286e381 100644
--- a/data_model/master/clusters/PressureMeasurement.xml
+++ b/data_model/master/clusters/PressureMeasurement.xml
@@ -75,19 +75,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -98,7 +98,7 @@ Davis, CA 95616, USA
-
+
@@ -106,7 +106,7 @@ Davis, CA 95616, USA
-
+
@@ -114,7 +114,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/ProxyConfiguration-Cluster.xml b/data_model/master/clusters/ProxyConfiguration-Cluster.xml
index 8ad566ec8527b2..c33ed5cd03b841 100644
--- a/data_model/master/clusters/ProxyConfiguration-Cluster.xml
+++ b/data_model/master/clusters/ProxyConfiguration-Cluster.xml
@@ -60,7 +60,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -82,7 +84,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/ProxyDiscovery-Cluster.xml b/data_model/master/clusters/ProxyDiscovery-Cluster.xml
index 6fa4a9eb6f3a06..159bdff7333853 100644
--- a/data_model/master/clusters/ProxyDiscovery-Cluster.xml
+++ b/data_model/master/clusters/ProxyDiscovery-Cluster.xml
@@ -60,7 +60,9 @@ Davis, CA 95616, USA
-
+
+
+
diff --git a/data_model/master/clusters/PumpConfigurationControl.xml b/data_model/master/clusters/PumpConfigurationControl.xml
index c3f79ce8108975..95ede00d0eb72e 100644
--- a/data_model/master/clusters/PumpConfigurationControl.xml
+++ b/data_model/master/clusters/PumpConfigurationControl.xml
@@ -176,22 +176,22 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -203,7 +203,7 @@ Davis, CA 95616, USA
-
+
@@ -215,7 +215,7 @@ Davis, CA 95616, USA
-
+
@@ -227,7 +227,7 @@ Davis, CA 95616, USA
-
+
@@ -239,7 +239,7 @@ Davis, CA 95616, USA
-
+
@@ -251,7 +251,7 @@ Davis, CA 95616, USA
-
+
@@ -263,7 +263,7 @@ Davis, CA 95616, USA
-
+
@@ -275,7 +275,7 @@ Davis, CA 95616, USA
-
+
@@ -287,7 +287,7 @@ Davis, CA 95616, USA
-
+
@@ -300,7 +300,7 @@ Davis, CA 95616, USA
-
+
@@ -313,62 +313,62 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/master/clusters/ResourceMonitoring.xml b/data_model/master/clusters/ResourceMonitoring.xml
index 43bf28868f3709..feb6394fd6b47d 100644
--- a/data_model/master/clusters/ResourceMonitoring.xml
+++ b/data_model/master/clusters/ResourceMonitoring.xml
@@ -62,9 +62,9 @@ Davis, CA 95616, USA
-
-
-
+
+
+
@@ -74,7 +74,7 @@ Davis, CA 95616, USA
-
+
@@ -104,13 +104,13 @@ Davis, CA 95616, USA
-
- -
+
-
-
- -
+
-
-
@@ -137,7 +137,7 @@ Davis, CA 95616, USA
-
+
@@ -153,13 +153,13 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/Scenes.xml b/data_model/master/clusters/Scenes.xml
index bf68f8528fa159..1479d3ffd7de86 100644
--- a/data_model/master/clusters/Scenes.xml
+++ b/data_model/master/clusters/Scenes.xml
@@ -62,7 +62,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -165,12 +167,12 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/ServiceArea.xml b/data_model/master/clusters/ServiceArea.xml
index 7963d93b7eb222..4980fc5ad40274 100644
--- a/data_model/master/clusters/ServiceArea.xml
+++ b/data_model/master/clusters/ServiceArea.xml
@@ -86,6 +86,34 @@ Davis, CA 95616, USA
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
@@ -152,26 +180,26 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -179,7 +207,7 @@ Davis, CA 95616, USA
-
+
@@ -196,7 +224,6 @@ Davis, CA 95616, USA
-
@@ -215,7 +242,6 @@ Davis, CA 95616, USA
-
diff --git a/data_model/master/clusters/SmokeCOAlarm.xml b/data_model/master/clusters/SmokeCOAlarm.xml
index 25c034ac94082c..4ba9bd2708b476 100644
--- a/data_model/master/clusters/SmokeCOAlarm.xml
+++ b/data_model/master/clusters/SmokeCOAlarm.xml
@@ -163,31 +163,31 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -196,12 +196,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -226,7 +226,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/Switch.xml b/data_model/master/clusters/Switch.xml
index c7c94524bed52c..bb2066269b4f94 100644
--- a/data_model/master/clusters/Switch.xml
+++ b/data_model/master/clusters/Switch.xml
@@ -116,19 +116,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
diff --git a/data_model/master/clusters/TemperatureControl.xml b/data_model/master/clusters/TemperatureControl.xml
index 3f5fa9c00332d6..2f2527ce4ad0fa 100644
--- a/data_model/master/clusters/TemperatureControl.xml
+++ b/data_model/master/clusters/TemperatureControl.xml
@@ -86,7 +86,7 @@ Davis, CA 95616, USA
-
+
@@ -94,7 +94,7 @@ Davis, CA 95616, USA
-
+
@@ -102,7 +102,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/TemperatureMeasurement.xml b/data_model/master/clusters/TemperatureMeasurement.xml
index 176fad6b246a60..0935b18edab675 100644
--- a/data_model/master/clusters/TemperatureMeasurement.xml
+++ b/data_model/master/clusters/TemperatureMeasurement.xml
@@ -71,19 +71,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
diff --git a/data_model/master/clusters/Thermostat.xml b/data_model/master/clusters/Thermostat.xml
index 7345fc2e2c9177..4374bc3f1c8a7d 100644
--- a/data_model/master/clusters/Thermostat.xml
+++ b/data_model/master/clusters/Thermostat.xml
@@ -113,11 +113,6 @@ Davis, CA 95616, USA
-
-
-
-
-
@@ -503,12 +498,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -559,15 +554,6 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
@@ -660,12 +646,12 @@ Davis, CA 95616, USA
-
+
-
+
@@ -677,7 +663,7 @@ Davis, CA 95616, USA
-
+
@@ -685,7 +671,7 @@ Davis, CA 95616, USA
-
+
@@ -693,7 +679,7 @@ Davis, CA 95616, USA
-
+
@@ -701,7 +687,7 @@ Davis, CA 95616, USA
-
+
@@ -709,7 +695,7 @@ Davis, CA 95616, USA
-
+
@@ -717,7 +703,7 @@ Davis, CA 95616, USA
-
+
@@ -725,13 +711,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -740,7 +726,7 @@ Davis, CA 95616, USA
-
+
@@ -748,7 +734,7 @@ Davis, CA 95616, USA
-
+
@@ -756,7 +742,7 @@ Davis, CA 95616, USA
-
+
@@ -767,7 +753,7 @@ Davis, CA 95616, USA
-
+
@@ -778,7 +764,7 @@ Davis, CA 95616, USA
-
+
@@ -786,7 +772,7 @@ Davis, CA 95616, USA
-
+
@@ -794,7 +780,7 @@ Davis, CA 95616, USA
-
+
@@ -802,7 +788,7 @@ Davis, CA 95616, USA
-
+
@@ -810,7 +796,7 @@ Davis, CA 95616, USA
-
+
@@ -818,19 +804,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -850,7 +836,7 @@ Davis, CA 95616, USA
-
+
@@ -858,33 +844,33 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -900,7 +886,7 @@ Davis, CA 95616, USA
-
+
@@ -909,7 +895,7 @@ Davis, CA 95616, USA
-
+
@@ -917,7 +903,7 @@ Davis, CA 95616, USA
-
+
@@ -925,7 +911,7 @@ Davis, CA 95616, USA
-
+
@@ -933,7 +919,7 @@ Davis, CA 95616, USA
-
+
@@ -944,7 +930,7 @@ Davis, CA 95616, USA
-
+
@@ -955,7 +941,7 @@ Davis, CA 95616, USA
-
+
@@ -966,29 +952,29 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -998,25 +984,25 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -1025,7 +1011,7 @@ Davis, CA 95616, USA
-
+
@@ -1033,35 +1019,35 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
@@ -1069,7 +1055,7 @@ Davis, CA 95616, USA
-
+
@@ -1078,7 +1064,7 @@ Davis, CA 95616, USA
-
+
@@ -1087,7 +1073,7 @@ Davis, CA 95616, USA
-
+
@@ -1104,16 +1090,9 @@ Davis, CA 95616, USA
-
+
-
-
-
-
-
-
-
@@ -1243,11 +1222,6 @@ Davis, CA 95616, USA
-
-
-
-
-
@@ -1280,11 +1254,5 @@ Davis, CA 95616, USA
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data_model/master/clusters/ThreadBorderRouterManagement.xml b/data_model/master/clusters/ThreadBorderRouterManagement.xml
index f1e88f8ab86e70..b22d4038219647 100644
--- a/data_model/master/clusters/ThreadBorderRouterManagement.xml
+++ b/data_model/master/clusters/ThreadBorderRouterManagement.xml
@@ -66,7 +66,7 @@ Davis, CA 95616, USA
-
+
@@ -79,20 +79,26 @@ Davis, CA 95616, USA
+
-
+
-
+
-
+
+
+
+
+
+
@@ -105,14 +111,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -123,7 +129,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/ThreadNetworkDirectory.xml b/data_model/master/clusters/ThreadNetworkDirectory.xml
index 3a770c36a214f9..aeabdcf19f93d1 100644
--- a/data_model/master/clusters/ThreadNetworkDirectory.xml
+++ b/data_model/master/clusters/ThreadNetworkDirectory.xml
@@ -66,7 +66,7 @@ Davis, CA 95616, USA
-
+
@@ -74,7 +74,7 @@ Davis, CA 95616, USA
-
+
@@ -82,19 +82,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
diff --git a/data_model/master/clusters/TimeSync.xml b/data_model/master/clusters/TimeSync.xml
index 9d4057db8bdb85..a506a647aeb8a3 100644
--- a/data_model/master/clusters/TimeSync.xml
+++ b/data_model/master/clusters/TimeSync.xml
@@ -213,7 +213,7 @@ Davis, CA 95616, USA
-
+
@@ -228,14 +228,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -244,7 +244,7 @@ Davis, CA 95616, USA
-
+
@@ -253,21 +253,21 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -280,7 +280,7 @@ Davis, CA 95616, USA
-
+
@@ -288,7 +288,7 @@ Davis, CA 95616, USA
-
+
@@ -296,7 +296,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/ValidProxies-Cluster.xml b/data_model/master/clusters/ValidProxies-Cluster.xml
index b9db8e1762647f..c5740c90e52433 100644
--- a/data_model/master/clusters/ValidProxies-Cluster.xml
+++ b/data_model/master/clusters/ValidProxies-Cluster.xml
@@ -60,7 +60,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -75,7 +77,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/ValveConfigurationControl.xml b/data_model/master/clusters/ValveConfigurationControl.xml
index e8dcece07432d3..736672bc78f716 100644
--- a/data_model/master/clusters/ValveConfigurationControl.xml
+++ b/data_model/master/clusters/ValveConfigurationControl.xml
@@ -109,55 +109,55 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -169,7 +169,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/WakeOnLAN.xml b/data_model/master/clusters/WakeOnLAN.xml
index 4f6e032c084b38..7f5c08bdd624ad 100644
--- a/data_model/master/clusters/WakeOnLAN.xml
+++ b/data_model/master/clusters/WakeOnLAN.xml
@@ -68,13 +68,13 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/WaterContentMeasurement.xml b/data_model/master/clusters/WaterContentMeasurement.xml
index 85d44793c93ae4..af11c9cf8d514c 100644
--- a/data_model/master/clusters/WaterContentMeasurement.xml
+++ b/data_model/master/clusters/WaterContentMeasurement.xml
@@ -70,19 +70,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
diff --git a/data_model/master/clusters/WaterHeaterManagement.xml b/data_model/master/clusters/WaterHeaterManagement.xml
index 52e1020f164472..ee38a0058b50fb 100644
--- a/data_model/master/clusters/WaterHeaterManagement.xml
+++ b/data_model/master/clusters/WaterHeaterManagement.xml
@@ -74,6 +74,14 @@ Davis, CA 95616, USA
+
+ -
+
+
+ -
+
+
+
@@ -112,7 +120,7 @@ Davis, CA 95616, USA
-
+
@@ -137,7 +145,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/WiFiNetworkManagement.xml b/data_model/master/clusters/WiFiNetworkManagement.xml
index e1c03fbc7061d4..cfa10af25f0dd6 100644
--- a/data_model/master/clusters/WiFiNetworkManagement.xml
+++ b/data_model/master/clusters/WiFiNetworkManagement.xml
@@ -57,18 +57,18 @@ Davis, CA 95616, USA
:xrefstyle: basic
-->
-
+
-
+
-
+
diff --git a/data_model/master/clusters/WindowCovering.xml b/data_model/master/clusters/WindowCovering.xml
index 7ec63dd442d8ae..2f087914405cf3 100644
--- a/data_model/master/clusters/WindowCovering.xml
+++ b/data_model/master/clusters/WindowCovering.xml
@@ -392,13 +392,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -409,7 +409,7 @@ Davis, CA 95616, USA
-
+
@@ -420,7 +420,7 @@ Davis, CA 95616, USA
-
+
@@ -432,7 +432,7 @@ Davis, CA 95616, USA
-
+
@@ -444,27 +444,27 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -474,7 +474,7 @@ Davis, CA 95616, USA
-
+
@@ -485,13 +485,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -501,7 +501,7 @@ Davis, CA 95616, USA
-
+
@@ -511,13 +511,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -528,7 +528,7 @@ Davis, CA 95616, USA
-
+
@@ -539,7 +539,7 @@ Davis, CA 95616, USA
-
+
@@ -551,7 +551,7 @@ Davis, CA 95616, USA
-
+
@@ -563,7 +563,7 @@ Davis, CA 95616, USA
-
+
@@ -575,7 +575,7 @@ Davis, CA 95616, USA
-
+
@@ -596,7 +596,7 @@ Davis, CA 95616, USA
-
+
@@ -608,7 +608,7 @@ Davis, CA 95616, USA
-
+
@@ -653,11 +653,11 @@ Davis, CA 95616, USA
-
+
-
+
@@ -688,11 +688,11 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/bridge-clusters-EcosystemInformationCluster.xml b/data_model/master/clusters/bridge-clusters-EcosystemInformationCluster.xml
index 42ae5c4fe44cee..4801cbf88800ae 100644
--- a/data_model/master/clusters/bridge-clusters-EcosystemInformationCluster.xml
+++ b/data_model/master/clusters/bridge-clusters-EcosystemInformationCluster.xml
@@ -115,20 +115,20 @@ Davis, CA 95616, USA
-
+
-
+
-
+
diff --git a/data_model/master/clusters/cluster_ids.json b/data_model/master/clusters/cluster_ids.json
index c7654179ede2b5..e04a90b04a76d8 100644
--- a/data_model/master/clusters/cluster_ids.json
+++ b/data_model/master/clusters/cluster_ids.json
@@ -21,7 +21,7 @@
"51": "General Diagnostics",
"52": "Software Diagnostics",
"53": "Thread Network Diagnostics",
- "54": "Wi",
+ "54": "Wi-Fi Network Diagnostics",
"55": "Ethernet Network Diagnostics",
"56": "Time Synchronization",
"57": "Bridged Device Basic Information",
@@ -95,14 +95,14 @@
"1037": "Carbon Dioxide Concentration Measurement",
"1043": "Nitrogen Dioxide Concentration Measurement",
"1045": "Ozone Concentration Measurement",
- "1066": "PM2",
+ "1066": "PM2.5 Concentration Measurement",
"1067": "Formaldehyde Concentration Measurement",
"1068": "PM1 Concentration Measurement",
"1069": "PM10 Concentration Measurement",
"1070": "Total Volatile Organic Compounds Concentration Measurement",
"1071": "Radon Concentration Measurement",
"1104": "Network Identity Management",
- "1105": "Wi",
+ "1105": "Wi-Fi Network Management",
"1106": "Thread Border Router Management",
"1107": "Thread Network Directory",
"1283": "Wake on LAN",
diff --git a/data_model/master/device_types/AirQualitySensor.xml b/data_model/master/device_types/AirQualitySensor.xml
index 602781819d1696..bf56eb754f24c6 100644
--- a/data_model/master/device_types/AirQualitySensor.xml
+++ b/data_model/master/device_types/AirQualitySensor.xml
@@ -86,7 +86,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/device_types/DimmablePlug-InUnit.xml b/data_model/master/device_types/DimmablePlug-InUnit.xml
index 4d344bfc9fb89c..65f6b6e1dd2e9c 100644
--- a/data_model/master/device_types/DimmablePlug-InUnit.xml
+++ b/data_model/master/device_types/DimmablePlug-InUnit.xml
@@ -55,7 +55,7 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/NetworkInfraManager.xml b/data_model/master/device_types/NetworkInfraManager.xml
index 800ca8ce10ace6..a4d17e11c0faaa 100644
--- a/data_model/master/device_types/NetworkInfraManager.xml
+++ b/data_model/master/device_types/NetworkInfraManager.xml
@@ -62,7 +62,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/device_types/OnOffPlug-inUnit.xml b/data_model/master/device_types/OnOffPlug-inUnit.xml
index 3be1ed0f9eb13d..888f365bed0b83 100644
--- a/data_model/master/device_types/OnOffPlug-inUnit.xml
+++ b/data_model/master/device_types/OnOffPlug-inUnit.xml
@@ -55,7 +55,7 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/RootNodeDeviceType.xml b/data_model/master/device_types/RootNodeDeviceType.xml
index 875a633f9ba9b8..7dfd31996cc8e5 100644
--- a/data_model/master/device_types/RootNodeDeviceType.xml
+++ b/data_model/master/device_types/RootNodeDeviceType.xml
@@ -123,7 +123,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/device_types/SecondaryNetworkInterface.xml b/data_model/master/device_types/SecondaryNetworkInterface.xml
index 186faac2718079..51b4dc0e2ec4fa 100644
--- a/data_model/master/device_types/SecondaryNetworkInterface.xml
+++ b/data_model/master/device_types/SecondaryNetworkInterface.xml
@@ -69,7 +69,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/scraper_version b/data_model/master/scraper_version
index e8ea05db81420d..c813fe116c9f9e 100644
--- a/data_model/master/scraper_version
+++ b/data_model/master/scraper_version
@@ -1 +1 @@
-1.2.4
+1.2.5
diff --git a/data_model/master/spec_sha b/data_model/master/spec_sha
index f0b38ddc8c8aac..51aac4d9e877f4 100644
--- a/data_model/master/spec_sha
+++ b/data_model/master/spec_sha
@@ -1 +1 @@
-b3652909bdf595c7634cea1da0f1e58f837ea35f
+358a64a52ea9583f19be23c7da0e33f19d4b1ee0
diff --git a/docs/guides/esp32/providers.md b/docs/guides/esp32/providers.md
index 5174e1ccaceb11..59b91b624a49fc 100644
--- a/docs/guides/esp32/providers.md
+++ b/docs/guides/esp32/providers.md
@@ -15,6 +15,8 @@ Below are the providers that have been implemented:
- [Device Info Provider](https://github.com/project-chip/connectedhomeip/blob/master/src/platform/ESP32/ESP32DeviceInfoProvider.h#L31)
This provider provides fixed labels, supported calendar types, and supported
locales from the factory partition.
+- [Supported Modes](https://github.com/project-chip/connectedhomeip/blob/master/examples/platform/esp32/mode-support/static-supported-modes-manager.h#L28)
+ This provider offers the supported modes for the mode-select cluster.
More information can be found in the [factory data guide](factory_data.md).
diff --git a/docs/guides/fabric_synchronization_guide.md b/docs/guides/fabric_synchronization_guide.md
new file mode 100644
index 00000000000000..36107744a97930
--- /dev/null
+++ b/docs/guides/fabric_synchronization_guide.md
@@ -0,0 +1,164 @@
+# Fabric Synchronization Guide
+
+- [Fabric Synchronization Guide](#fabric-synchronization-guide)
+ - [Fabric Sync Example Applications](#fabric-sync-example-applications)
+ - [Run Fabric Sync Demo on RP4](#run-fabric-sync-demo-on-rp4)
+
+## Fabric Sync Example Applications
+
+Fabric-Admin and Fabric-Bridge example applications are provided to demonstrate
+Fabric Synchronization feature. You can find them in the examples.
+
+![matter_fabric_synchronization](images/matter_fabric_synchronization.png)
+
+Fabric-Admin example app implements the Fabric Administrator role and
+communicates with the Fabric-Bridge-App on the other side, facilitating the
+Fabric Synchronization process.
+
+Fabric-Bridge-App example app implements the Aggregator device type with Fabric
+Synchronization condition met and demonstrates the end-to-end Fabric
+Synchronization feature using dynamic endpoints.
+
+Fabric Synchronization can be triggered from either side. The initiator of the
+Fabric Synchronization process, who shares their devices, takes on the
+Commissioner role. The recipient of the Fabric Synchronization request, who
+receives the shared devices, assumes the Commissionee role. This flexibility
+enables a seamless and efficient synchronization process.
+
+### Building the Example Application
+
+- Building the Fabric-Admin Application
+
+ [Fabric-Admin](https://github.com/project-chip/connectedhomeip/tree/master/examples/fabric-admin/README.md)
+
+* Building the Fabric-Bridge Application
+
+ [Fabric-Bridge](https://github.com/project-chip/connectedhomeip/tree/master/examples/fabric-bridge-app/linux/README.md)
+
+## Run Fabric Sync Demo on RP4
+
+### Setup Fabric Source
+
+Connect to the Fabric Source server:
+
+```
+ssh ubuntu@xxx.xxx.xxx.xxx
+```
+
+Password:
+
+Run the Fabric Source script:
+
+```
+./run_fabric_source.sh
+```
+
+### Setup Fabric Sink
+
+Connect to the Fabric Sink server:
+
+```
+ssh ubuntu@xxx.xxx.xxx.xxx
+```
+
+Password:
+
+Run the Fabric Sink script:
+
+```
+./run_fabric_sink.sh
+```
+
+### Fabric Sync Setup
+
+Enable Fabric Auto Sync:
+
+In Fabric-Sync console:
+
+```
+fabricsync enable-auto-sync 1
+```
+
+Pair the Fabric-Source bridge to Fabric-Sync with node ID 1:
+
+```
+fabricsync add-bridge 1
+```
+
+### Pair Light Example to Fabric-Source
+
+Pair the Light Example with node ID 3 using its payload number:
+
+```
+pairing already-discovered 3 20202021 5540
+```
+
+After the Light Example is successfully paired in Fabric-Source, it will be
+synced to Fabric-Sink with a new assigned node ID.
+
+Toggle the Light Example:
+
+From Fabric-Source:
+
+```
+onoff on 1
+onoff off 1
+```
+
+From Fabric-Sink: (Use the node ID assigned)
+
+```
+onoff on x 1
+onoff off x 1
+```
+
+### Remove Light Example from Fabric-Source
+
+Unpair the Light Example:
+
+```
+pairing unpair
+```
+
+After the Light Example is successfully unpaired from Fabric-Source, it will
+also be removed from the Fabric-Sink.
+
+### Pair Commercial Switch to Fabric-Source
+
+Pair the switch using its payload number:
+
+In Fabric-Source console:
+
+```
+pairing code-wifi
+```
+
+After the switch is successfully paired in Fabric-Source, it will be synced to
+Fabric-Sink with a new assigned node ID.
+
+Toggle the switch:
+
+From Fabric-Source:
+
+```
+onoff on 1
+onoff off 1
+```
+
+From Fabric-Sink: (Use the node ID assigned)
+
+```
+onoff on 1
+onoff off 1
+```
+
+### Remove Switch from Fabric-Source
+
+Unpair the switch:
+
+```
+pairing unpair
+```
+
+After the switch is successfully unpaired from Fabric-Source, it will also be
+removed from the Fabric-Sink.
diff --git a/docs/guides/images/matter_fabric_synchronization.png b/docs/guides/images/matter_fabric_synchronization.png
new file mode 100644
index 00000000000000..95c99c4fe150b9
Binary files /dev/null and b/docs/guides/images/matter_fabric_synchronization.png differ
diff --git a/docs/spec_clusters.md b/docs/spec_clusters.md
index 976b9f85e42c19..ef58f016154446 100644
--- a/docs/spec_clusters.md
+++ b/docs/spec_clusters.md
@@ -26,7 +26,7 @@ This file was **AUTOMATICALLY** generated by `python scripts/generate_spec_xml.p
|51 |0x0033 |General Diagnostics |
|52 |0x0034 |Software Diagnostics |
|53 |0x0035 |Thread Network Diagnostics |
-|54 |0x0036 |Wi |
+|54 |0x0036 |Wi-Fi Network Diagnostics |
|55 |0x0037 |Ethernet Network Diagnostics |
|56 |0x0038 |Time Synchronization |
|57 |0x0039 |Bridged Device Basic Information |
@@ -92,7 +92,7 @@ This file was **AUTOMATICALLY** generated by `python scripts/generate_spec_xml.p
|1037 |0x040D |Carbon Dioxide Concentration Measurement |
|1043 |0x0413 |Nitrogen Dioxide Concentration Measurement |
|1045 |0x0415 |Ozone Concentration Measurement |
-|1066 |0x042A |PM2 |
+|1066 |0x042A |PM2.5 Concentration Measurement |
|1067 |0x042B |Formaldehyde Concentration Measurement |
|1068 |0x042C |PM1 Concentration Measurement |
|1069 |0x042D |PM10 Concentration Measurement |
diff --git a/docs/testing/python.md b/docs/testing/python.md
index 06051fee4fb33b..354490c896c445 100644
--- a/docs/testing/python.md
+++ b/docs/testing/python.md
@@ -24,33 +24,39 @@ Python tests located in src/python_testing
essential to define arguments at the top of the test script. This
section should include various parameters and their respective values,
which will guide the test runner on how to execute the tests.
-- All test classes inherit from MatterBaseTest in
+- All test classes inherit from `MatterBaseTest` in
[matter_testing_support.py](https://github.com/project-chip/connectedhomeip/blob/master/src/python_testing/matter_testing_support.py)
- - support for commissioning using the python controller
- - default controller (self.default_controller) of type ChipDeviceCtrl
- - MatterBaseTest inherits from the Mobly BaseTestClass
-- Test function(s) (start with test\_) and are all run automatically
- - To run in the test harness, the test name must be test_TC_PICSCODE\_#\_#
- - more information about integration with the test harness can be
+ - Support for commissioning using the python controller
+ - Default controller (`self.default_controller`) of type `ChipDeviceCtrl`
+ - `MatterBaseTest` inherits from the Mobly BaseTestClass
+- Test method(s) (start with test\_) and are all run automatically
+ - To run in the test harness, the test method name must be
+ `test_TC_PICSCODE_#_#`
+ - More information about integration with the test harness can be
found in [Test Harness helpers](#test-harness-helpers) section
- - any tests that use async function (read / write / commands) should be
+ - Any tests that use async method (read / write / commands) should be
decorated with the @async_test_body decorator
-- Use ChipDeviceCtrl to interact with the DUT
- - Controller API is in ChipDeviceCtrl.py (see API doc in file)
- - some support functions in matter_testing_support.py
+- Use `ChipDeviceCtrl` to interact with the DUT
+ - Controller API is in `ChipDeviceCtrl.py` (see API doc in file)
+ - Some support methods in `matter_testing_support.py`
- Use Mobly assertions for failing tests
-- self.step() along with a steps\_ function to mark test plan steps for cert
+- `self.step()` along with a `steps_*` method to mark test plan steps for cert
tests
### A simple test
```
+# See https://github.com/project-chip/connectedhomeip/blob/master/docs/testing/python.md#defining-the-ci-test-arguments
+# for details about the block below.
+#
+# === BEGIN CI TEST ARGUMENTS ===
# test-runner-runs: run1
# test-runner-run/run1/app: ${ALL_CLUSTERS_APP}
# test-runner-run/run1/factoryreset: True
# test-runner-run/run1/quiet: True
# test-runner-run/run1/app-args: --discriminator 1234 --KVS kvs1 --trace-to json:${TRACE_APP}.json
# test-runner-run/run1/script-args: --storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:${TRACE_TEST_JSON}.json --trace-to perfetto:${TRACE_TEST_PERFETTO}.perfetto
+# === END CI TEST ARGUMENTS ===
class TC_MYTEST_1_1(MatterBaseTest):
@@ -74,69 +80,19 @@ default_matter_test_main()
---
-In this test, asserts.assert_equal is used to fail the test on condition failure
-(throws an exception).
+In this test, `asserts.assert_equal` is used to fail the test on equality
+assertion failure (throws an exception).
-Because the test requires the use of the async function
-read_single_attribute_check_success, the test is decorated with the
+Because the test requires the use of the async method
+`read_single_attribute_check_success`, the test is decorated with the
`@async_test_body` decorator
-The default_matter_test_main() function is used to run the test on the command
+The `default_matter_test_main()` function is used to run the test on the command
line. These two lines should appear verbatim at the bottom of every python test
file.
-## Defining the test arguments
-
-Below is the format:
-
-```
-# test-runner-runs:
-# test-runner-run//app: ${TYPE_OF_APP}
-# test-runner-run//factoryreset:
-# test-runner-run//quiet:
-# test-runner-run//app-args:
-# test-runner-run//script-args:
-```
-
-### Description of Parameters
-
-- test-runner-runs: Specifies the identifier for the run. This can be any
- unique identifier.
-
- - Example: run1
-
-- test-runner-run//app: Indicates the application to be used
- in the test. Different app types as needed could be referenced from section
- [name: Generate an argument environment file ] of the file
- [.github/workflows/tests.yaml](https://github.com/project-chip/connectedhomeip/blob/master/.github/workflows/tests.yaml)
-
- - Example: \${TYPE_OF_APP}
-
-- test-runner-run//factoryreset: Determines whether a factory
- reset should be performed before the test.
-
- - Example: True
-
-- test-runner-run//quiet: Sets the verbosity level of the test
- run. When set to True, the test run will be quieter.
-
- - Example: True
-
-- test-runner-run//app-args: Specifies the arguments to be
- passed to the application during the test.
-
- - Example: --discriminator 1234 --KVS kvs1 --trace-to
- json:\${TRACE_APP}.json
-
-- test-runner-run//script-args: Specifies the arguments to be
- passed to the test script.
- - Example: --storage-path admin_storage.json --commissioning-method
- on-network --discriminator 1234 --passcode 20202021 --trace-to
- json:${TRACE_TEST_JSON}.json --trace-to perfetto:${TRACE_TEST_PERFETTO}.perfetto
-
-This structured format ensures that all necessary configurations are clearly
-defined and easily understood, allowing for consistent and reliable test
-execution.
+The structured comments above the class definition are used to set up the CI for
+the tests. Please see [Running tests in CI](#running-tests-in-ci).
## Cluster Codegen
@@ -156,12 +112,12 @@ always:
Each `Clusters.` will include the appropriate sub-classes (if
defined for the cluster):
-- Enums
-- Bitmaps
-- Structs
-- Attributes
-- Commands
-- Events
+- `Enums`
+- `Bitmaps`
+- `Structs`
+- `Attributes`
+- `Commands`
+- `Events`
### Attributes
@@ -176,42 +132,41 @@ Each `Clusters..Attributes.` class has:
Example:
-- class - Clusters.OnOff.Attributes.OnTime
- - used for Read commands
-- instance - Clusters.OnOff.Attributes.OnTime(5)
- - sets the value to 5
- - pass the instance to write commands to write the value
+- class - `Clusters.OnOff.Attributes.OnTime`
+ - Used for Read commands
+- instance - `Clusters.OnOff.Attributes.OnTime(5)`
+ - Sets the value to `5`
+ - Pass the instance to Write method to write the value
### Commands
-Commands derive from ClusterCommand
+Commands derive from `ClusterCommand`.
Each `Clusters..Commands.` class has:
-- cluster_id
-- command_id
-- is_client
-- response_type (None for status response)
-- descriptor
+- `cluster_id`
+- `command_id`
+- `is_client`
+- `response_type` (None for status response)
+- `descriptor`
- data members (if required)
Example:
-- Clusters.OnOff.Commands.OnWithTimedOff(onOffControl=0, onTime=5,
- offWaitTime=8)
-- Clusters.OnOff.Commands.OnWithTimedOff()
- - command with no fields
+- `Clusters.OnOff.Commands.OnWithTimedOff(onOffControl=0, onTime=5, offWaitTime=8)`
+- `Clusters.OnOff.Commands.OnWithTimedOff()`
+ - Command with no fields
### Events
-Events derive from ClusterEvent
+Events derive from `ClusterEvent`.
Each `Clusters..Events.` class has:
-- cluster_id
-- event_id
-- descriptor
-- data members if required
+- `cluster_id`
+- `event_id`
+- `descriptor`
+- Other data members if required
Example:
@@ -219,16 +174,16 @@ Example:
### Enums
-Enums derive from MatterIntEnum
+Enums derive from `MatterIntEnum`.
Each `Clusters..Enum.` has
-- k
-- kUnknownEnumValue (used for testing, do not transmit)
+- `k` constants
+- `kUnknownEnumValue` (used for testing, do not transmit)
Example:
-- Clusters.AccessControl.Enums.AccessControlEntryPrivilegeEnum.kAdminister
+- `Clusters.AccessControl.Enums.AccessControlEntryPrivilegeEnum.kAdminister`
### Bitmaps
@@ -238,26 +193,28 @@ Each `Clusters..Bitmaps.` has: - k
Special class:
-- class Feature(IntFlag) - contains the feature map bitmaps
+- class `Feature(IntFlag)` - contains the feature map bitmaps
Example:
-- Clusters.LaundryWasherControls.Bitmaps.Feature.kSpin
+- `Clusters.LaundryWasherControls.Bitmaps.Feature.kSpin`
### Structs
-Structs derive from ClusterObject
+Structs derive from `ClusterObject`.
Each `Clusters..Structs.` has:
-- descriptor
-- data members
+- A "descriptor"
+- Data members
-Example
+Example:
-- Clusters.BasicInformation.Structs.ProductAppearanceStruct(
-- finish=Clusters.BasicInformation.Enums.ProductFinishEnum.kFabric,
-- primaryColor=Clusters.BasicInformation.Enums.ColorEnum.kBlack)
+```
+Clusters.BasicInformation.Structs.ProductAppearanceStruct(
+ finish=Clusters.BasicInformation.Enums.ProductFinishEnum.kFabric,
+ primaryColor=Clusters.BasicInformation.Enums.ColorEnum.kBlack)
+```
## Accessing Clusters and Cluster Elements by ID
@@ -266,14 +223,14 @@ has a set of objects that map ID to the code generated object.
`chip.clusters.ClusterObjects.ALL_CLUSTERS`
-- dict[int, Cluster] - maps cluster ID to Cluster class
-- cluster = chip.clusters.ClusterObjects.ALL_CLUSTERS[cluster_id]
+- `dict[int, Cluster]` - maps cluster ID to Cluster class
+ - `cluster = chip.clusters.ClusterObjects.ALL_CLUSTERS[cluster_id]`
`chip.clusters.ClusterObjects.ALL_ATTRIBUTES`
-- dict[int, dict[int, ClusterAttributeDescriptor]] - maps cluster ID to a dict
- of attribute ID to attribute class
-- attr = chip.clusters.ClusterObjects.ALL_ATTRIBUTES[cluster_id][attribute_id]
+- `dict[int, dict[int, ClusterAttributeDescriptor]]` - maps cluster ID to a
+ dict of attribute ID to attribute class
+ - `attr = chip.clusters.ClusterObjects.ALL_ATTRIBUTES[cluster_id][attribute_id]`
`chip.clusters.ClusterObjects.ALL_ACCEPTED_COMMANDS/ALL_GENERATED_COMMANDS`
@@ -282,15 +239,15 @@ has a set of objects that map ID to the code generated object.
## ChipDeviceCtrl API
-The ChipDeviceCtrl API is implemented in
+The `ChipDeviceCtrl` API is implemented in
[ChipDeviceCtrl.py](https://github.com/project-chip/connectedhomeip/blob/master/src/controller/python/chip/ChipDeviceCtrl.py).
-The ChipDeviceCtrl implements a python-based controller that can be used to
+The `ChipDeviceCtrl` implements a python-based controller that can be used to
commission and control devices. The API is documented here in the
[ChipDeviceCtrl API documentation](./ChipDeviceCtrlAPI.md)
The API doc gives full descriptions of the APIs being used. The most commonly
-used functions are linked below
+used methods are linked below.
### [Read](./ChipDeviceCtrlAPI.md#read)
@@ -299,7 +256,7 @@ used functions are linked below
### [ReadAttribute](./ChipDeviceCtrlAPI.md#readattribute)
-- convenience wrapper for Read for attributes
+- Convenience wrapper for Read for attributes
Examples: Wildcard read (all clusters, all endpoints):
@@ -323,8 +280,9 @@ Multi-path
### [ReadEvent](./ChipDeviceCtrlAPI.md#readevent)
-- convenience wrapper for Read
-- Similar to ReadAttribute, but the tuple includes urgency as the last number
+- Convenience wrapper for `Read`
+- Similar to `ReadAttribute`, but the tuple includes urgency as the last
+ argument
Example:
@@ -337,19 +295,19 @@ Clusters.TimeSynchronization.Events.MissingTrustedTimeSource, urgent)])
### Subscriptions
-Subscriptions are handled in the Read / ReadAttribute / ReadEvent APIs. To
-initiate a subscription, set the `reportInterval` tuple to set the floor and
-ceiling. The `keepSubscriptions` and `autoResubscribe` parameters also apply to
-subscriptions.
+Subscriptions are handled in the `Read` / `ReadAttribute` / `ReadEvent` APIs. To
+initiate a subscription, set the `reportInterval` tuple argument to set the
+floor and ceiling. The `keepSubscriptions` and `autoResubscribe` arguments also
+apply to subscriptions.
Subscription return `ClusterAttribute.SubscriptionTransaction`. This can be used
to set callbacks. The object is returned after the priming data read is
complete, and the values there are used to populate the cache. The attribute
callbacks are called on update.
-- SetAttributeUpdateCallback
+- `SetAttributeUpdateCallback`
- Callable[[TypedAttributePath, SubscriptionTransaction], None]
-- SetEventUpdateCallback
+- `SetEventUpdateCallback`
- Callable[[EventReadResult, SubscriptionTransaction], None]
- await changes in the main loop using a trigger mechanism from the callback.
@@ -387,7 +345,7 @@ asserts.assert_equal(ret[0].status, Status.Success, “write failed”)
### [SendCommand](./ChipDeviceCtrlAPI.md#sendcommand)
-- Instantiate the command with the values you need to populate
+- Instantiate the command object with the values you need to populate
- If there is a non-status return, it’s returned from the command
- If there is a pure status return it will return nothing
- Raises InteractionModelError on failure
@@ -403,62 +361,63 @@ pai = await dev_ctrl.SendCommand(nodeid, 0, Clusters.OperationalCredentials.Comm
- Because we tend to do a lot of single read / single commands in tests, we
added a couple of helpers in MatterBaseTest that use some of the default
values
- - read_single_attribute_check_success
- - read_single_attribute_expect_error
- - send_single_cmd
-- step() function to mark step progress for the test harness
-- skip / skip_step / skip_remaining_steps functions for test harness
+ - `read_single_attribute_check_success()`
+ - `read_single_attribute_expect_error()`
+ - `send_single_cmd()`
+- `step()` method to mark step progress for the test harness
+- `skip()` / `skip_step()` / `skip_remaining_steps()` methods for test harness
integration
-- check_pics / pics_guard to handle pics
+- `check_pics()` / `pics_guard()` to handle pics
## Mobly helpers
The test system is based on Mobly, and the
[matter_testing_support.py](https://github.com/project-chip/connectedhomeip/blob/master/src/python_testing/matter_testing_support.py)
-class provides some helpers for Mobly integration
+class provides some helpers for Mobly integration.
-- default_matter_test_main
- - Sets up commissioning and finds all tests, parses command arguments
+- `default_matter_test_main`
+ - Sets up commissioning and finds all tests, parses command-line arguments
use as:
```
if __name__ == "__main__":
-default_matter_test_main()
+ default_matter_test_main()
```
-- Mobly will run all functions starting with test\_ by default
- - use --tests command line argument to specify
-- Setup / teardown functions
- - setup_class / teardown_class
- - setup_test / teardown_test
- - Don’t forget to call the super() if you override these
+- Mobly will run all methods starting with `test_` prefix by default
+ - use `--tests` command line argument to specify exact name,s
+- Setup and teardown methods
+ - `setup_class` / `teardown_class`
+ - `setup_test` / `teardown_test`
+ - Don’t forget to call the `super()` if you override these
## Test harness helpers
-The python testing system also includes several functions for integrations with
+The python testing system also includes several methods for integrations with
the test harness. To integrate with the test harness, you can define the
-following functions on your class to allow the test harness UI to properly work
+following methods on your class to allow the test harness UI to properly work
through your tests.
-All of these functions are demonstrated in the
+All of these methods are demonstrated in the
[hello_example.py](https://github.com/project-chip/connectedhomeip/blob/master/src/python_testing/hello_test.py)
reference.
-- step enumeration
- - define a function called `steps_YourFunctionName` to allow the test
+- Steps enumeration:
+ - Define a method called `steps_` to allow the test
harness to display the steps
- - use the self.step(``) function to walk through the steps
-- test description
- - define a function called `desc_YourFunctionName` to send back a string
+ - Use the `self.step()` method to walk through the steps
+- Test description:
+ - Define a method called `desc_` to send back a string
with the test description
-- top level PICS
- - To guard your test on a top level PICS, define a function called
- `pics_YourFunctionName` to send back a list of pics. If this function is
- omitted, the test will be run for every endpoint on every device.
-- overriding the default timeout
- - if the test is exceptionally long running, define a property function
- `default_timeout` to adjust the timeout. The default is 90 seconds
+- Top-level PICS:
+ - To guard your test on a top level PICS, define a method called
+ `pics_` to send back a list of PICS. If this method
+ is omitted, the test will be run for every endpoint on every device.
+- Overriding the default timeout:
+ - If the test is exceptionally long running, define a property getter
+ method `default_timeout` to adjust the timeout. The default is 90
+ seconds.
Deferred failures: For some tests, it makes sense to perform the entire test
before failing and collect all the errors so the developers can address all the
@@ -466,13 +425,13 @@ failures without needing to re-run the test multiple times. For example, tests
that look at every attribute on the cluster and perform independent operations
on them etc.
-For such tests, use the ProblemNotice format and the convenience functions:
+For such tests, use the ProblemNotice format and the convenience methods:
-- self.record_error
-- self.record_warning
+- `self.record_error`
+- `self.record_warning`
-These functions keep track of the problems, and will print them at the end of
-the test. The test will not be failed until the assert is called.
+These methods keep track of the problems, and will print them at the end of the
+test. The test will not be failed until an assert is called.
A good example of this type of test can be found in the device basic composition
tests, where all the test steps are independent and performed on a single read.
@@ -481,16 +440,21 @@ See
## Command line arguments
-- Use help to get a full list
-- --commissioning-method
- - need to re-commission to python controller as chip-tool and python
+- Use `--help` to get a full list
+- `--storage-path`
+ - Used to set a local storage file path for persisted data to avoid
+ clashing files. It is suggested to always provide this argument. Default
+ value is `admin_storage.json` in current directory.
+- `--commissioning-method`
+ - Need to re-commission to python controller as chip-tool and python
commissioner do not share a credentials
-- --discriminator, --passcode, --qr-code, --manual-code
-- --tests to select tests
-- --PICS
-- --int-arg, --bool-arg, --float-arg, --string-arg, --json-arg, --hex-arg
- - specify as key:value ex --bool-arg pixit_name:False
- - used for custom arguments to scripts (PIXITs)
+- `--discriminator`, `--passcode`, `--qr-code`, `--manual-code`
+- `--tests` to select tests
+- `--PICS`
+- `--int-arg`, `--bool-arg`, `--float-arg`, `--string-arg`, `--json-arg`,
+ `--hex-arg`
+ - Specify as key:value ex --bool-arg pixit_name:False
+ - Used for custom arguments to scripts (PIXITs)
## PICS and PIXITS
@@ -504,7 +468,7 @@ See
comments
- pixit_value = self.user_params.get("pixit_name", default)
-## Support functions
+## Support functionality
To create a controller on a new fabric:
@@ -512,7 +476,7 @@ To create a controller on a new fabric:
new_CA = self.certificate_authority_manager.NewCertificateAuthority()
new_fabric_admin = new_certificate_authority.NewFabricAdmin(vendorId=0xFFF1,
-fabricId=self.matter_test_config.fabric_id + 1)
+ fabricId=self.matter_test_config.fabric_id + 1)
TH2 = new_fabric_admin.NewController(nodeId=112233)
```
@@ -524,22 +488,22 @@ params = self.OpenCommissioningWindow(dev_ctrl=self.default_controller, node_id=
```
To create a new controller on the SAME fabric, allocate a new controller from
-the fabric admin
+the fabric admin.
Fabric admin for default controller:
```
-fa=self.certificate_authority_manager.activeCaList[0].adminList[0]
-second_ctrl = fa.new_fabric_admin.NewController(nodeId=node_id)
+ fa = self.certificate_authority_manager.activeCaList[0].adminList[0]
+ second_ctrl = fa.new_fabric_admin.NewController(nodeId=node_id)
```
-## other support functions
+## Other support utilities
-- basic_composition_support
+- `basic_composition_support`
- wildcard read, whole device analysis
-- CommissioningFlowBlocks
+- `CommissioningFlowBlocks`
- various commissioning support for core tests
-- spec_parsing_support
+- `spec_parsing_support`
- parsing data model XML into python readable format
# Running tests locally
@@ -564,12 +528,12 @@ or
bootstrap.sh should be used for for the first setup, activate.sh may be used for
subsequent setups as it is faster.
-Next build the python wheels and create / activate a venv (called `py` here, but
-any name may be used)
+Next build the python wheels and create / activate a venv (called `pyenv` here,
+but any name may be used)
```
-./scripts/build_python.sh -i py
-source py/bin/activate
+./scripts/build_python.sh -i pyenv
+source pyenv/bin/activate
```
## Running tests
@@ -589,11 +553,11 @@ python3 src/python_testing/TC_ACE_1_2.py --commissioning-method on-network --qr-
```
Some tests require additional arguments (ex. PIXITs or configuration variables
-for the CI). These arguments can be passed as sets of key-value pairs using the
-`---arg` command line arguments. For example
+for the CI). These arguments can be passed as sets of key/value pairs using the
+`---arg:` command line arguments. For example:
```
---int-arg PIXIT.ACE.APPENDPOINT:1 PIXIT.ACE.APPDEVTYPEID:0x0100 --string-arg PIXIT.ACE.APPCLUSTER:OnOff PIXIT.ACE.APPATTRIBUTE:OnOff
+--int-arg PIXIT.ACE.APPENDPOINT:1 --int-arg PIXIT.ACE.APPDEVTYPEID:0x0100 --string-arg PIXIT.ACE.APPCLUSTER:OnOff --string-arg PIXIT.ACE.APPATTRIBUTE:OnOff
```
## Local host app testing
@@ -605,8 +569,75 @@ example DUT on the host and includes factory reset support
# Running tests in CI
-- add to .github/workflows/tests.yaml repl_tests_linux
-- don’t forget to set the PICS file to the ci-pics-values
-- if there are things in your test that will fail on CI (ex. test vendor
+- Add test to the `repl_tests_linux` section of `.github/workflows/tests.yaml`
+- Don’t forget to set the PICS file to the ci-pics-values
+- If there are steps in your test that will fail on CI (e.g. test vendor
checks), gate them on the PICS_SDK_CI_ONLY
- - is_ci = self.check_pics('PICS_SDK_CI_ONLY')
+ - `is_ci = self.check_pics('PICS_SDK_CI_ONLY')`
+
+The CI test runner uses a structured environment setup that can be declared
+using structured comments at the top of the test file. To use this structured
+format, use the `--load-from-env` flag with the `run_python_tests.py` runner.
+
+Ex:
+`scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/python_testing/TC_ICDM_2_1.py'`
+
+## Defining the CI test arguments
+
+Below is the format of the structured environment definition comments:
+
+```
+# See https://github.com/project-chip/connectedhomeip/blob/master/docs/testing/python.md#defining-the-ci-test-arguments
+# for details about the block below.
+#
+# === BEGIN CI TEST ARGUMENTS ===
+# test-runner-runs:
+# test-runner-run//app: ${TYPE_OF_APP}
+# test-runner-run//factoryreset:
+# test-runner-run//quiet:
+# test-runner-run//app-args:
+# test-runner-run//script-args:
+# === END CI TEST ARGUMENTS ===
+```
+
+NOTE: The `=== BEGIN CI TEST ARGUMENTS ===` and `=== END CI TEST ARGUMENTS ===`
+markers must be present.
+
+### Description of Parameters
+
+- `test-runner-runs`: Specifies the identifier for the run. This can be any
+ unique identifier.
+
+ - Example: `run1`
+
+- `test-runner-run//app`: Indicates the application to be used
+ in the test. Different app types as needed could be referenced from section
+ [name: Generate an argument environment file ] of the file
+ [.github/workflows/tests.yaml](https://github.com/project-chip/connectedhomeip/blob/master/.github/workflows/tests.yaml)
+
+ - Example: `${TYPE_OF_APP}`
+
+- `test-runner-run//factoryreset`: Determines whether a
+ factory reset should be performed before the test.
+
+ - Example: `True`
+
+- `test-runner-run//quiet`: Sets the verbosity level of the
+ test run. When set to True, the test run will be quieter.
+
+ - Example: `True`
+
+- `test-runner-run//app-args`: Specifies the arguments to be
+ passed to the application during the test.
+
+ - Example:
+ `--discriminator 1234 --KVS kvs1 --trace-to json:${TRACE_APP}.json`
+
+- `test-runner-run//script-args`: Specifies the arguments to
+ be passed to the test script.
+ - Example:
+ `--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:${TRACE_TEST_JSON}.json --trace-to perfetto:${TRACE_TEST_PERFETTO}.perfetto`
+
+This structured format ensures that all necessary configurations are clearly
+defined and easily understood, allowing for consistent and reliable test
+execution.
diff --git a/docs/zap_clusters.md b/docs/zap_clusters.md
index 5f2a2e262111ac..dc439fa2f37607 100644
--- a/docs/zap_clusters.md
+++ b/docs/zap_clusters.md
@@ -131,6 +131,7 @@ Generally regenerate using one of:
| 1294 | 0x50E | AccountLogin |
| 1295 | 0x50F | ContentControl |
| 1296 | 0x510 | ContentAppObserver |
+| 1873 | 0x751 | CommissionerControl |
| 2820 | 0xB04 | ElectricalMeasurement |
| 4294048773 | 0xFFF1FC05 | UnitTesting |
| 4294048774 | 0xFFF1FC06 | FaultInjection |
diff --git a/examples/all-clusters-app/esp32/main/CMakeLists.txt b/examples/all-clusters-app/esp32/main/CMakeLists.txt
index dc41290765313a..7fd1d548609257 100644
--- a/examples/all-clusters-app/esp32/main/CMakeLists.txt
+++ b/examples/all-clusters-app/esp32/main/CMakeLists.txt
@@ -34,6 +34,7 @@ set(SRC_DIRS_LIST
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/platform/esp32/ota"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/platform/esp32/common"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/platform/esp32/shell_extension"
+ "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/platform/esp32/mode-support"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/icd/server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/util"
@@ -105,6 +106,8 @@ set(SRC_DIRS_LIST
)
+set(EXCLUDE_SRCS "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp")
+
if (CONFIG_ENABLE_PW_RPC)
# Append additional directories for RPC build
set(PRIV_INCLUDE_DIRS_LIST "${PRIV_INCLUDE_DIRS_LIST}"
diff --git a/examples/all-clusters-app/esp32/main/main.cpp b/examples/all-clusters-app/esp32/main/main.cpp
index b85f47d883c620..af94d2b2d36afe 100644
--- a/examples/all-clusters-app/esp32/main/main.cpp
+++ b/examples/all-clusters-app/esp32/main/main.cpp
@@ -41,6 +41,7 @@
#include
#include
#include
+#include
#include
#include
@@ -121,6 +122,13 @@ static void InitServer(intptr_t context)
#if CONFIG_DEVICE_TYPE_M5STACK
SetupPretendDevices();
#endif
+ CHIP_ERROR err =
+ app::Clusters::ModeSelect::StaticSupportedModesManager::getStaticSupportedModesManagerInstance().InitEndpointArray(
+ FIXED_ENDPOINT_COUNT);
+ if (err != CHIP_NO_ERROR)
+ {
+ ESP_LOGE(TAG, "Failed to initialize endpoint array for supported-modes, err:%" CHIP_ERROR_FORMAT, err.Format());
+ }
app::Clusters::TemperatureControl::SetInstance(&sAppSupportedTemperatureLevelsDelegate);
}
diff --git a/examples/all-clusters-app/nxp/zephyr/.gitignore b/examples/all-clusters-app/nxp/zephyr/.gitignore
new file mode 100644
index 00000000000000..84c048a73cc2e5
--- /dev/null
+++ b/examples/all-clusters-app/nxp/zephyr/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/examples/all-clusters-app/nxp/zephyr/CMakeLists.txt b/examples/all-clusters-app/nxp/zephyr/CMakeLists.txt
new file mode 100644
index 00000000000000..2fa2d558a2724a
--- /dev/null
+++ b/examples/all-clusters-app/nxp/zephyr/CMakeLists.txt
@@ -0,0 +1,115 @@
+#
+# Copyright (c) 2023-2024 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.
+#
+cmake_minimum_required(VERSION 3.13.1)
+
+get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/third_party/connectedhomeip REALPATH)
+get_filename_component(GEN_DIR ${CHIP_ROOT}/zzz_generated/ REALPATH)
+get_filename_component(ALL_CLUSTERS_COMMON_DIR ${CHIP_ROOT}/examples/all-clusters-app/all-clusters-common REALPATH)
+get_filename_component(ALL_CLUSTERS_NXP_COMMON_DIR ${CHIP_ROOT}/examples/all-clusters-app/nxp/common REALPATH)
+get_filename_component(EXAMPLE_PLATFORM_NXP_COMMON_DIR ${CHIP_ROOT}/examples/platform/nxp/common REALPATH)
+get_filename_component(EXAMPLE_PLATFORM_NXP_ZEPHYR_DIR ${CHIP_ROOT}/examples/platform/nxp/zephyr REALPATH)
+
+# Perform common operations like detecting extra overlays in the platform folder for the target board
+# This must be called before find_package(Zephyr)
+include(${CHIP_ROOT}/config/nxp/app/pre-zephyr.cmake)
+
+list(APPEND ZEPHYR_EXTRA_MODULES ${CHIP_ROOT}/config/nxp/chip-module)
+find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
+
+# -Wmaybe-uninitialized has too many false positives, including on std::optional
+# and chip::Optional. Make it nonfatal.
+#
+# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80635
+target_compile_options(app PRIVATE -Werror -Wno-error=maybe-uninitialized)
+
+project(chip-nxp-all-clusters-app-example)
+
+include(${CHIP_ROOT}/config/nxp/app/enable-gnu-std.cmake)
+include(${CHIP_ROOT}/src/app/chip_data_model.cmake)
+
+target_include_directories(app
+ PRIVATE
+ ${ALL_CLUSTERS_NXP_COMMON_DIR}/main/include
+ ${ALL_CLUSTERS_COMMON_DIR}/include
+ ${GEN_DIR}/app-common
+ ${GEN_DIR}/all-clusters-app
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/device_manager/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/icd/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/device_callbacks/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/factory_data/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/app_task/include
+)
+
+target_sources(app
+ PRIVATE
+ main/main.cpp
+ ${ALL_CLUSTERS_NXP_COMMON_DIR}/main/AppTask.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/device_manager/source/CHIPDeviceManager.cpp
+ ${ALL_CLUSTERS_NXP_COMMON_DIR}/main/DeviceCallbacks.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/device_callbacks/source/CommonDeviceCallbacks.cpp
+ ${ALL_CLUSTERS_NXP_COMMON_DIR}/main/ZclCallbacks.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/binding-handler.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/app_task/source/AppTaskBase.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/app_task/source/AppTaskZephyr.cpp
+ ${EXAMPLE_PLATFORM_NXP_ZEPHYR_DIR}/factory_data/source/AppFactoryDataExample.cpp
+)
+
+target_compile_definitions(app PUBLIC
+ "EXTERNAL_FACTORY_DATA_PROVIDER_IMPL_HEADER=\"platform/nxp/zephyr/FactoryDataProviderImpl.h\""
+)
+
+if(CONFIG_CHIP_OTA_REQUESTOR)
+ target_sources(app PRIVATE
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/ota_requestor/source/OTARequestorInitiatorCommon.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/ota_requestor/source/OTARequestorInitiatorZephyr.cpp
+ )
+ target_include_directories(app PRIVATE
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/ota_requestor/include/
+ )
+endif()
+
+chip_configure_data_model(app
+ INCLUDE_SERVER
+ ZAP_FILE ${ALL_CLUSTERS_COMMON_DIR}/all-clusters-app.zap
+)
+
+if(CONFIG_CHIP_LIB_SHELL)
+ target_compile_definitions(app PRIVATE ENABLE_CHIP_SHELL)
+ target_include_directories(app PRIVATE
+ ${CHIP_ROOT}/examples/shell/shell_common/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/matter_cli/include
+ )
+ target_sources(app PRIVATE
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/matter_cli/source/AppCLIBase.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/matter_cli/source/AppCLIZephyr.cpp
+ ${CHIP_ROOT}/examples/shell/shell_common/cmd_misc.cpp
+ ${CHIP_ROOT}/examples/shell/shell_common/cmd_otcli.cpp
+ ${CHIP_ROOT}/examples/shell/shell_common/cmd_server.cpp
+ )
+endif()
+
+target_sources(app
+ PRIVATE
+ ${ALL_CLUSTERS_COMMON_DIR}/src/smco-stub.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/static-supported-modes-manager.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/static-supported-temperature-levels.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/bridged-actions-stub.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/fan-stub.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/air-quality-instance.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/concentration-measurement-instances.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/resource-monitoring-delegates.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/icd/source/ICDUtil.cpp
+)
diff --git a/examples/all-clusters-app/nxp/zephyr/Kconfig b/examples/all-clusters-app/nxp/zephyr/Kconfig
new file mode 100644
index 00000000000000..748835a9d0fe6b
--- /dev/null
+++ b/examples/all-clusters-app/nxp/zephyr/Kconfig
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2024 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.
+#
+mainmenu "Matter NXP All Clusters Example Application"
+
+rsource "../../../../config/nxp/chip-module/Kconfig.features"
+rsource "../../../../config/nxp/chip-module/Kconfig.defaults"
+source "Kconfig.zephyr"
diff --git a/examples/all-clusters-app/nxp/zephyr/README.md b/examples/all-clusters-app/nxp/zephyr/README.md
new file mode 100644
index 00000000000000..45f71ee76c077b
--- /dev/null
+++ b/examples/all-clusters-app/nxp/zephyr/README.md
@@ -0,0 +1,609 @@
+# CHIP NXP Zephyr All-clusters Application
+
+The all-clusters example implements a server which can be accessed by a CHIP
+controller and can accept basic cluster commands.
+
+The example is based on
+[Project CHIP](https://github.com/project-chip/connectedhomeip) and the NXP
+Zephyr SDK, and provides a prototype application that demonstrates device
+commissioning and different cluster control.
+
+
+
+- [Introduction](#introduction)
+- [Building](#building)
+- [Flashing and debugging](#flashing-and-debugging)
+- [Factory data](#factory-data)
+- [Manufacturing data](#generate-factory-data)
+- [OTA Software Update](#ota-software-update)
+- [Testing the example](#testing-the-example)
+- [Using Matter CLI in NXP Zephyr examples](#using-matter-cli-in-nxp-zephyr-examples)
+
+
+
+
+
+## Introduction
+
+The Zephyr application provides a working demonstration of supported board
+integration from Zephyr, built using the Project CHIP codebase and the
+NXP/Zephyr SDK.
+
+The example supports:
+
+- Matter over Wi-Fi
+
+The supported boards are:
+
+- `rd_rw612_bga`
+
+
+
+## Building
+
+In order to build the Project CHIP example, we recommend using a Linux
+distribution (the demo-application was compiled on Ubuntu 20.04).
+
+Prerequisites:
+
+- Follow instruction from [BUILDING.md](../../../../docs/guides/BUILDING.md)
+ to setup the Matter environment
+- Follow instruction from
+ [Getting Started Guide](https://docs.zephyrproject.org/latest/develop/getting_started/index.html)
+ to setup a Zephyr workspace, however, the west init command to use is as
+ follows:
+
+```shell
+$ west init zephyrproject -m https://github.com/nxp-zephyr-ear/zephyr.git --mr zephyr_rw61x_v3.6_RFP
+```
+
+> **Note**: Currently, supported NXP platforms in Zephyr targeting Matter are
+> not available in the official Zephyr repo, you'll have to use the NXP fork
+> `https://github.com/nxp-zephyr-ear/zephyr` github repo. Reach to your NXP
+> contact for more details.
+
+Steps to build the example, targeting `rd_rw612_bga` board:
+
+1. Activate your Matter env:
+
+```shell
+source /scripts/activate.sh
+```
+
+2. Source zephyr-env.sh:
+
+```shell
+source /zephyr-env.sh
+```
+
+3. Run west build command:
+
+```shell
+west build -b rd_rw612_bga -p
+```
+
+By default, a folder `build` will be created in the same folder you run the
+command from. The binaries will be created in `build/zephyr` with the name
+`zephyr.elf` and `zephyr.bin`.
+
+You can get more details on `west build` with
+[Zephyr's building guide](https://docs.zephyrproject.org/latest/develop/west/build-flash-debug.html#building-west-build)
+
+
+
+## Flashing and debugging
+
+### Flashing without debugging
+
+`west` can be used to flash a target, as an example for `rd_rw612_bga` board:
+
+```shell
+west flash -i
+```
+
+You can get more details on `west flash` with
+[Zephyr's flashing guide](https://docs.zephyrproject.org/latest/develop/west/build-flash-debug.html#flashing-west-flash)
+
+> **Note**: `west flash` will not start a debug session, it will only flash and
+> reset the device
+
+### Flash and debug
+
+To debug a Matter with Zephyr application, you could use several methods:
+
+- [MCUXpresso IDE (version >= 11.6.0)](https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools-/mcuxpresso-integrated-development-environment-ide:MCUXpresso-IDE)
+- `west debug`
+ [Zephyr's debugging guide](https://docs.zephyrproject.org/latest/develop/west/build-flash-debug.html#id29)
+
+> **Note**: As the build provides an elf file, any compatible debugging tool can
+> be used.
+
+
+
+## Factory data
+
+NXP Zephyr examples are not using factory data support by default. Please refer
+the the section below to build with factory data.
+
+You may refer to `src/platform/nxp/zephyr/boards//.overlay` file
+to obtain the memory region used by this partition.
+
+For example, the factory data partition on `rd_rw612_bga` is reserved in the
+last sector of the `flexspi` flash of `RD BGA` board, at `0x1BFFF000`.
+
+```
+&flexspi {
+ status = "okay";
+
+ mx25u51245g: mx25u51245g@0 {
+ ...
+ factory_partition: partition@3FFF000 {
+ label = "factory-data";
+ reg = <0x03FFF000 DT_SIZE_K(4)>;
+ };
+ };
+};
+```
+
+> **Note**: You may also refer to
+> `src/platform/nxp/zephyr/boards//.overlay` file to check other
+> memory partitions used by the platform, such as the file system partition
+> mentioned with the `storage` label.
+
+### Build with factory data support
+
+To build the example with factory data support, you can add
+`-DFILE_SUFFIX=fdata` in the west build command line.
+
+Example:
+
+```bash
+west build -b rd_rw612_bga -p -- -DFILE_SUFFIX=fdata
+```
+
+`prj_fdata.conf` configuration file will enable `CONFIG_CHIP_FACTORY_DATA`
+Kconfig so the application will load the factory data at boot.
+
+
+
+### Generate factory data
+
+#### Automatically (recommended)
+
+The factory data can be generated automatically during the build of the
+application. To do so, you can use the configuration
+`CONFIG_CHIP_FACTORY_DATA_BUILD=y` in `prj_fdata.conf`.
+
+You will have to specify the source of the certificates to be used for the
+factory data. Please refer to `CHIP_FACTORY_DATA_CERT_SOURCE` Kconfig for more
+info.
+
+> **Note**: The application demonstrates the usage of encrypted Matter factory
+> data storage. Matter factory data should be encrypted using an AES 128
+> software key before flashing them to the device flash. You can encrypt the
+> factory data automatically during the build by enabling
+> `CHIP_ENCRYPTED_FACTORY_DATA` Kconfig. See also
+> `CHIP_ENCRYPTED_FACTORY_DATA_AES128_KEY` Kconfig if you want to use a specific
+> key.
+
+The resulting factory data will be provided along `zephyr.bin` as a binary file
+named `factory_data.bin`. In order to flash it to your device, you need to know
+the partition address: please refer to `factory_partition` defined in
+`src/platform/nxp/zephyr/boards//.overlay`.
+
+#### Manually
+
+See
+[Guide for writing manufacturing data on NXP devices](../../../../docs/guides/nxp/nxp_manufacturing_flow.md)
+
+
+
+## OTA Software Update
+
+See
+[Guide for OTA Software Update on NXP devices using Zephyr SDK](../../../../docs/guides/nxp/nxp_zephyr_ota_software_update.md)
+
+
+
+## Testing the example
+
+To know how to commission a device over BLE, follow the instructions from
+[chip-tool's README.md 'Commission a device over BLE'](../../../chip-tool/README.md#commission-a-device-over-ble).
+
+
+
+## Using Matter CLI in NXP Zephyr examples
+
+Some Matter examples for the development kits from NXP include a command-line
+interface that allows access to application logs and
+[Zephyr shell](https://docs.zephyrproject.org/1.13.0/subsystems/shell.html).
+
+Depending on the platform, the CLI console and the logs can be split on two
+different interfaces.
+
+You may refer to `boards/.overlay` file to check how the board is
+configured for the example. The binding `zephyr,console` is used to print the
+logs, while the binding `zephyr,shell-uart` is used for the CLI. If the logs and
+the CLI are split among two serial interfaces, you will have to open both ports.
+
+As an example, the Matter CLI on `rd_rw612_bga` is configured to be output on
+`flexcomm3` with a baudrate of `115200`. The logs are configured to be output on
+`flexcomm0` with a baudrate of `115200`.
+
+> **Note**: `flexcomm3` is wired to the USB `FTDI` port of the `RD BGA` board by
+> default. `flexcomm0` is wired to `GPIO2` (RX) and `GPIO3` (TX). Those pins are
+> accessible on `HD2` pin header.
+
+To access the CLI console, use a serial terminal emulator of your choice, like
+Minicom or GNU Screen. Use the baud rate set to `115200`.
+
+### Example: Starting the CLI console with Minicom
+
+For example, to start using the CLI console with Minicom, run the following
+command with `/dev/ttyACM0` replaced with the device node name of your
+development kit:
+
+```
+minicom -D /dev/ttyACM0 -b 115200
+```
+
+When you reboot the kit, you will see the boot logs in the console, similar to
+the following messages:
+
+```shell
+uart:~$ MAC Address: C0:95:DA:00:00:6E
+...
+wlan-version
+wlan-mac
+wlan-thread-info
+wlan-net-stats
+...
+*** Booting Zephyr OS build zephyr-v3.4.0-187-g2ddf1330209b ***
+I: Init CHIP stack
+...
+```
+
+This means that the console is working correctly and you can start using shell
+commands. For example, issuing the `kernel threads` command will print
+information about all running threads:
+
+```shell
+uart:~$ kernel threads
+Scheduler: 277 since last call
+Threads:
+ 0x20006518 CHIP
+ options: 0x0, priority: -1 timeout: 536896912
+ state: pending
+ stack size 8192, unused 7256, usage 936 / 8192 (11 %)
+
+ 0x20004ab0 SDC RX
+ options: 0x0, priority: -10 timeout: 536890152
+ state: pending
+ stack size 1024, unused 848, usage 176 / 1024 (17 %)
+...
+```
+
+## Listing all commands
+
+To list all available commands, use the Tab key, which is normally used for the
+command completion feature.
+
+Pressing the Tab key in an empty command line prints the list of available
+commands:
+
+```shell
+uart:~$
+ clear device help history
+ hwinfo kernel matter resize
+ retval shell
+```
+
+Pressing the Tab key with a command entered in the command line cycles through
+available options for the given command.
+
+You can also run the `help` command:
+
+```shell
+uart:~$ help
+Please press the button to see all available commands.
+You can also use the button to prompt or auto-complete all commands or its subcommands.
+You can try to call commands with <-h> or <--help> parameter for more information.
+
+Shell supports following meta-keys:
+ Ctrl + (a key from: abcdefklnpuw)
+ Alt + (a key from: bf)
+Please refer to shell documentation for more details.
+
+Available commands:
+ clear :Clear screen.
+ device :Device commands
+ help :Prints the help message.
+ history :Command history.
+ hwinfo :HWINFO commands
+ kernel :Kernel commands
+ matter :Matter commands
+ resize :Console gets terminal screen size or assumes default in case
+ the readout fails. It must be executed after each terminal
+ width change to ensure correct text display.
+ retval :Print return value of most recent command
+ shell :Useful, not Unix-like shell commands.
+```
+
+## Using General purpose commands
+
+### `kernel` command group
+
+#### `reboot` subcommand
+
+Performs either a warm or cold reset. Difference between warm and cold resets
+may vary from a platform to another, but on default Cortex-M architectures, both
+methods are the same, so use either one if nothing is specific to your platform.
+
+```shell
+uart:~$ kernel reboot cold|warm
+```
+
+## Using Matter-specific commands
+
+The NXP Zephyr examples let you use several Matter-specific CLI commands.
+
+These commands are not available by default and to enable using them, set the
+`CONFIG_CHIP_LIB_SHELL=y` Kconfig option in the `prj.conf` file of the given
+example.
+
+Every invoked command must be preceded by the `matter` prefix.
+
+See the following subsections for the description of each Matter-specific
+command.
+
+### `device` command group
+
+Handles a group of commands that are used to manage the device. You must use
+this command together with one of the additional subcommands listed below.
+
+#### `factoryreset` subcommand
+
+Performs device factory reset that is hardware reset preceded by erasing of the
+whole Matter settings stored in a non-volatile memory.
+
+```shell
+uart:~$ matter device factoryreset
+Performing factory reset ...
+```
+
+### `onboardingcodes` command group
+
+Handles a group of commands that are used to view information about device
+onboarding codes. The `onboardingcodes` command takes one required parameter for
+the rendezvous type, then an optional parameter for printing a specific type of
+onboarding code.
+
+The full format of the command is as follows:
+
+```
+onboardingcodes none|softap|ble|onnetwork [qrcode|qrcodeurl|manualpairingcode]
+```
+
+#### `none` subcommand
+
+Prints all onboarding codes. For example:
+
+```shell
+uart:~$ matter onboardingcodes none
+QRCode: MT:W0GU2OTB00KA0648G00
+QRCodeUrl: https://project-chip.github.io/connectedhomeip/qrcode.html?data=MT%3AW0GU2OTB00KA0648G00
+ManualPairingCode: 34970112332
+```
+
+#### `none qrcode` subcommand
+
+Prints the device onboarding QR code payload. Takes no arguments.
+
+```shell
+uart:~$ matter onboardingcodes none qrcode
+MT:W0GU2OTB00KA0648G00
+```
+
+#### `none qrcodeurl` subcommand
+
+Prints the URL to view the device onboarding QR code in a web browser. Takes no
+arguments.
+
+```shell
+uart:~$ matter onboardingcodes none qrcodeurl
+https://project-chip.github.io/connectedhomeip/qrcode.html?data=MT%3AW0GU2OTB00KA0648G00
+```
+
+#### `none manualpairingcode` subcommand
+
+Prints the pairing code for the manual onboarding of a device. Takes no
+arguments.
+
+```shell
+uart:~$ matter onboardingcodes none manualpairingcode
+34970112332
+```
+
+### `config` command group
+
+Handles a group of commands that are used to view device configuration
+information. You can use this command without any subcommand to print all
+available configuration data or to add a specific subcommand.
+
+```shell
+uart:~$ matter config
+VendorId: 65521 (0xFFF1)
+ProductId: 32768 (0x8000)
+HardwareVersion: 1 (0x1)
+FabricId:
+PinCode: 020202021
+Discriminator: f00
+DeviceId:
+```
+
+The `config` command can also take the subcommands listed below.
+
+#### `pincode` subcommand
+
+Prints the PIN code for device setup. Takes no arguments.
+
+```shell
+uart:~$ matter config pincode
+020202021
+```
+
+#### `discriminator` subcommand
+
+Prints the device setup discriminator. Takes no arguments.
+
+```shell
+uart:~$ matter config discriminator
+f00
+```
+
+#### `vendorid` subcommand
+
+Prints the vendor ID of the device. Takes no arguments.
+
+```shell
+uart:~$ matter config vendorid
+65521 (0xFFFF1)
+```
+
+#### `productid` subcommand
+
+Prints the product ID of the device. Takes no arguments.
+
+```shell
+uart:~$ matter config productid
+32768 (0x8000)
+```
+
+#### `hardwarever` subcommand
+
+Prints the hardware version of the device. Takes no arguments.
+
+```shell
+uart:~$ matter config hardwarever
+1 (0x1)
+```
+
+#### `deviceid` subcommand
+
+Prints the device identifier. Takes no arguments.
+
+#### `fabricid` subcommand
+
+Prints the fabric identifier. Takes no arguments.
+
+### `ble` command group
+
+Handles a group of commands that are used to control the device Bluetooth LE
+transport state. You must use this command together with one of the additional
+subcommands listed below.
+
+#### `help` subcommand
+
+Prints help information about the `ble` command group.
+
+```shell
+uart:~$ matter ble help
+ help Usage: ble
+ adv Enable or disable advertisement. Usage: ble adv
+```
+
+#### `adv start` subcommand
+
+Enables Bluetooth LE advertising.
+
+```shell
+uart:~$ matter ble adv start
+Starting BLE advertising
+```
+
+#### `adv stop` subcommand
+
+Disables Bluetooth LE advertising.
+
+```shell
+uart:~$ matter ble adv stop
+Stopping BLE advertising
+```
+
+#### `adv status` subcommand
+
+Prints the information about the current Bluetooth LE advertising status.
+
+```shell
+uart:~$ matter ble adv state
+BLE advertising is disabled
+
+```
+
+### `dns` command group
+
+Handles a group of commands that are used to trigger performing DNS queries. You
+must use this command together with one of the additional subcommands listed
+below.
+
+#### `browse` subcommand
+
+Browses for DNS services of `_matterc_udp` type and prints the received
+response. Takes no argument.
+
+```shell
+uart:~$ matter dns browse
+Browsing ...
+DNS browse succeeded:
+ Hostname: 0E824F0CA6DE309C
+ Vendor ID: 9050
+ Product ID: 20043
+ Long discriminator: 3840
+ Device type: 0
+ Device name:
+ Commissioning mode: 0
+ IP addresses:
+ fd08:b65e:db8e:f9c7:2cc2:2043:1366:3b31
+```
+
+#### `resolve` subcommand
+
+Resolves the specified Matter node service given by the _fabric-id_ and
+_node-id_.
+
+```shell
+uart:~$ matter dns resolve fabric-id node-id
+Resolving ...
+DNS resolve for 000000014A77CBB3-0000000000BC5C01 succeeded:
+ IP address: fd08:b65e:db8e:f9c7:8052:1a8e:4dd4:e1f3
+ Port: 5540
+```
+
+### `stat` command group
+
+Handles a group of commands that are used to get and reset the peak usage of
+critical system resources used by Matter. These commands are only available when
+the `CONFIG_CHIP_STATISTICS=y` Kconfig option is set.
+
+#### `peak` subcommand
+
+Prints the peak usage of system resources.
+
+```shell
+uart:~$ matter stat peak
+Packet Buffers: 1
+Timers: 2
+TCP endpoints: 0
+UDP endpoints: 1
+Exchange contexts: 0
+Unsolicited message handlers: 5
+Platform events: 2
+```
+
+#### `reset` subcommand
+
+Resets the peak usage of system resources.
+
+```shell
+uart:~$ matter stat reset
+```
diff --git a/examples/all-clusters-app/nxp/zephyr/boards/rd_rw612_bga.overlay b/examples/all-clusters-app/nxp/zephyr/boards/rd_rw612_bga.overlay
new file mode 100644
index 00000000000000..86bb20739527cd
--- /dev/null
+++ b/examples/all-clusters-app/nxp/zephyr/boards/rd_rw612_bga.overlay
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2023-2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+/ {
+ chosen {
+ zephyr,console = &flexcomm0;
+ zephyr,shell-uart = &flexcomm3;
+ };
+};
+
+&flexcomm0 {
+ compatible = "nxp,lpc-usart";
+ status = "okay";
+ current-speed = <115200>;
+ pinctrl-0 = <&pinmux_flexcomm0_usart>;
+ pinctrl-names = "default";
+};
+
+&flexcomm3 {
+ compatible = "nxp,lpc-usart";
+ status = "okay";
+ current-speed = <115200>;
+ pinctrl-0 = <&pinmux_flexcomm3_usart>;
+ pinctrl-names = "default";
+};
diff --git a/examples/all-clusters-app/nxp/zephyr/boards/rd_rw612_bga_fdata.conf b/examples/all-clusters-app/nxp/zephyr/boards/rd_rw612_bga_fdata.conf
new file mode 100644
index 00000000000000..73d139c3948d95
--- /dev/null
+++ b/examples/all-clusters-app/nxp/zephyr/boards/rd_rw612_bga_fdata.conf
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2023-2024 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.
+#
+
+CONFIG_SETTINGS_NVS_SECTOR_COUNT=16
+
+# 0xA226
+CONFIG_CHIP_DEVICE_PRODUCT_ID=41510
+CONFIG_CHIP_DEVICE_PRODUCT_URL="https://www.nxp.com/products/wireless-connectivity/wi-fi-plus-bluetooth-plus-802-15-4/wireless-mcu-with-integrated-tri-radio-1x1-wi-fi-6-plus-bluetooth-low-energy-5-3-802-15-4:RW612"
+CONFIG_CHIP_DEVICE_PRODUCT_LABEL="RW612"
+CONFIG_CHIP_DEVICE_PART_NUMBER="RW612"
diff --git a/examples/all-clusters-app/nxp/zephyr/main/include/CHIPProjectConfig.h b/examples/all-clusters-app/nxp/zephyr/main/include/CHIPProjectConfig.h
new file mode 100644
index 00000000000000..f6c88ccef18162
--- /dev/null
+++ b/examples/all-clusters-app/nxp/zephyr/main/include/CHIPProjectConfig.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2023-2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+/**
+ * @file
+ * Example project configuration file for CHIP.
+ *
+ * This is a place to put application or project-specific overrides
+ * to the default configuration values for general CHIP features.
+ *
+ */
+
+#pragma once
+
+// All clusters app has 3 group endpoints. This needs to defined here so that
+// CHIP_CONFIG_MAX_GROUPS_PER_FABRIC is properly configured.
+#define CHIP_CONFIG_MAX_GROUP_ENDPOINTS_PER_FABRIC 3
diff --git a/examples/all-clusters-app/nxp/zephyr/main/main.cpp b/examples/all-clusters-app/nxp/zephyr/main/main.cpp
new file mode 100644
index 00000000000000..9be47dfe0a95d8
--- /dev/null
+++ b/examples/all-clusters-app/nxp/zephyr/main/main.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2023-2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include "AppTask.h"
+
+#include
+
+LOG_MODULE_REGISTER(app, CONFIG_CHIP_APP_LOG_LEVEL);
+
+using namespace ::chip;
+
+int main()
+{
+ CHIP_ERROR err = CHIP_NO_ERROR;
+
+ if (err == CHIP_NO_ERROR)
+ {
+ err = chip::NXP::App::GetAppTask().Start();
+ }
+
+ LOG_ERR("Exited with code %" CHIP_ERROR_FORMAT, err.Format());
+ return err == CHIP_NO_ERROR ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/examples/all-clusters-app/nxp/zephyr/prj.conf b/examples/all-clusters-app/nxp/zephyr/prj.conf
new file mode 100644
index 00000000000000..936bc5984f4f35
--- /dev/null
+++ b/examples/all-clusters-app/nxp/zephyr/prj.conf
@@ -0,0 +1,59 @@
+#
+# Copyright (c) 2023-2024 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.
+#
+
+# This sample uses Kconfig.defaults to set options common for all
+# samples. This file should contain only options specific for this sample
+# or overrides of default values.
+
+# Enable CHIP
+CONFIG_CHIP=y
+CONFIG_STD_CPP17=y
+CONFIG_CHIP_PROJECT_CONFIG="main/include/CHIPProjectConfig.h"
+CONFIG_CHIP_ENABLE_PAIRING_AUTOSTART=y
+# CHIP PID: 32769 == 0x8001 (all-clusters-app)
+CONFIG_CHIP_DEVICE_PRODUCT_ID=32769
+CONFIG_CHIP_DEVICE_PRODUCT_NAME="All Clusters"
+CONFIG_CHIP_DEVICE_DISCRIMINATOR=0x800
+
+# Enable MbedTLS PSA - heavily experimental, not thread safe yet
+# CONFIG_CHIP_CRYPTO_PSA=y
+
+# Bluetooth overrides
+CONFIG_BT_DEVICE_NAME="NXPAllClusters"
+
+# Additional configs for debbugging experience.
+CONFIG_THREAD_NAME=y
+CONFIG_MPU_STACK_GUARD=y
+
+CONFIG_DEBUG=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_THREAD_INFO=y
+# use this config if stepping during debug session is not consistent
+# CONFIG_NO_OPTIMIZATIONS=y
+CONFIG_EXCEPTION_STACK_TRACE=y
+CONFIG_ASSERT=y
+# by default west will generate the full assembly output, which can take several minutes when binaries are large
+CONFIG_OUTPUT_DISASSEMBLY=n
+# embedded thread analyzer with thread statistics (stack usage, cpu usage...)
+# CONFIG_THREAD_ANALYZER=y
+# CONFIG_THREAD_ANALYZER_USE_PRINTK=y
+# CONFIG_THREAD_ANALYZER_AUTO=y
+
+# enable Matter CLI
+CONFIG_CHIP_LIB_SHELL=y
+# enable NET commands if desired
+#CONFIG_NET_SHELL=y
+CONFIG_CHIP_STATISTICS=y
diff --git a/examples/all-clusters-app/nxp/zephyr/prj_fdata.conf b/examples/all-clusters-app/nxp/zephyr/prj_fdata.conf
new file mode 100644
index 00000000000000..a82618a5f46078
--- /dev/null
+++ b/examples/all-clusters-app/nxp/zephyr/prj_fdata.conf
@@ -0,0 +1,80 @@
+#
+# Copyright (c) 2023-2024 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.
+#
+
+# This sample uses Kconfig.defaults to set options common for all
+# samples. This file should contain only options specific for this sample
+# or overrides of default values.
+
+# Enable CHIP
+CONFIG_CHIP=y
+CONFIG_STD_CPP17=y
+CONFIG_CHIP_PROJECT_CONFIG="main/include/CHIPProjectConfig.h"
+CONFIG_CHIP_ENABLE_PAIRING_AUTOSTART=y
+
+# Enable MbedTLS PSA - heavily experimental, not thread safe yet
+# CONFIG_CHIP_CRYPTO_PSA=y
+
+# Bluetooth overrides
+CONFIG_BT_DEVICE_NAME="NXPAllClusters"
+
+# enable Matter CLI
+CONFIG_CHIP_LIB_SHELL=y
+CONFIG_CHIP_STATISTICS=y
+
+# Factory data configuration
+CONFIG_CHIP_DEVICE_VENDOR_ID=4151
+CONFIG_CHIP_DEVICE_DISCRIMINATOR=0xA00
+CONFIG_CHIP_DEVICE_SPAKE2_PASSCODE=14014
+CONFIG_CHIP_DEVICE_PRODUCT_NAME="All Clusters"
+CONFIG_CHIP_DEVICE_TYPE=115
+CONFIG_CHIP_DEVICE_MANUFACTURING_DATE="2023-01-01"
+CONFIG_CHIP_DEVICE_SERIAL_NUMBER="12345678"
+CONFIG_CHIP_DEVICE_PRODUCT_COLOR="Green"
+CONFIG_CHIP_DEVICE_PRODUCT_FINISH="Matte"
+
+# Use factory data provider for device info
+CONFIG_CHIP_FACTORY_DATA=y
+# Generate factor data raw binary during the build process
+# CONFIG_CHIP_FACTORY_DATA_BUILD=y
+# Generate test certificates for factory data during the build process
+# CONFIG_CHIP_FACTORY_DATA_CERT_SOURCE_GENERATED=y
+# Spake2p verifier will be generated during factory data generation
+# CONFIG_CHIP_FACTORY_DATA_GENERATE_SPAKE2_VERIFIER=y
+
+# Example of using pre-generated certificates
+# CONFIG_CHIP_FACTORY_DATA_CERT_SOURCE_USER=y
+# CONFIG_CHIP_FACTORY_DATA_USER_CERTS_CD_CERT="/Chip-Test-CD-1037-A226.der"
+# CONFIG_CHIP_FACTORY_DATA_USER_CERTS_DAC_CERT="/Chip-DAC-NXP-1037-A226-Cert.der"
+# CONFIG_CHIP_FACTORY_DATA_USER_CERTS_DAC_KEY="/Chip-DAC-NXP-1037-A226-Key.der"
+# CONFIG_CHIP_FACTORY_DATA_USER_CERTS_PAI_CERT="/Chip-PAI-NXP-1037-A226-Cert.der"
+
+# Additional configs for debbugging experience.
+CONFIG_THREAD_NAME=y
+CONFIG_MPU_STACK_GUARD=y
+
+CONFIG_DEBUG=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_THREAD_INFO=y
+# use this config if stepping during debug session is not consistent
+# CONFIG_NO_OPTIMIZATIONS=y
+CONFIG_EXCEPTION_STACK_TRACE=y
+CONFIG_ASSERT=y
+# by default west will generate the full assembly output, which can take several minutes when binaries are large
+CONFIG_OUTPUT_DISASSEMBLY=n
+# embedded thread analyzer with thread statistics (stack usage, cpu usage...)
+# CONFIG_THREAD_ANALYZER=y
+# CONFIG_THREAD_ANALYZER_USE_PRINTK=y
+# CONFIG_THREAD_ANALYZER_AUTO=y
diff --git a/examples/all-clusters-app/nxp/zephyr/prj_ota.conf b/examples/all-clusters-app/nxp/zephyr/prj_ota.conf
new file mode 100644
index 00000000000000..bdc65e94fabf70
--- /dev/null
+++ b/examples/all-clusters-app/nxp/zephyr/prj_ota.conf
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+# All rights reserved.
+#
+# 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.
+#
+
+# Options needed for OTA are located on this file
+# This file should contain only options specific for this sample
+# or overrides the default ones.
+
+CONFIG_CHIP_OTA_REQUESTOR=y
+
+# To generate an OTA image based on the application
+CONFIG_CHIP_OTA_IMAGE_BUILD=y
+
+# By default, MCUBOOT bootloader uses a signature key provided in their repository.
+# Change the key to the appropriate one.
+# Note: You need to use the same signature key used by MCUBOOT, i.e BOOT_SIGNATURE_KEY_FILE.
+# Default CONFIG_BOOT_SIGNATURE_KEY_FILE is defined in config/nxp/app/bootloader.conf
+CONFIG_MCUBOOT_SIGNATURE_KEY_FILE="./bootloader/mcuboot/root-rsa-2048.pem"
diff --git a/examples/all-clusters-app/nxp/zephyr/third_party/connectedhomeip b/examples/all-clusters-app/nxp/zephyr/third_party/connectedhomeip
new file mode 120000
index 00000000000000..3efed95be5dbe9
--- /dev/null
+++ b/examples/all-clusters-app/nxp/zephyr/third_party/connectedhomeip
@@ -0,0 +1 @@
+../../../../../
\ No newline at end of file
diff --git a/examples/common/m5stack-tft/repo b/examples/common/m5stack-tft/repo
index d99f5ef8df180a..a6299b6c7c0b2e 160000
--- a/examples/common/m5stack-tft/repo
+++ b/examples/common/m5stack-tft/repo
@@ -1 +1 @@
-Subproject commit d99f5ef8df180ab34b3d9fff6888d5bede7665c5
+Subproject commit a6299b6c7c0b2e3eb62fa08ee4bf7155c39bad1f
diff --git a/examples/common/tracing/decoder/logging/ToCertificateString.cpp b/examples/common/tracing/decoder/logging/ToCertificateString.cpp
index 423544a9cc2a0c..1abd27ef788c59 100644
--- a/examples/common/tracing/decoder/logging/ToCertificateString.cpp
+++ b/examples/common/tracing/decoder/logging/ToCertificateString.cpp
@@ -35,7 +35,7 @@ const char * ToCertificate(const chip::ByteSpan & source, chip::MutableCharSpan
{
// Reset the buffer
memset(destination.data(), '\0', destination.size());
-
+ int snprintf_len = 0;
if (source.size() == 0)
{
return destination.data();
@@ -70,7 +70,8 @@ const char * ToCertificate(const chip::ByteSpan & source, chip::MutableCharSpan
ChipLogError(DataManagement, "Certificate size is greater than 400 bytes");
}
- snprintf(destination.data(), destination.size(), "%s", str.Get());
+ snprintf_len = snprintf(destination.data(), destination.size(), "%s", str.Get());
+ VerifyOrExit(snprintf_len >= 0, ChipLogError(DataManagement, "Failed to write certificate"););
}
else
{
@@ -83,15 +84,23 @@ const char * ToCertificate(const chip::ByteSpan & source, chip::MutableCharSpan
size_t inIndex = 0;
size_t outIndex = strlen(header) + 1;
- snprintf(destination.data(), destination.size(), "%s\n", header);
+ snprintf_len = snprintf(destination.data(), destination.size(), "%s\n", header);
+ VerifyOrExit(snprintf_len >= 0, ChipLogError(DataManagement, "Failed to write header"););
for (; inIndex < base64DataLen; inIndex += 64)
{
- auto charsPrinted = snprintf(&destination.data()[outIndex], destination.size() - outIndex, "%.64s\n", &str[inIndex]);
- outIndex += static_cast(charsPrinted);
+ snprintf_len = snprintf(&destination.data()[outIndex], destination.size() - outIndex, "%.64s\n", &str[inIndex]);
+ VerifyOrExit(snprintf_len >= 0, ChipLogError(DataManagement, "Failed to write certificate"););
+
+ outIndex += static_cast(snprintf_len);
}
- snprintf(&destination.data()[outIndex], destination.size() - outIndex, "%s", footer);
+ snprintf_len = snprintf(&destination.data()[outIndex], destination.size() - outIndex, "%s", footer);
+ VerifyOrExit(snprintf_len >= 0, ChipLogError(DataManagement, "Failed to write footer"););
+ }
+exit:
+ if (snprintf_len < 0)
+ {
+ memset(destination.data(), '\0', destination.size());
}
-
return destination.data();
}
diff --git a/examples/darwin-framework-tool/commands/common/CHIPCommandBridge.h b/examples/darwin-framework-tool/commands/common/CHIPCommandBridge.h
index 7dc5b848e22324..6cb580ded9c35f 100644
--- a/examples/darwin-framework-tool/commands/common/CHIPCommandBridge.h
+++ b/examples/darwin-framework-tool/commands/common/CHIPCommandBridge.h
@@ -39,7 +39,7 @@ class CHIPCommandBridge : public Command {
{
AddArgument("commissioner-name", &mCommissionerName);
AddArgument("commissioner-nodeId", 0, UINT64_MAX, &mCommissionerNodeId,
- "Sets the commisser node ID of the given "
+ "Sets the commissioner node ID of the given "
"commissioner-name. Interactive mode will only set a single commissioner on the inital command. "
"The commissioner node ID will be persisted until a different one is specified.");
AddArgument("paa-trust-store-path", &mPaaTrustStorePath,
diff --git a/examples/darwin-framework-tool/commands/pairing/DeviceControllerDelegateBridge.mm b/examples/darwin-framework-tool/commands/pairing/DeviceControllerDelegateBridge.mm
index 9723199ed007a4..52f0fd4bb10a17 100644
--- a/examples/darwin-framework-tool/commands/pairing/DeviceControllerDelegateBridge.mm
+++ b/examples/darwin-framework-tool/commands/pairing/DeviceControllerDelegateBridge.mm
@@ -36,7 +36,7 @@ - (void)controller:(MTRDeviceController *)controller statusUpdate:(MTRCommission
ChipLogError(chipTool, "MTRCommissioningStatusDiscoveringMoreDevices: This should not happen.");
break;
case MTRCommissioningStatusUnknown:
- ChipLogError(chipTool, "Uknown Pairing Status");
+ ChipLogError(chipTool, "Unknown Pairing Status");
break;
}
}
diff --git a/examples/fabric-admin/rpc/RpcClient.cpp b/examples/fabric-admin/rpc/RpcClient.cpp
index f03c4f3f699838..00ca1204cc1f19 100644
--- a/examples/fabric-admin/rpc/RpcClient.cpp
+++ b/examples/fabric-admin/rpc/RpcClient.cpp
@@ -19,9 +19,11 @@
#include "RpcClient.h"
#include "RpcClientProcessor.h"
+#include
+#include
+#include
#include
#include
-#include
#include "fabric_bridge_service/fabric_bridge_service.rpc.pb.h"
#include "pw_assert/check.h"
@@ -36,16 +38,45 @@ using namespace chip;
namespace {
// Constants
+constexpr uint32_t kRpcTimeoutMs = 1000;
constexpr uint32_t kDefaultChannelId = 1;
// Fabric Bridge Client
rpc::pw_rpc::nanopb::FabricBridge::Client fabricBridgeClient(rpc::client::GetDefaultRpcClient(), kDefaultChannelId);
-pw::rpc::NanopbUnaryReceiver<::pw_protobuf_Empty> addSynchronizedDeviceCall;
-pw::rpc::NanopbUnaryReceiver<::pw_protobuf_Empty> removeSynchronizedDeviceCall;
+
+std::mutex responseMutex;
+std::condition_variable responseCv;
+bool responseReceived = false;
+CHIP_ERROR responseError = CHIP_NO_ERROR;
+
+// By passing the `call` parameter into WaitForResponse we are explicitly trying to insure the caller takes into consideration that
+// the lifetime of the `call` object when calling WaitForResponse
+template
+CHIP_ERROR WaitForResponse(CallType & call)
+{
+ std::unique_lock lock(responseMutex);
+ responseReceived = false;
+ responseError = CHIP_NO_ERROR;
+
+ if (responseCv.wait_for(lock, std::chrono::milliseconds(kRpcTimeoutMs), [] { return responseReceived; }))
+ {
+ return responseError;
+ }
+ else
+ {
+ fprintf(stderr, "RPC Response timed out!");
+ return CHIP_ERROR_TIMEOUT;
+ }
+}
// Callback function to be called when the RPC response is received
void OnAddDeviceResponseCompleted(const pw_protobuf_Empty & response, pw::Status status)
{
+ std::lock_guard lock(responseMutex);
+ responseReceived = true;
+ responseError = status.ok() ? CHIP_NO_ERROR : CHIP_ERROR_INTERNAL;
+ responseCv.notify_one();
+
if (status.ok())
{
ChipLogProgress(NotSpecified, "AddSynchronizedDevice RPC call succeeded!");
@@ -59,6 +90,11 @@ void OnAddDeviceResponseCompleted(const pw_protobuf_Empty & response, pw::Status
// Callback function to be called when the RPC response is received
void OnRemoveDeviceResponseCompleted(const pw_protobuf_Empty & response, pw::Status status)
{
+ std::lock_guard lock(responseMutex);
+ responseReceived = true;
+ responseError = status.ok() ? CHIP_NO_ERROR : CHIP_ERROR_INTERNAL;
+ responseCv.notify_one();
+
if (status.ok())
{
ChipLogProgress(NotSpecified, "RemoveSynchronizedDevice RPC call succeeded!");
@@ -81,52 +117,38 @@ CHIP_ERROR AddSynchronizedDevice(chip::NodeId nodeId)
{
ChipLogProgress(NotSpecified, "AddSynchronizedDevice");
- if (addSynchronizedDeviceCall.active())
- {
- ChipLogError(NotSpecified, "Add Synchronized Device operation is in progress\n");
- return CHIP_ERROR_BUSY;
- }
-
chip_rpc_SynchronizedDevice device;
device.node_id = nodeId;
- // By assigning the returned call to the global 'addSynchronizedDeviceCall', the RPC
- // call is kept alive until it completes. When a response is received, it
- // will be logged by the handler function and the call will complete.
- addSynchronizedDeviceCall = fabricBridgeClient.AddSynchronizedDevice(device, OnAddDeviceResponseCompleted);
+ // The RPC call is kept alive until it completes. When a response is received, it will be logged by the handler
+ // function and the call will complete.
+ auto call = fabricBridgeClient.AddSynchronizedDevice(device, OnAddDeviceResponseCompleted);
- if (!addSynchronizedDeviceCall.active())
+ if (!call.active())
{
// The RPC call was not sent. This could occur due to, for example, an invalid channel ID. Handle if necessary.
return CHIP_ERROR_INTERNAL;
}
- return CHIP_NO_ERROR;
+ return WaitForResponse(call);
}
CHIP_ERROR RemoveSynchronizedDevice(chip::NodeId nodeId)
{
ChipLogProgress(NotSpecified, "RemoveSynchronizedDevice");
- if (removeSynchronizedDeviceCall.active())
- {
- ChipLogError(NotSpecified, "Remove Synchronized Device operation is in progress\n");
- return CHIP_ERROR_BUSY;
- }
-
chip_rpc_SynchronizedDevice device;
device.node_id = nodeId;
- // By assigning the returned call to the global 'removeSynchronizedDeviceCall', the RPC
- // call is kept alive until it completes. When a response is received, it
- // will be logged by the handler function and the call will complete.
- removeSynchronizedDeviceCall = fabricBridgeClient.RemoveSynchronizedDevice(device, OnRemoveDeviceResponseCompleted);
+ // The RPC call is kept alive until it completes. When a response is received, it will be logged by the handler
+ // function and the call will complete.
+ auto call = fabricBridgeClient.RemoveSynchronizedDevice(device, OnRemoveDeviceResponseCompleted);
- if (!removeSynchronizedDeviceCall.active())
+ if (!call.active())
{
// The RPC call was not sent. This could occur due to, for example, an invalid channel ID. Handle if necessary.
return CHIP_ERROR_INTERNAL;
}
- return CHIP_NO_ERROR;
+ return WaitForResponse(call);
}
diff --git a/examples/fabric-admin/rpc/RpcClient.h b/examples/fabric-admin/rpc/RpcClient.h
index eb28c19bee7d3e..a1754b3846d508 100644
--- a/examples/fabric-admin/rpc/RpcClient.h
+++ b/examples/fabric-admin/rpc/RpcClient.h
@@ -41,7 +41,7 @@ CHIP_ERROR InitRpcClient(uint16_t rpcServerPort);
*
* @param nodeId The Node ID of the device to be added.
* @return CHIP_ERROR An error code indicating the success or failure of the operation.
- * - CHIP_NO_ERROR: The RPC command was successfully sent.
+ * - CHIP_NO_ERROR: The RPC command was successfully processed.
* - CHIP_ERROR_BUSY: Another operation is currently in progress.
* - CHIP_ERROR_INTERNAL: An internal error occurred while activating the RPC call.
*/
@@ -56,7 +56,7 @@ CHIP_ERROR AddSynchronizedDevice(chip::NodeId nodeId);
*
* @param nodeId The Node ID of the device to be removed.
* @return CHIP_ERROR An error code indicating the success or failure of the operation.
- * - CHIP_NO_ERROR: The RPC command was successfully sent.
+ * - CHIP_NO_ERROR: The RPC command was successfully processed.
* - CHIP_ERROR_BUSY: Another operation is currently in progress.
* - CHIP_ERROR_INTERNAL: An internal error occurred while activating the RPC call.
*/
diff --git a/examples/fabric-admin/scripts/run_fabric_sink.sh b/examples/fabric-admin/scripts/run_fabric_sink.sh
new file mode 100755
index 00000000000000..3013965479268a
--- /dev/null
+++ b/examples/fabric-admin/scripts/run_fabric_sink.sh
@@ -0,0 +1,78 @@
+#!/bin/bash
+
+# Default paths
+DEFAULT_CHOICES=(
+ "./fabric-admin"
+ "out/debug/standalone/fabric-admin"
+ "out/linux-x64-fabric-admin/fabric-admin"
+ "out/darwin-arm64-fabric-admin/fabric-admin"
+)
+FABRIC_ADMIN_LOG="/tmp/fabric_admin.log"
+FABRIC_ADMIN_PATH=""
+
+# Function to find fabric-admin binary
+find_fabric_admin() {
+ local choices=("$@")
+ for path in "${choices[@]}"; do
+ if [[ -e "$path" ]]; then
+ echo "$path"
+ return 0
+ fi
+ done
+ return 1
+}
+
+# Parse arguments
+VERBOSE=false
+SPECIFIED_PATH=""
+
+for arg in "$@"; do
+ case $arg in
+ --verbose)
+ VERBOSE=true
+ ;;
+ --path=*)
+ SPECIFIED_PATH="${arg#*=}"
+ ;;
+ esac
+done
+
+# Use specified path if provided
+if [[ -n "$SPECIFIED_PATH" ]]; then
+ if [[ -e "$SPECIFIED_PATH" ]]; then
+ FABRIC_ADMIN_PATH="$SPECIFIED_PATH"
+ else
+ echo >&2 "Specified path does not exist: $SPECIFIED_PATH"
+ exit 1
+ fi
+else
+ FABRIC_ADMIN_PATH=$(find_fabric_admin "${DEFAULT_CHOICES[@]}")
+ if [[ $? -ne 0 ]]; then
+ echo >&2 "Could not find the fabric-admin binary"
+ exit 1
+ fi
+fi
+
+echo "PATH IS: $FABRIC_ADMIN_PATH"
+
+# Kill fabric-admin if it is running
+echo "Checking for running fabric-admin process..."
+fabric_admin_pid=$(pgrep -f "$FABRIC_ADMIN_PATH")
+if [[ -n "$fabric_admin_pid" ]]; then
+ echo "Found fabric-admin with PID $fabric_admin_pid, attempting to kill..."
+ kill -9 "$fabric_admin_pid"
+ echo "Killed fabric-admin with PID $fabric_admin_pid"
+fi
+
+# Remove /tmp/chip_* files and directories
+echo "Removing /tmp/chip_* files and directories..."
+sudo rm -rf /tmp/chip_*
+echo "Removed /tmp/chip_* files and directories"
+
+# Start fabric-admin with or without log file path based on --verbose option
+echo "Starting fabric-admin..."
+if [ "$VERBOSE" = true ]; then
+ "$FABRIC_ADMIN_PATH"
+else
+ "$FABRIC_ADMIN_PATH" --log-file-path "$FABRIC_ADMIN_LOG"
+fi
diff --git a/examples/fabric-admin/scripts/run_fabric_source.sh b/examples/fabric-admin/scripts/run_fabric_source.sh
new file mode 100755
index 00000000000000..95df7a135bb596
--- /dev/null
+++ b/examples/fabric-admin/scripts/run_fabric_source.sh
@@ -0,0 +1,116 @@
+#!/bin/bash
+
+# Get the path to the current script
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+
+# Default paths
+DEFAULT_ADMIN_CHOICES=(
+ "./fabric-admin"
+ "out/debug/standalone/fabric-admin"
+ "out/linux-x64-fabric-admin/fabric-admin"
+ "out/darwin-arm64-fabric-admin/fabric-admin"
+)
+DEFAULT_BRIDGE_CHOICES=(
+ "./fabric-bridge-app"
+ "out/debug/standalone/fabric-bridge-app"
+ "out/linux-x64-fabric-bridge-app/fabric-bridge-app"
+ "out/darwin-arm64-fabric-bridge-app/fabric-bridge-app"
+)
+FABRIC_ADMIN_LOG="/tmp/fabric_admin.log"
+FABRIC_BRIDGE_APP_LOG="/tmp/fabric_bridge_app.log"
+FABRIC_ADMIN_PATH=""
+FABRIC_BRIDGE_APP_PATH=""
+
+# Function to find a binary
+find_binary() {
+ local choices=("$@")
+ for path in "${choices[@]}"; do
+ if [[ -e "$path" ]]; then
+ echo "$path"
+ return 0
+ fi
+ done
+ return 1
+}
+
+# Parse arguments
+VERBOSE=false
+SPECIFIED_ADMIN_PATH=""
+SPECIFIED_BRIDGE_PATH=""
+
+for arg in "$@"; do
+ case $arg in
+ --verbose)
+ VERBOSE=true
+ ;;
+ --admin-path=*)
+ SPECIFIED_ADMIN_PATH="${arg#*=}"
+ ;;
+ --bridge-path=*)
+ SPECIFIED_BRIDGE_PATH="${arg#*=}"
+ ;;
+ esac
+done
+
+# Use specified paths if provided
+if [[ -n "$SPECIFIED_ADMIN_PATH" ]]; then
+ if [[ -e "$SPECIFIED_ADMIN_PATH" ]]; then
+ FABRIC_ADMIN_PATH="$SPECIFIED_ADMIN_PATH"
+ else
+ echo >&2 "Specified admin path does not exist: $SPECIFIED_ADMIN_PATH"
+ exit 1
+ fi
+else
+ FABRIC_ADMIN_PATH=$(find_binary "${DEFAULT_ADMIN_CHOICES[@]}")
+ if [[ $? -ne 0 ]]; then
+ echo >&2 "Could not find the fabric-admin binary"
+ exit 1
+ fi
+fi
+
+if [[ -n "$SPECIFIED_BRIDGE_PATH" ]]; then
+ if [[ -e "$SPECIFIED_BRIDGE_PATH" ]]; then
+ FABRIC_BRIDGE_APP_PATH="$SPECIFIED_BRIDGE_PATH"
+ else
+ echo >&2 "Specified bridge path does not exist: $SPECIFIED_BRIDGE_PATH"
+ exit 1
+ fi
+else
+ FABRIC_BRIDGE_APP_PATH=$(find_binary "${DEFAULT_BRIDGE_CHOICES[@]}")
+ if [[ $? -ne 0 ]]; then
+ echo >&2 "Could not find the fabric-bridge-app binary"
+ exit 1
+ fi
+fi
+
+echo "Admin path: $FABRIC_ADMIN_PATH"
+echo "Bridge path: $FABRIC_BRIDGE_APP_PATH"
+
+# Determine the path to stop_fabric_source.sh based on the location of run_fabric_source.sh
+RUN_FABRIC_SOURCE_PATH=$(find_binary "$SCRIPT_DIR/run_fabric_source.sh")
+if [[ $? -ne 0 ]]; then
+ echo >&2 "Could not find the run_fabric_source.sh script"
+ exit 1
+fi
+STOP_FABRIC_SOURCE_PATH="${RUN_FABRIC_SOURCE_PATH/run_fabric_source/stop_fabric_source}"
+
+# Stop any running instances and clean up
+if [[ -e "$STOP_FABRIC_SOURCE_PATH" ]]; then
+ "$STOP_FABRIC_SOURCE_PATH"
+else
+ echo >&2 "Could not find the stop_fabric_source.sh script"
+ exit 1
+fi
+
+# Start fabric-bridge-app if available and redirect its output to /dev/null
+if [ -f "$FABRIC_BRIDGE_APP_PATH" ]; then
+ "$FABRIC_BRIDGE_APP_PATH" >"$FABRIC_BRIDGE_APP_LOG" 2>&1 &
+ echo "Started fabric-bridge-app"
+fi
+
+# Start fabric-admin with or without log file path based on --verbose option
+if [ "$VERBOSE" = true ]; then
+ "$FABRIC_ADMIN_PATH"
+else
+ "$FABRIC_ADMIN_PATH" --log-file-path "$FABRIC_ADMIN_LOG"
+fi
diff --git a/examples/fabric-admin/scripts/stop_fabric_source.sh b/examples/fabric-admin/scripts/stop_fabric_source.sh
new file mode 100755
index 00000000000000..85fff9e3a878cc
--- /dev/null
+++ b/examples/fabric-admin/scripts/stop_fabric_source.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+FABRIC_ADMIN_PATH="/fabric-admin"
+FABRIC_BRIDGE_APP_PATH="/fabric-bridge-app"
+
+# Kill fabric-admin if it is running
+fabric_admin_pid=$(pgrep -f "$FABRIC_ADMIN_PATH")
+if [ ! -z "$fabric_admin_pid" ]; then
+ kill -9 "$fabric_admin_pid"
+ echo "Killed fabric-admin with PID $fabric_admin_pid"
+fi
+
+# Kill fabric-bridge-app if it is running
+fabric_bridge_app_pid=$(pgrep -f "$FABRIC_BRIDGE_APP_PATH")
+if [ ! -z "$fabric_bridge_app_pid" ]; then
+ kill -9 "$fabric_bridge_app_pid"
+ echo "Killed fabric-bridge-app with PID $fabric_bridge_app_pid"
+fi
+
+# Remove /tmp/chip_* files and directories
+sudo rm -rf /tmp/chip_*
+echo "Removed /tmp/chip_* files and directories"
diff --git a/examples/fabric-bridge-app/fabric-bridge-common/BUILD.gn b/examples/fabric-bridge-app/fabric-bridge-common/BUILD.gn
index 70d9586b699c0f..3bc4c23b9e0f92 100644
--- a/examples/fabric-bridge-app/fabric-bridge-common/BUILD.gn
+++ b/examples/fabric-bridge-app/fabric-bridge-common/BUILD.gn
@@ -13,13 +13,32 @@
# limitations under the License.
import("//build_overrides/chip.gni")
-
import("${chip_root}/src/app/chip_data_model.gni")
+config("config") {
+ include_dirs = [ "include" ]
+}
+
chip_data_model("fabric-bridge-common") {
zap_file = "fabric-bridge-app.zap"
-
is_server = true
-
cflags = [ "-DDYNAMIC_ENDPOINT_COUNT=16" ]
}
+
+source_set("fabric-bridge-lib") {
+ public_configs = [ ":config" ]
+
+ sources = [
+ "include/CHIPProjectAppConfig.h",
+ "include/Device.h",
+ "include/DeviceManager.h",
+ "src/Device.cpp",
+ "src/DeviceManager.cpp",
+ "src/ZCLCallbacks.cpp",
+ ]
+
+ deps = [
+ "${chip_root}/examples/fabric-bridge-app/fabric-bridge-common",
+ "${chip_root}/src/lib",
+ ]
+}
diff --git a/examples/fabric-bridge-app/linux/include/Device.h b/examples/fabric-bridge-app/fabric-bridge-common/include/Device.h
similarity index 100%
rename from examples/fabric-bridge-app/linux/include/Device.h
rename to examples/fabric-bridge-app/fabric-bridge-common/include/Device.h
diff --git a/examples/fabric-bridge-app/linux/include/DeviceManager.h b/examples/fabric-bridge-app/fabric-bridge-common/include/DeviceManager.h
similarity index 100%
rename from examples/fabric-bridge-app/linux/include/DeviceManager.h
rename to examples/fabric-bridge-app/fabric-bridge-common/include/DeviceManager.h
diff --git a/examples/fabric-bridge-app/linux/Device.cpp b/examples/fabric-bridge-app/fabric-bridge-common/src/Device.cpp
similarity index 100%
rename from examples/fabric-bridge-app/linux/Device.cpp
rename to examples/fabric-bridge-app/fabric-bridge-common/src/Device.cpp
diff --git a/examples/fabric-bridge-app/linux/DeviceManager.cpp b/examples/fabric-bridge-app/fabric-bridge-common/src/DeviceManager.cpp
similarity index 100%
rename from examples/fabric-bridge-app/linux/DeviceManager.cpp
rename to examples/fabric-bridge-app/fabric-bridge-common/src/DeviceManager.cpp
diff --git a/examples/fabric-bridge-app/fabric-bridge-common/src/ZCLCallbacks.cpp b/examples/fabric-bridge-app/fabric-bridge-common/src/ZCLCallbacks.cpp
new file mode 100644
index 00000000000000..7a9521fa7820a7
--- /dev/null
+++ b/examples/fabric-bridge-app/fabric-bridge-common/src/ZCLCallbacks.cpp
@@ -0,0 +1,92 @@
+/*
+ *
+ * Copyright (c) 2024 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.
+ */
+
+#include "DeviceManager.h"
+
+#include
+#include
+#include
+#include
+
+using namespace ::chip;
+using namespace ::chip::app::Clusters;
+
+#define ZCL_DESCRIPTOR_CLUSTER_REVISION (1u)
+#define ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_REVISION (2u)
+#define ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_FEATURE_MAP (0u)
+
+// External attribute read callback function
+Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId,
+ const EmberAfAttributeMetadata * attributeMetadata,
+ uint8_t * buffer, uint16_t maxReadLength)
+{
+ uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint);
+ AttributeId attributeId = attributeMetadata->attributeId;
+
+ Device * dev = DeviceMgr().GetDevice(endpointIndex);
+ if (dev != nullptr && clusterId == app::Clusters::BridgedDeviceBasicInformation::Id)
+ {
+ using namespace app::Clusters::BridgedDeviceBasicInformation::Attributes;
+ ChipLogProgress(NotSpecified, "HandleReadBridgedDeviceBasicAttribute: attrId=%d, maxReadLength=%d", attributeId,
+ maxReadLength);
+
+ if ((attributeId == Reachable::Id) && (maxReadLength == 1))
+ {
+ *buffer = dev->IsReachable() ? 1 : 0;
+ }
+ else if ((attributeId == NodeLabel::Id) && (maxReadLength == 32))
+ {
+ MutableByteSpan zclNameSpan(buffer, maxReadLength);
+ MakeZclCharString(zclNameSpan, dev->GetName());
+ }
+ else if ((attributeId == ClusterRevision::Id) && (maxReadLength == 2))
+ {
+ uint16_t rev = ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_REVISION;
+ memcpy(buffer, &rev, sizeof(rev));
+ }
+ else if ((attributeId == FeatureMap::Id) && (maxReadLength == 4))
+ {
+ uint32_t featureMap = ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_FEATURE_MAP;
+ memcpy(buffer, &featureMap, sizeof(featureMap));
+ }
+ else
+ {
+ return Protocols::InteractionModel::Status::Failure;
+ }
+ return Protocols::InteractionModel::Status::Success;
+ }
+
+ return Protocols::InteractionModel::Status::Failure;
+}
+
+// External attribute write callback function
+Protocols::InteractionModel::Status emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId,
+ const EmberAfAttributeMetadata * attributeMetadata,
+ uint8_t * buffer)
+{
+ uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint);
+ Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Failure;
+
+ Device * dev = DeviceMgr().GetDevice(endpointIndex);
+ if (dev != nullptr && dev->IsReachable())
+ {
+ ChipLogProgress(NotSpecified, "emberAfExternalAttributeWriteCallback: ep=%d, clusterId=%d", endpoint, clusterId);
+ ret = Protocols::InteractionModel::Status::Success;
+ }
+
+ return ret;
+}
diff --git a/examples/fabric-bridge-app/linux/BUILD.gn b/examples/fabric-bridge-app/linux/BUILD.gn
index 2b408d52625fea..d0f60f30fbb2b9 100644
--- a/examples/fabric-bridge-app/linux/BUILD.gn
+++ b/examples/fabric-bridge-app/linux/BUILD.gn
@@ -33,15 +33,12 @@ if (bridge_enable_pw_rpc) {
executable("fabric-bridge-app") {
sources = [
"${chip_root}/examples/fabric-bridge-app/fabric-bridge-common/include/CHIPProjectAppConfig.h",
- "Device.cpp",
- "DeviceManager.cpp",
- "include/Device.h",
- "include/DeviceManager.h",
"main.cpp",
]
deps = [
"${chip_root}/examples/fabric-bridge-app/fabric-bridge-common",
+ "${chip_root}/examples/fabric-bridge-app/fabric-bridge-common:fabric-bridge-lib",
"${chip_root}/examples/platform/linux:app-main",
"${chip_root}/src/lib",
]
diff --git a/examples/fabric-bridge-app/linux/Dockerfile b/examples/fabric-bridge-app/linux/Dockerfile
deleted file mode 100644
index 5194431decc644..00000000000000
--- a/examples/fabric-bridge-app/linux/Dockerfile
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Copyright (c) 2024 Project CHIP Authors
-# All rights reserved.
-#
-# 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.
-#
-
-ARG VERSION=1
-FROM ghcr.io/project-chip/chip-cirque-device-base:${VERSION}
-LABEL org.opencontainers.image.source https://github.com/project-chip/connectedhomeip
-
-COPY out/debug/chip-bridge-app /usr/bin/
-COPY entrypoint.sh /
-
-ENTRYPOINT ["/entrypoint.sh", "server"]
diff --git a/examples/fabric-bridge-app/linux/RpcClient.cpp b/examples/fabric-bridge-app/linux/RpcClient.cpp
index 815250f12bc328..02916b87aaa06a 100644
--- a/examples/fabric-bridge-app/linux/RpcClient.cpp
+++ b/examples/fabric-bridge-app/linux/RpcClient.cpp
@@ -19,9 +19,11 @@
#include "RpcClient.h"
#include "RpcClientProcessor.h"
+#include
+#include
+#include
#include
#include
-#include
#include "fabric_admin_service/fabric_admin_service.rpc.pb.h"
#include "pw_assert/check.h"
@@ -36,15 +38,45 @@ using namespace chip;
namespace {
// Constants
+constexpr uint32_t kRpcTimeoutMs = 1000;
constexpr uint32_t kDefaultChannelId = 1;
// Fabric Admin Client
rpc::pw_rpc::nanopb::FabricAdmin::Client fabricAdminClient(rpc::client::GetDefaultRpcClient(), kDefaultChannelId);
-pw::rpc::NanopbUnaryReceiver<::chip_rpc_OperationStatus> openCommissioningWindowCall;
+
+std::mutex responseMutex;
+std::condition_variable responseCv;
+bool responseReceived = false;
+CHIP_ERROR responseError = CHIP_NO_ERROR;
+
+// By passing the `call` parameter into WaitForResponse we are explicitly trying to insure the caller takes into consideration that
+// the lifetime of the `call` object when calling WaitForResponse
+template
+CHIP_ERROR WaitForResponse(CallType & call)
+{
+ std::unique_lock lock(responseMutex);
+ responseReceived = false;
+ responseError = CHIP_NO_ERROR;
+
+ if (responseCv.wait_for(lock, std::chrono::milliseconds(kRpcTimeoutMs), [] { return responseReceived; }))
+ {
+ return responseError;
+ }
+ else
+ {
+ ChipLogError(NotSpecified, "RPC Response timed out!");
+ return CHIP_ERROR_TIMEOUT;
+ }
+}
// Callback function to be called when the RPC response is received
void OnOpenCommissioningWindowCompleted(const chip_rpc_OperationStatus & response, pw::Status status)
{
+ std::lock_guard lock(responseMutex);
+ responseReceived = true;
+ responseError = status.ok() ? CHIP_NO_ERROR : CHIP_ERROR_INTERNAL;
+ responseCv.notify_one();
+
if (status.ok())
{
ChipLogProgress(NotSpecified, "OpenCommissioningWindow received operation status: %d", response.success);
@@ -67,22 +99,18 @@ CHIP_ERROR OpenCommissioningWindow(NodeId nodeId)
{
ChipLogProgress(NotSpecified, "OpenCommissioningWindow with Node Id 0x:" ChipLogFormatX64, ChipLogValueX64(nodeId));
- if (openCommissioningWindowCall.active())
- {
- ChipLogError(NotSpecified, "OpenCommissioningWindow is in progress\n");
- return CHIP_ERROR_BUSY;
- }
-
chip_rpc_DeviceInfo device;
device.node_id = nodeId;
- // The RPC will remain active as long as `openCommissioningWindowCall` is alive.
- openCommissioningWindowCall = fabricAdminClient.OpenCommissioningWindow(device, OnOpenCommissioningWindowCompleted);
+ // The RPC call is kept alive until it completes. When a response is received, it will be logged by the handler
+ // function and the call will complete.
+ auto call = fabricAdminClient.OpenCommissioningWindow(device, OnOpenCommissioningWindowCompleted);
- if (!openCommissioningWindowCall.active())
+ if (!call.active())
{
+ // The RPC call was not sent. This could occur due to, for example, an invalid channel ID. Handle if necessary.
return CHIP_ERROR_INTERNAL;
}
- return CHIP_NO_ERROR;
+ return WaitForResponse(call);
}
diff --git a/examples/fabric-bridge-app/linux/include/RpcClient.h b/examples/fabric-bridge-app/linux/include/RpcClient.h
index bd424e9d275910..34fa5c19de9349 100644
--- a/examples/fabric-bridge-app/linux/include/RpcClient.h
+++ b/examples/fabric-bridge-app/linux/include/RpcClient.h
@@ -37,7 +37,7 @@ CHIP_ERROR InitRpcClient(uint16_t rpcServerPort);
*
* @param nodeId The identifier of the node for which the commissioning window should be opened.
* @return CHIP_ERROR An error code indicating the success or failure of the operation.
- * - CHIP_NO_ERROR: The RPC command was successfully sent.
+ * - CHIP_NO_ERROR: The RPC command was successfully processed.
* - CHIP_ERROR_BUSY: Another commissioning window is currently in progress.
* - CHIP_ERROR_INTERNAL: An internal error occurred.
*/
diff --git a/examples/fabric-bridge-app/linux/main.cpp b/examples/fabric-bridge-app/linux/main.cpp
index 2047e15877ee4c..0aa22b8445ee56 100644
--- a/examples/fabric-bridge-app/linux/main.cpp
+++ b/examples/fabric-bridge-app/linux/main.cpp
@@ -23,7 +23,6 @@
#include "DeviceManager.h"
#include
-#include
#if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
#include "RpcClient.h"
@@ -40,10 +39,6 @@ using namespace chip::app;
using namespace chip::app::Clusters;
using namespace chip::app::Clusters::AdministratorCommissioning;
-#define ZCL_DESCRIPTOR_CLUSTER_REVISION (1u)
-#define ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_REVISION (2u)
-#define ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_FEATURE_MAP (0u)
-
namespace {
constexpr uint16_t kPollIntervalMs = 100;
@@ -158,6 +153,8 @@ AdministratorCommissioningCommandHandler gAdministratorCommissioningCommandHandl
void ApplicationInit()
{
+ ChipLogDetail(NotSpecified, "Fabric-Bridge: ApplicationInit()");
+
InteractionModelEngine::GetInstance()->RegisterCommandHandler(&gAdministratorCommissioningCommandHandler);
#if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
@@ -172,7 +169,10 @@ void ApplicationInit()
DeviceMgr().Init();
}
-void ApplicationShutdown() {}
+void ApplicationShutdown()
+{
+ ChipLogDetail(NotSpecified, "Fabric-Bridge: ApplicationShutdown()");
+}
int main(int argc, char * argv[])
{
@@ -185,65 +185,3 @@ int main(int argc, char * argv[])
return 0;
}
-
-// External attribute read callback function
-Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId,
- const EmberAfAttributeMetadata * attributeMetadata,
- uint8_t * buffer, uint16_t maxReadLength)
-{
- uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint);
- AttributeId attributeId = attributeMetadata->attributeId;
-
- Device * dev = DeviceMgr().GetDevice(endpointIndex);
- if (dev != nullptr && clusterId == app::Clusters::BridgedDeviceBasicInformation::Id)
- {
- using namespace app::Clusters::BridgedDeviceBasicInformation::Attributes;
- ChipLogProgress(NotSpecified, "HandleReadBridgedDeviceBasicAttribute: attrId=%d, maxReadLength=%d", attributeId,
- maxReadLength);
-
- if ((attributeId == Reachable::Id) && (maxReadLength == 1))
- {
- *buffer = dev->IsReachable() ? 1 : 0;
- }
- else if ((attributeId == NodeLabel::Id) && (maxReadLength == 32))
- {
- MutableByteSpan zclNameSpan(buffer, maxReadLength);
- MakeZclCharString(zclNameSpan, dev->GetName());
- }
- else if ((attributeId == ClusterRevision::Id) && (maxReadLength == 2))
- {
- uint16_t rev = ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_REVISION;
- memcpy(buffer, &rev, sizeof(rev));
- }
- else if ((attributeId == FeatureMap::Id) && (maxReadLength == 4))
- {
- uint32_t featureMap = ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_FEATURE_MAP;
- memcpy(buffer, &featureMap, sizeof(featureMap));
- }
- else
- {
- return Protocols::InteractionModel::Status::Failure;
- }
- return Protocols::InteractionModel::Status::Success;
- }
-
- return Protocols::InteractionModel::Status::Failure;
-}
-
-// External attribute write callback function
-Protocols::InteractionModel::Status emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId,
- const EmberAfAttributeMetadata * attributeMetadata,
- uint8_t * buffer)
-{
- uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint);
- Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Failure;
-
- Device * dev = DeviceMgr().GetDevice(endpointIndex);
- if (dev != nullptr && dev->IsReachable())
- {
- ChipLogProgress(NotSpecified, "emberAfExternalAttributeWriteCallback: ep=%d, clusterId=%d", endpoint, clusterId);
- ret = Protocols::InteractionModel::Status::Success;
- }
-
- return ret;
-}
diff --git a/examples/laundry-washer-app/nxp/zephyr/.gitignore b/examples/laundry-washer-app/nxp/zephyr/.gitignore
new file mode 100644
index 00000000000000..84c048a73cc2e5
--- /dev/null
+++ b/examples/laundry-washer-app/nxp/zephyr/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/examples/laundry-washer-app/nxp/zephyr/CMakeLists.txt b/examples/laundry-washer-app/nxp/zephyr/CMakeLists.txt
new file mode 100644
index 00000000000000..f7b32881ada959
--- /dev/null
+++ b/examples/laundry-washer-app/nxp/zephyr/CMakeLists.txt
@@ -0,0 +1,116 @@
+#
+# Copyright (c) 2023-2024 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.
+#
+cmake_minimum_required(VERSION 3.13.1)
+
+get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/third_party/connectedhomeip REALPATH)
+get_filename_component(GEN_DIR ${CHIP_ROOT}/zzz_generated/ REALPATH)
+get_filename_component(ALL_CLUSTERS_COMMON_DIR ${CHIP_ROOT}/examples/all-clusters-app/all-clusters-common REALPATH)
+get_filename_component(LAUNDRY_WASHER_NXP_COMMON_DIR ${CHIP_ROOT}/examples/laundry-washer-app/nxp/common REALPATH)
+get_filename_component(EXAMPLE_PLATFORM_NXP_COMMON_DIR ${CHIP_ROOT}/examples/platform/nxp/common REALPATH)
+get_filename_component(EXAMPLE_PLATFORM_NXP_ZEPHYR_DIR ${CHIP_ROOT}/examples/platform/nxp/zephyr REALPATH)
+
+# Perform common operations like detecting extra overlays in the platform folder for the target board
+# This must be called before find_package(Zephyr)
+include(${CHIP_ROOT}/config/nxp/app/pre-zephyr.cmake)
+
+list(APPEND ZEPHYR_EXTRA_MODULES ${CHIP_ROOT}/config/nxp/chip-module)
+find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
+
+# -Wmaybe-uninitialized has too many false positives, including on std::optional
+# and chip::Optional. Make it nonfatal.
+#
+# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80635
+target_compile_options(app PRIVATE -Werror -Wno-error=maybe-uninitialized)
+target_compile_options(app PRIVATE -Werror PRIVATE -Wno-error=format)
+
+project(chip-nxp-all-clusters-app-example)
+
+include(${CHIP_ROOT}/config/nxp/app/enable-gnu-std.cmake)
+include(${CHIP_ROOT}/src/app/chip_data_model.cmake)
+
+target_include_directories(app
+ PRIVATE
+ ${LAUNDRY_WASHER_NXP_COMMON_DIR}/main/include
+ ${LAUNDRY_WASHER_NXP_COMMON_DIR}/Zephyr/include
+ ${ALL_CLUSTERS_COMMON_DIR}/include
+ ${GEN_DIR}/app-common
+ ${GEN_DIR}/all-clusters-app
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/device_manager/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/icd/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/device_callbacks/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/factory_data/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/app_task/include
+)
+
+target_sources(app
+ PRIVATE
+ main/main.cpp
+ ${LAUNDRY_WASHER_NXP_COMMON_DIR}/main/AppTask.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/device_manager/source/CHIPDeviceManager.cpp
+ ${LAUNDRY_WASHER_NXP_COMMON_DIR}/main/DeviceCallbacks.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/device_callbacks/source/CommonDeviceCallbacks.cpp
+ ${LAUNDRY_WASHER_NXP_COMMON_DIR}/main/ZclCallbacks.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/binding-handler.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/app_task/source/AppTaskBase.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/app_task/source/AppTaskZephyr.cpp
+ ${EXAMPLE_PLATFORM_NXP_ZEPHYR_DIR}/factory_data/source/AppFactoryDataExample.cpp
+)
+
+target_compile_definitions(app PUBLIC
+ "EXTERNAL_FACTORY_DATA_PROVIDER_IMPL_HEADER=\"platform/nxp/zephyr/FactoryDataProviderImpl.h\""
+)
+
+if(CONFIG_CHIP_OTA_REQUESTOR)
+ target_sources(app PRIVATE
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/ota_requestor/source/OTARequestorInitiatorCommon.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/ota_requestor/source/OTARequestorInitiatorZephyr.cpp
+ )
+ target_include_directories(app PRIVATE
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/ota_requestor/include/
+ )
+endif()
+
+chip_configure_data_model(app
+ INCLUDE_SERVER
+ ZAP_FILE ${ALL_CLUSTERS_COMMON_DIR}/../../laundry-washer-app/nxp/zap/laundry-washer-app.zap
+)
+
+if(CONFIG_CHIP_LIB_SHELL)
+ target_compile_definitions(app PRIVATE ENABLE_CHIP_SHELL)
+ target_include_directories(app PRIVATE
+ ${CHIP_ROOT}/examples/shell/shell_common/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/matter_cli/include
+ )
+ target_sources(app PRIVATE
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/matter_cli/source/AppCLIBase.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/matter_cli/source/AppCLIZephyr.cpp
+ ${CHIP_ROOT}/examples/shell/shell_common/cmd_misc.cpp
+ ${CHIP_ROOT}/examples/shell/shell_common/cmd_otcli.cpp
+ ${CHIP_ROOT}/examples/shell/shell_common/cmd_server.cpp
+ )
+endif()
+
+target_sources(app
+ PRIVATE
+ ${ALL_CLUSTERS_COMMON_DIR}/src/smco-stub.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/bridged-actions-stub.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/static-supported-modes-manager.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/static-supported-temperature-levels.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/laundry-washer-mode.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/laundry-washer-controls-delegate-impl.cpp
+ ${LAUNDRY_WASHER_NXP_COMMON_DIR}/main/operational-state-delegate-impl.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/icd/source/ICDUtil.cpp
+)
diff --git a/examples/laundry-washer-app/nxp/zephyr/Kconfig b/examples/laundry-washer-app/nxp/zephyr/Kconfig
new file mode 100644
index 00000000000000..1d8b3f96581e51
--- /dev/null
+++ b/examples/laundry-washer-app/nxp/zephyr/Kconfig
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2024 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.
+#
+mainmenu "Matter NXP Laundry Washer Example Application"
+
+rsource "../../../../config/nxp/chip-module/Kconfig.features"
+rsource "../../../../config/nxp/chip-module/Kconfig.defaults"
+source "Kconfig.zephyr"
diff --git a/examples/laundry-washer-app/nxp/zephyr/README.md b/examples/laundry-washer-app/nxp/zephyr/README.md
new file mode 100644
index 00000000000000..406ee3b7796ede
--- /dev/null
+++ b/examples/laundry-washer-app/nxp/zephyr/README.md
@@ -0,0 +1,4 @@
+# CHIP NXP Zephyr Laundry Washer Application
+
+All instructions describing how to use a Matter application on NXP Zephyr can be
+found in [README.md](../../../all-clusters-app/nxp/zephyr/README.md) root readme
diff --git a/examples/laundry-washer-app/nxp/zephyr/boards/rd_rw612_bga.overlay b/examples/laundry-washer-app/nxp/zephyr/boards/rd_rw612_bga.overlay
new file mode 100644
index 00000000000000..86bb20739527cd
--- /dev/null
+++ b/examples/laundry-washer-app/nxp/zephyr/boards/rd_rw612_bga.overlay
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2023-2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+/ {
+ chosen {
+ zephyr,console = &flexcomm0;
+ zephyr,shell-uart = &flexcomm3;
+ };
+};
+
+&flexcomm0 {
+ compatible = "nxp,lpc-usart";
+ status = "okay";
+ current-speed = <115200>;
+ pinctrl-0 = <&pinmux_flexcomm0_usart>;
+ pinctrl-names = "default";
+};
+
+&flexcomm3 {
+ compatible = "nxp,lpc-usart";
+ status = "okay";
+ current-speed = <115200>;
+ pinctrl-0 = <&pinmux_flexcomm3_usart>;
+ pinctrl-names = "default";
+};
diff --git a/examples/laundry-washer-app/nxp/zephyr/boards/rd_rw612_bga_fdata.conf b/examples/laundry-washer-app/nxp/zephyr/boards/rd_rw612_bga_fdata.conf
new file mode 100644
index 00000000000000..73d139c3948d95
--- /dev/null
+++ b/examples/laundry-washer-app/nxp/zephyr/boards/rd_rw612_bga_fdata.conf
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2023-2024 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.
+#
+
+CONFIG_SETTINGS_NVS_SECTOR_COUNT=16
+
+# 0xA226
+CONFIG_CHIP_DEVICE_PRODUCT_ID=41510
+CONFIG_CHIP_DEVICE_PRODUCT_URL="https://www.nxp.com/products/wireless-connectivity/wi-fi-plus-bluetooth-plus-802-15-4/wireless-mcu-with-integrated-tri-radio-1x1-wi-fi-6-plus-bluetooth-low-energy-5-3-802-15-4:RW612"
+CONFIG_CHIP_DEVICE_PRODUCT_LABEL="RW612"
+CONFIG_CHIP_DEVICE_PART_NUMBER="RW612"
diff --git a/examples/laundry-washer-app/nxp/zephyr/main/include/CHIPProjectConfig.h b/examples/laundry-washer-app/nxp/zephyr/main/include/CHIPProjectConfig.h
new file mode 100644
index 00000000000000..84c57df1ea140d
--- /dev/null
+++ b/examples/laundry-washer-app/nxp/zephyr/main/include/CHIPProjectConfig.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2023-2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+/**
+ * @file
+ * Example project configuration file for CHIP.
+ *
+ * This is a place to put application or project-specific overrides
+ * to the default configuration values for general CHIP features.
+ *
+ */
+
+#pragma once
+
+// Use a default pairing code if one hasn't been provisioned in flash.
+#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE CONFIG_CHIP_DEVICE_SPAKE2_PASSCODE
+#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR CONFIG_CHIP_DEVICE_DISCRIMINATOR
+
+// All clusters app has 3 group endpoints. This needs to defined here so that
+// CHIP_CONFIG_MAX_GROUPS_PER_FABRIC is properly configured.
+#define CHIP_CONFIG_MAX_GROUP_ENDPOINTS_PER_FABRIC 3
diff --git a/examples/laundry-washer-app/nxp/zephyr/main/main.cpp b/examples/laundry-washer-app/nxp/zephyr/main/main.cpp
new file mode 100644
index 00000000000000..9be47dfe0a95d8
--- /dev/null
+++ b/examples/laundry-washer-app/nxp/zephyr/main/main.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2023-2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include "AppTask.h"
+
+#include
+
+LOG_MODULE_REGISTER(app, CONFIG_CHIP_APP_LOG_LEVEL);
+
+using namespace ::chip;
+
+int main()
+{
+ CHIP_ERROR err = CHIP_NO_ERROR;
+
+ if (err == CHIP_NO_ERROR)
+ {
+ err = chip::NXP::App::GetAppTask().Start();
+ }
+
+ LOG_ERR("Exited with code %" CHIP_ERROR_FORMAT, err.Format());
+ return err == CHIP_NO_ERROR ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/examples/laundry-washer-app/nxp/zephyr/prj.conf b/examples/laundry-washer-app/nxp/zephyr/prj.conf
new file mode 100644
index 00000000000000..ed59218a7da0e9
--- /dev/null
+++ b/examples/laundry-washer-app/nxp/zephyr/prj.conf
@@ -0,0 +1,59 @@
+#
+# Copyright (c) 2023-2024 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.
+#
+
+# This sample uses Kconfig.defaults to set options common for all
+# samples. This file should contain only options specific for this sample
+# or overrides of default values.
+
+# Enable CHIP
+CONFIG_CHIP=y
+CONFIG_STD_CPP17=y
+CONFIG_CHIP_PROJECT_CONFIG="main/include/CHIPProjectConfig.h"
+CONFIG_CHIP_ENABLE_PAIRING_AUTOSTART=y
+# CHIP PID: 32769 == 0x8001 (all-clusters-app)
+CONFIG_CHIP_DEVICE_PRODUCT_ID=32769
+CONFIG_CHIP_DEVICE_PRODUCT_NAME="Laundry Washer"
+CONFIG_CHIP_DEVICE_DISCRIMINATOR=0x800
+
+# Enable MbedTLS PSA - heavily experimental, not thread safe yet
+# CONFIG_CHIP_CRYPTO_PSA=y
+
+# Bluetooth overrides
+CONFIG_BT_DEVICE_NAME="LaundryWasher"
+
+# Additional configs for debbugging experience.
+CONFIG_THREAD_NAME=y
+CONFIG_MPU_STACK_GUARD=y
+
+CONFIG_DEBUG=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_THREAD_INFO=y
+# use this config if stepping during debug session is not consistent
+# CONFIG_NO_OPTIMIZATIONS=y
+CONFIG_EXCEPTION_STACK_TRACE=y
+CONFIG_ASSERT=y
+# by default west will generate the full assembly output, which can take several minutes when binaries are large
+CONFIG_OUTPUT_DISASSEMBLY=n
+# embedded thread analyzer with thread statistics (stack usage, cpu usage...)
+# CONFIG_THREAD_ANALYZER=y
+# CONFIG_THREAD_ANALYZER_USE_PRINTK=y
+# CONFIG_THREAD_ANALYZER_AUTO=y
+
+# enable Matter CLI
+CONFIG_CHIP_LIB_SHELL=y
+# enable NET commands if desired
+#CONFIG_NET_SHELL=y
+CONFIG_CHIP_STATISTICS=y
diff --git a/examples/laundry-washer-app/nxp/zephyr/prj_fdata.conf b/examples/laundry-washer-app/nxp/zephyr/prj_fdata.conf
new file mode 100644
index 00000000000000..986fc877aec5df
--- /dev/null
+++ b/examples/laundry-washer-app/nxp/zephyr/prj_fdata.conf
@@ -0,0 +1,80 @@
+#
+# Copyright (c) 2023-2024 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.
+#
+
+# This sample uses Kconfig.defaults to set options common for all
+# samples. This file should contain only options specific for this sample
+# or overrides of default values.
+
+# Enable CHIP
+CONFIG_CHIP=y
+CONFIG_STD_CPP17=y
+CONFIG_CHIP_PROJECT_CONFIG="main/include/CHIPProjectConfig.h"
+CONFIG_CHIP_ENABLE_PAIRING_AUTOSTART=y
+
+# Enable MbedTLS PSA - heavily experimental, not thread safe yet
+# CONFIG_CHIP_CRYPTO_PSA=y
+
+# Bluetooth overrides
+CONFIG_BT_DEVICE_NAME="LaundryWasher"
+
+# enable Matter CLI
+CONFIG_CHIP_LIB_SHELL=y
+CONFIG_CHIP_STATISTICS=y
+
+# Factory data configuration
+CONFIG_CHIP_DEVICE_VENDOR_ID=4151
+CONFIG_CHIP_DEVICE_DISCRIMINATOR=0xA00
+CONFIG_CHIP_DEVICE_SPAKE2_PASSCODE=14014
+CONFIG_CHIP_DEVICE_PRODUCT_NAME="Laundry Washer"
+CONFIG_CHIP_DEVICE_TYPE=115
+CONFIG_CHIP_DEVICE_MANUFACTURING_DATE="2023-01-01"
+CONFIG_CHIP_DEVICE_SERIAL_NUMBER="12345678"
+CONFIG_CHIP_DEVICE_PRODUCT_COLOR="Green"
+CONFIG_CHIP_DEVICE_PRODUCT_FINISH="Matte"
+
+# Use factory data provider for device info
+CONFIG_CHIP_FACTORY_DATA=y
+# Generate factor data raw binary during the build process
+# CONFIG_CHIP_FACTORY_DATA_BUILD=y
+# Generate test certificates for factory data during the build process
+# CONFIG_CHIP_FACTORY_DATA_CERT_SOURCE_GENERATED=y
+# Spake2p verifier will be generated during factory data generation
+# CONFIG_CHIP_FACTORY_DATA_GENERATE_SPAKE2_VERIFIER=y
+
+# Example of using pre-generated certificates
+# CONFIG_CHIP_FACTORY_DATA_CERT_SOURCE_USER=y
+# CONFIG_CHIP_FACTORY_DATA_USER_CERTS_CD_CERT="/Chip-Test-CD-1037-A226.der"
+# CONFIG_CHIP_FACTORY_DATA_USER_CERTS_DAC_CERT="/Chip-DAC-NXP-1037-A226-Cert.der"
+# CONFIG_CHIP_FACTORY_DATA_USER_CERTS_DAC_KEY="/Chip-DAC-NXP-1037-A226-Key.der"
+# CONFIG_CHIP_FACTORY_DATA_USER_CERTS_PAI_CERT="/Chip-PAI-NXP-1037-A226-Cert.der"
+
+# Additional configs for debbugging experience.
+CONFIG_THREAD_NAME=y
+CONFIG_MPU_STACK_GUARD=y
+
+CONFIG_DEBUG=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_THREAD_INFO=y
+# use this config if stepping during debug session is not consistent
+# CONFIG_NO_OPTIMIZATIONS=y
+CONFIG_EXCEPTION_STACK_TRACE=y
+CONFIG_ASSERT=y
+# by default west will generate the full assembly output, which can take several minutes when binaries are large
+CONFIG_OUTPUT_DISASSEMBLY=n
+# embedded thread analyzer with thread statistics (stack usage, cpu usage...)
+# CONFIG_THREAD_ANALYZER=y
+# CONFIG_THREAD_ANALYZER_USE_PRINTK=y
+# CONFIG_THREAD_ANALYZER_AUTO=y
diff --git a/examples/laundry-washer-app/nxp/zephyr/prj_ota.conf b/examples/laundry-washer-app/nxp/zephyr/prj_ota.conf
new file mode 100644
index 00000000000000..bdc65e94fabf70
--- /dev/null
+++ b/examples/laundry-washer-app/nxp/zephyr/prj_ota.conf
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+# All rights reserved.
+#
+# 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.
+#
+
+# Options needed for OTA are located on this file
+# This file should contain only options specific for this sample
+# or overrides the default ones.
+
+CONFIG_CHIP_OTA_REQUESTOR=y
+
+# To generate an OTA image based on the application
+CONFIG_CHIP_OTA_IMAGE_BUILD=y
+
+# By default, MCUBOOT bootloader uses a signature key provided in their repository.
+# Change the key to the appropriate one.
+# Note: You need to use the same signature key used by MCUBOOT, i.e BOOT_SIGNATURE_KEY_FILE.
+# Default CONFIG_BOOT_SIGNATURE_KEY_FILE is defined in config/nxp/app/bootloader.conf
+CONFIG_MCUBOOT_SIGNATURE_KEY_FILE="./bootloader/mcuboot/root-rsa-2048.pem"
diff --git a/examples/laundry-washer-app/nxp/zephyr/third_party/connectedhomeip b/examples/laundry-washer-app/nxp/zephyr/third_party/connectedhomeip
new file mode 120000
index 00000000000000..3efed95be5dbe9
--- /dev/null
+++ b/examples/laundry-washer-app/nxp/zephyr/third_party/connectedhomeip
@@ -0,0 +1 @@
+../../../../../
\ No newline at end of file
diff --git a/examples/light-switch-app/infineon/cyw30739/README.md b/examples/light-switch-app/infineon/cyw30739/README.md
index 70d650cfef97a3..0343563087a154 100644
--- a/examples/light-switch-app/infineon/cyw30739/README.md
+++ b/examples/light-switch-app/infineon/cyw30739/README.md
@@ -12,7 +12,7 @@ An example showing the use of Matter on the Infineon CYW30739 platform.
- [Installing ModusToolbox™ Software](#installing-modustoolbox-software)
- [ModusToolbox™ tools package](#modustoolbox-tools-package)
- [Note for WSL (Windows Subsystem for Linux)](#note-for-wsl-windows-subsystem-for-linux)
- - [Checkout Submodules](#checkout-submodules)
+ - [Checkout Submodules and Bootstrap](#checkout-submodules-and-bootstrap)
- [Building](#building)
- [Factory Data](#factory-data)
- [Commissionable Data](#commissionable-data)
@@ -65,7 +65,7 @@ If you are using WSL, please ensure you have installed the ModusToolbox™
Software for Linux. Running Windows tools directly from the WSL command line
would cause path resolution failure in the build process.
-### Checkout Submodules
+### Checkout Submodules and Bootstrap
Before building the example, check out the Matter repository and sync submodules
using the following command:
@@ -73,6 +73,7 @@ using the following command:
```bash
$ cd ~/connectedhomeip
$ scripts/checkout_submodules.py --platform infineon
+$ bash scripts/bootstrap.sh -p all,infineon
```
## Building
diff --git a/examples/lighting-app/infineon/cyw30739/README.md b/examples/lighting-app/infineon/cyw30739/README.md
index b1ff7aa5304902..a69ddb0957c8fa 100644
--- a/examples/lighting-app/infineon/cyw30739/README.md
+++ b/examples/lighting-app/infineon/cyw30739/README.md
@@ -12,7 +12,7 @@ An example showing the use of Matter on the Infineon CYW30739 platform.
- [Installing ModusToolbox™ Software](#installing-modustoolbox-software)
- [ModusToolbox™ tools package](#modustoolbox-tools-package)
- [Note for WSL (Windows Subsystem for Linux)](#note-for-wsl-windows-subsystem-for-linux)
- - [Checkout Submodules](#checkout-submodules)
+ - [Checkout Submodules and Bootstrap](#checkout-submodules-and-bootstrap)
- [Building](#building)
- [Factory Data](#factory-data)
- [Commissionable Data](#commissionable-data)
@@ -65,7 +65,7 @@ If you are using WSL, please ensure you have installed the ModusToolbox™
Software for Linux. Running Windows tools directly from the WSL command line
would cause path resolution failure in the build process.
-### Checkout Submodules
+### Checkout Submodules and Bootstrap
Before building the example, check out the Matter repository and sync submodules
using the following command:
@@ -73,6 +73,7 @@ using the following command:
```bash
$ cd ~/connectedhomeip
$ scripts/checkout_submodules.py --platform infineon
+$ bash scripts/bootstrap.sh -p all,infineon
```
## Building
diff --git a/examples/lock-app/infineon/cyw30739/README.md b/examples/lock-app/infineon/cyw30739/README.md
index 2b7bd2094154df..0c9b769b665c2a 100644
--- a/examples/lock-app/infineon/cyw30739/README.md
+++ b/examples/lock-app/infineon/cyw30739/README.md
@@ -12,7 +12,7 @@ An example showing the use of Matter on the Infineon CYW30739 platform.
- [Installing ModusToolbox™ Software](#installing-modustoolbox-software)
- [ModusToolbox™ tools package](#modustoolbox-tools-package)
- [Note for WSL (Windows Subsystem for Linux)](#note-for-wsl-windows-subsystem-for-linux)
- - [Checkout Submodules](#checkout-submodules)
+ - [Checkout Submodules and Bootstrap](#checkout-submodules-and-bootstrap)
- [Building](#building)
- [Factory Data](#factory-data)
- [Commissionable Data](#commissionable-data)
@@ -65,7 +65,7 @@ If you are using WSL, please ensure you have installed the ModusToolbox™
Software for Linux. Running Windows tools directly from the WSL command line
would cause path resolution failure in the build process.
-### Checkout Submodules
+### Checkout Submodules and Bootstrap
Before building the example, check out the Matter repository and sync submodules
using the following command:
@@ -73,6 +73,7 @@ using the following command:
```bash
$ cd ~/connectedhomeip
$ scripts/checkout_submodules.py --platform infineon
+$ bash scripts/bootstrap.sh -p all,infineon
```
## Building
diff --git a/examples/lock-app/lock-common/include/LockEndpoint.h b/examples/lock-app/lock-common/include/LockEndpoint.h
index bd193d388db02b..aa67a69481f23d 100644
--- a/examples/lock-app/lock-common/include/LockEndpoint.h
+++ b/examples/lock-app/lock-common/include/LockEndpoint.h
@@ -18,7 +18,9 @@
#pragma once
+#include
#include
+#include
#include
struct LockUserInfo
@@ -38,10 +40,10 @@ struct WeekDaysScheduleInfo;
struct YearDayScheduleInfo;
struct HolidayScheduleInfo;
-static constexpr size_t DOOR_LOCK_CREDENTIAL_INFO_MAX_DATA_SIZE = 20;
-static constexpr size_t DOOR_LOCK_CREDENTIAL_INFO_MAX_TYPES = 6;
+static constexpr size_t DOOR_LOCK_CREDENTIAL_INFO_MAX_DATA_SIZE = 65;
+static constexpr size_t DOOR_LOCK_CREDENTIAL_INFO_MAX_TYPES = 9;
-class LockEndpoint
+class LockEndpoint : public chip::app::Clusters::DoorLock::Delegate
{
public:
LockEndpoint(chip::EndpointId endpointId, uint16_t numberOfLockUsersSupported, uint16_t numberOfCredentialsSupported,
@@ -60,6 +62,7 @@ class LockEndpoint
}
DoorLockServer::Instance().SetDoorState(endpointId, mDoorState);
DoorLockServer::Instance().SetLockState(endpointId, mLockState);
+ chip::Crypto::DRBG_get_bytes(mAliroReaderGroupSubIdentifier, sizeof(mAliroReaderGroupSubIdentifier));
}
inline chip::EndpointId GetEndpointId() const { return mEndpointId; }
@@ -100,6 +103,22 @@ class LockEndpoint
DlStatus SetSchedule(uint8_t holidayIndex, DlScheduleStatus status, uint32_t localStartTime, uint32_t localEndTime,
OperatingModeEnum operatingMode);
+ // DoorLock::Delegate API.
+ CHIP_ERROR GetAliroReaderVerificationKey(chip::MutableByteSpan & verificationKey) override;
+ CHIP_ERROR GetAliroReaderGroupIdentifier(chip::MutableByteSpan & groupIdentifier) override;
+ CHIP_ERROR GetAliroReaderGroupSubIdentifier(chip::MutableByteSpan & groupSubIdentifier) override;
+ CHIP_ERROR GetAliroExpeditedTransactionSupportedProtocolVersionAtIndex(size_t index,
+ chip::MutableByteSpan & protocolVersion) override;
+ CHIP_ERROR GetAliroGroupResolvingKey(chip::MutableByteSpan & groupResolvingKey) override;
+ CHIP_ERROR GetAliroSupportedBLEUWBProtocolVersionAtIndex(size_t index, chip::MutableByteSpan & protocolVersion) override;
+ uint8_t GetAliroBLEAdvertisingVersion() override;
+ uint16_t GetNumberOfAliroCredentialIssuerKeysSupported() override;
+ uint16_t GetNumberOfAliroEndpointKeysSupported() override;
+ CHIP_ERROR SetAliroReaderConfig(const chip::ByteSpan & signingKey, const chip::ByteSpan & verificationKey,
+ const chip::ByteSpan & groupIdentifier,
+ const chip::Optional & groupResolvingKey) override;
+ CHIP_ERROR ClearAliroReaderConfig() override;
+
private:
bool setLockState(const Nullable & fabricIdx, const Nullable & nodeId, DlLockState lockState,
const Optional & pin, OperationErrorEnum & err,
@@ -130,6 +149,14 @@ class LockEndpoint
std::vector> mWeekDaySchedules;
std::vector> mYearDaySchedules;
std::vector mHolidaySchedules;
+
+ // Actual Aliro state would presumably be stored somewhere else, and persistently; this
+ // example just stores it in memory for illustration purposes.
+ uint8_t mAliroReaderVerificationKey[chip::app::Clusters::DoorLock::kAliroReaderVerificationKeySize];
+ uint8_t mAliroReaderGroupIdentifier[chip::app::Clusters::DoorLock::kAliroReaderGroupIdentifierSize];
+ uint8_t mAliroReaderGroupSubIdentifier[chip::app::Clusters::DoorLock::kAliroReaderGroupSubIdentifierSize];
+ uint8_t mAliroGroupResolvingKey[chip::app::Clusters::DoorLock::kAliroGroupResolvingKeySize];
+ bool mAliroStateInitialized = false;
};
struct LockCredentialInfo
diff --git a/examples/lock-app/lock-common/include/LockManager.h b/examples/lock-app/lock-common/include/LockManager.h
index 71dcf6f02dc072..fb4299a534622c 100644
--- a/examples/lock-app/lock-common/include/LockManager.h
+++ b/examples/lock-app/lock-common/include/LockManager.h
@@ -70,7 +70,12 @@ class LockManager
private:
LockEndpoint * getEndpoint(chip::EndpointId endpointId);
- std::vector mEndpoints;
+ /**
+ * We store the LockEndpoint instances by pointer, not value, so
+ * LockEndpoint can have a stable location in memory, which lets it
+ * implement DoorLock::Delegate.
+ */
+ std::vector> mEndpoints;
static LockManager instance;
};
diff --git a/examples/lock-app/lock-common/src/LockEndpoint.cpp b/examples/lock-app/lock-common/src/LockEndpoint.cpp
index bda27f18ba2c8c..5481d01471cfd0 100644
--- a/examples/lock-app/lock-common/src/LockEndpoint.cpp
+++ b/examples/lock-app/lock-common/src/LockEndpoint.cpp
@@ -17,10 +17,15 @@
*/
#include "LockEndpoint.h"
#include
+#include
#include
+#include
#include
#include
+using chip::ByteSpan;
+using chip::MutableByteSpan;
+using chip::Optional;
using chip::to_underlying;
using chip::app::DataModel::MakeNullable;
@@ -204,7 +209,8 @@ bool LockEndpoint::GetCredential(uint16_t credentialIndex, CredentialTypeEnum cr
if (credentialIndex >= mLockCredentials.at(to_underlying(credentialType)).size() ||
(0 == credentialIndex && CredentialTypeEnum::kProgrammingPIN != credentialType))
{
- ChipLogError(Zcl, "Cannot get the credential - index out of range [endpoint=%d,index=%d]", mEndpointId, credentialIndex);
+ ChipLogError(Zcl, "Cannot get the credential - index out of range [endpoint=%d,index=%d]: %d", mEndpointId, credentialIndex,
+ static_cast(mLockCredentials.at(to_underlying(credentialType)).size()));
return false;
}
@@ -407,6 +413,149 @@ DlStatus LockEndpoint::SetSchedule(uint8_t holidayIndex, DlScheduleStatus status
return DlStatus::kSuccess;
}
+CHIP_ERROR LockEndpoint::GetAliroReaderVerificationKey(MutableByteSpan & verificationKey)
+{
+ if (!mAliroStateInitialized)
+ {
+ verificationKey.reduce_size(0);
+ return CHIP_NO_ERROR;
+ }
+
+ return chip::CopySpanToMutableSpan(ByteSpan(mAliroReaderVerificationKey), verificationKey);
+}
+
+CHIP_ERROR LockEndpoint::GetAliroReaderGroupIdentifier(MutableByteSpan & groupIdentifier)
+{
+ if (!mAliroStateInitialized)
+ {
+ groupIdentifier.reduce_size(0);
+ return CHIP_NO_ERROR;
+ }
+
+ return CopySpanToMutableSpan(ByteSpan(mAliroReaderGroupIdentifier), groupIdentifier);
+}
+
+CHIP_ERROR LockEndpoint::GetAliroReaderGroupSubIdentifier(MutableByteSpan & groupSubIdentifier)
+{
+ return CopySpanToMutableSpan(ByteSpan(mAliroReaderGroupSubIdentifier), groupSubIdentifier);
+}
+
+namespace {
+
+CHIP_ERROR CopyProtocolVersionIntoSpan(uint16_t protocolVersionValue, MutableByteSpan & protocolVersion)
+{
+ using namespace chip::app::Clusters::DoorLock;
+
+ static_assert(sizeof(protocolVersionValue) == kAliroProtocolVersionSize);
+
+ if (protocolVersion.size() < kAliroProtocolVersionSize)
+ {
+ return CHIP_ERROR_INVALID_ARGUMENT;
+ }
+
+ // Per Aliro spec, protocol version encoding is big-endian
+ chip::Encoding::BigEndian::Put16(protocolVersion.data(), protocolVersionValue);
+ protocolVersion.reduce_size(kAliroProtocolVersionSize);
+ return CHIP_NO_ERROR;
+}
+
+} // anonymous namespace
+
+CHIP_ERROR LockEndpoint::GetAliroExpeditedTransactionSupportedProtocolVersionAtIndex(size_t index,
+ MutableByteSpan & protocolVersion)
+{
+ // Only claim support for the one known protocol version for now: 0x0100.
+ constexpr uint16_t knownProtocolVersion = 0x0100;
+
+ if (index > 0)
+ {
+ return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED;
+ }
+
+ return CopyProtocolVersionIntoSpan(knownProtocolVersion, protocolVersion);
+}
+
+CHIP_ERROR LockEndpoint::GetAliroGroupResolvingKey(MutableByteSpan & groupResolvingKey)
+{
+ if (!mAliroStateInitialized)
+ {
+ groupResolvingKey.reduce_size(0);
+ return CHIP_NO_ERROR;
+ }
+
+ return CopySpanToMutableSpan(ByteSpan(mAliroGroupResolvingKey), groupResolvingKey);
+}
+
+CHIP_ERROR LockEndpoint::GetAliroSupportedBLEUWBProtocolVersionAtIndex(size_t index, MutableByteSpan & protocolVersion)
+{
+ // Only claim support for the one known protocol version for now: 0x0100.
+ constexpr uint16_t knownProtocolVersion = 0x0100;
+
+ if (index > 0)
+ {
+ return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED;
+ }
+
+ return CopyProtocolVersionIntoSpan(knownProtocolVersion, protocolVersion);
+}
+
+uint8_t LockEndpoint::GetAliroBLEAdvertisingVersion()
+{
+ // For now the only define value of the BLE advertising version for Aliro is 0.
+ return 0;
+}
+
+uint16_t LockEndpoint::GetNumberOfAliroCredentialIssuerKeysSupported()
+{
+ using namespace chip::app::Clusters::DoorLock;
+
+ // Our vector has an extra entry at index 0 that is not a valid entry, so
+ // the actual number of credentials supported is one length than the length.
+ return static_cast(mLockCredentials.at(to_underlying(CredentialTypeEnum::kAliroCredentialIssuerKey)).size() - 1);
+}
+
+uint16_t LockEndpoint::GetNumberOfAliroEndpointKeysSupported()
+{
+ using namespace chip::app::Clusters::DoorLock;
+
+ // Our vector has an extra entry at index 0 that is not a valid entry, so
+ // the actual number of credentials supported is one length than the length.
+ //
+ // Also, our arrays are the same size, so we just return the size of one of
+ // the arrays: that is the cap on the total number of endpoint keys
+ // supported, which can be of either type.
+ return static_cast(mLockCredentials.at(to_underlying(CredentialTypeEnum::kAliroEvictableEndpointKey)).size() - 1);
+}
+
+CHIP_ERROR LockEndpoint::SetAliroReaderConfig(const ByteSpan & signingKey, const ByteSpan & verificationKey,
+ const ByteSpan & groupIdentifier, const Optional & groupResolvingKey)
+{
+ // We ignore the signing key, since we never do anything with it.
+
+ VerifyOrReturnError(verificationKey.size() == sizeof(mAliroReaderVerificationKey), CHIP_ERROR_INVALID_ARGUMENT);
+ memcpy(mAliroReaderVerificationKey, verificationKey.data(), sizeof(mAliroReaderVerificationKey));
+
+ VerifyOrReturnError(groupIdentifier.size() == sizeof(mAliroReaderGroupIdentifier), CHIP_ERROR_INVALID_ARGUMENT);
+ memcpy(mAliroReaderGroupIdentifier, groupIdentifier.data(), sizeof(mAliroReaderGroupIdentifier));
+
+ if (groupResolvingKey.HasValue())
+ {
+ VerifyOrReturnError(groupResolvingKey.Value().size() == sizeof(mAliroGroupResolvingKey), CHIP_ERROR_INVALID_ARGUMENT);
+ memcpy(mAliroGroupResolvingKey, groupResolvingKey.Value().data(), sizeof(mAliroGroupResolvingKey));
+ }
+
+ mAliroStateInitialized = true;
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR LockEndpoint::ClearAliroReaderConfig()
+{
+ // A real implementation would clear out key data from the other parts of
+ // the application that might use it.
+ mAliroStateInitialized = false;
+ return CHIP_NO_ERROR;
+}
+
bool LockEndpoint::setLockState(const Nullable & fabricIdx, const Nullable & nodeId,
DlLockState lockState, const Optional & pin, OperationErrorEnum & err,
OperationSourceEnum opSource)
diff --git a/examples/lock-app/lock-common/src/LockManager.cpp b/examples/lock-app/lock-common/src/LockManager.cpp
index 8fd1ef5441b139..8af66051883aa4 100644
--- a/examples/lock-app/lock-common/src/LockManager.cpp
+++ b/examples/lock-app/lock-common/src/LockManager.cpp
@@ -20,6 +20,7 @@
#include
#include
+#include
using chip::to_underlying;
@@ -98,8 +99,9 @@ bool LockManager::InitEndpoint(chip::EndpointId endpointId)
numberOfHolidaySchedules = 10;
}
- mEndpoints.emplace_back(endpointId, numberOfSupportedUsers, numberOfSupportedCredentials, numberOfWeekDaySchedulesPerUser,
- numberOfYearDaySchedulesPerUser, numberOfCredentialsSupportedPerUser, numberOfHolidaySchedules);
+ mEndpoints.emplace_back(std::make_unique(endpointId, numberOfSupportedUsers, numberOfSupportedCredentials,
+ numberOfWeekDaySchedulesPerUser, numberOfYearDaySchedulesPerUser,
+ numberOfCredentialsSupportedPerUser, numberOfHolidaySchedules));
ChipLogProgress(Zcl,
"Initialized new lock door endpoint "
@@ -107,6 +109,7 @@ bool LockManager::InitEndpoint(chip::EndpointId endpointId)
"numberOfCredentialsSupportedPerUser=%d,holidaySchedules=%d]",
endpointId, numberOfSupportedUsers, numberOfSupportedCredentials, numberOfWeekDaySchedulesPerUser,
numberOfYearDaySchedulesPerUser, numberOfCredentialsSupportedPerUser, numberOfHolidaySchedules);
+ DoorLockServer::Instance().SetDelegate(endpointId, mEndpoints.back().get());
return true;
}
@@ -303,11 +306,11 @@ DlStatus LockManager::SetSchedule(chip::EndpointId endpointId, uint8_t holidayIn
LockEndpoint * LockManager::getEndpoint(chip::EndpointId endpointId)
{
- for (auto & mEndpoint : mEndpoints)
+ for (auto & endpoint : mEndpoints)
{
- if (mEndpoint.GetEndpointId() == endpointId)
+ if (endpoint->GetEndpointId() == endpointId)
{
- return &mEndpoint;
+ return endpoint.get();
}
}
return nullptr;
diff --git a/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.matter b/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.matter
index f3eadf7c9db5d2..a0ae180bbc1307 100644
--- a/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.matter
+++ b/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.matter
@@ -1293,6 +1293,7 @@ cluster UserLabel = 65 {
endpoint 0 {
device type ma_rootdevice = 22, version 1;
+ device type ma_otarequestor = 18, version 1;
binding cluster OtaSoftwareUpdateProvider;
@@ -1301,6 +1302,10 @@ endpoint 0 {
callback attribute serverList;
callback attribute clientList;
callback attribute partsList;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
callback attribute featureMap;
callback attribute clusterRevision;
}
@@ -1313,6 +1318,9 @@ endpoint 0 {
callback attribute subjectsPerAccessControlEntry;
callback attribute targetsPerAccessControlEntry;
callback attribute accessControlEntriesPerFabric;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
callback attribute attributeList;
ram attribute featureMap default = 0;
callback attribute clusterRevision;
@@ -1343,6 +1351,10 @@ endpoint 0 {
callback attribute capabilityMinima;
callback attribute specificationVersion;
callback attribute maxPathsPerInvoke;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
ram attribute featureMap default = 0;
ram attribute clusterRevision default = 3;
}
@@ -1355,6 +1367,10 @@ endpoint 0 {
ram attribute updatePossible default = 1;
ram attribute updateState default = 0;
ram attribute updateStateProgress default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
ram attribute featureMap default = 0;
ram attribute clusterRevision default = 1;
@@ -1364,6 +1380,10 @@ endpoint 0 {
server cluster LocalizationConfiguration {
persist attribute activeLocale default = "en-US";
callback attribute supportedLocales;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
ram attribute featureMap default = 0;
ram attribute clusterRevision default = 1;
}
@@ -1382,6 +1402,10 @@ endpoint 0 {
callback attribute regulatoryConfig;
callback attribute locationCapability;
callback attribute supportsConcurrentConnection;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
ram attribute featureMap default = 0;
ram attribute clusterRevision default = 1;
@@ -1402,6 +1426,10 @@ endpoint 0 {
ram attribute lastNetworkingStatus;
ram attribute lastNetworkID;
ram attribute lastConnectErrorValue;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
ram attribute featureMap default = 2;
ram attribute clusterRevision default = 1;
@@ -1427,6 +1455,10 @@ endpoint 0 {
callback attribute activeRadioFaults;
callback attribute activeNetworkFaults;
callback attribute testEventTriggersEnabled default = false;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
callback attribute featureMap;
callback attribute clusterRevision;
@@ -1439,6 +1471,10 @@ endpoint 0 {
callback attribute windowStatus;
callback attribute adminFabricIndex;
callback attribute adminVendorId;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
ram attribute featureMap default = 0;
ram attribute clusterRevision default = 1;
@@ -1454,6 +1490,10 @@ endpoint 0 {
callback attribute commissionedFabrics;
callback attribute trustedRootCertificates;
callback attribute currentFabricIndex;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
ram attribute featureMap default = 0;
ram attribute clusterRevision default = 1;
@@ -1476,6 +1516,10 @@ endpoint 0 {
callback attribute groupTable;
callback attribute maxGroupsPerFabric;
callback attribute maxGroupKeysPerFabric;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
callback attribute featureMap;
callback attribute clusterRevision;
diff --git a/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap b/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap
index 5291880efb89f0..75b4eb0a223b9e 100644
--- a/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap
+++ b/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap
@@ -38,12 +38,18 @@
"id": 1,
"name": "MA-rootdevice",
"deviceTypeRef": {
- "code": 22,
+ "code": 18,
"profileId": 259,
- "label": "MA-rootdevice",
- "name": "MA-rootdevice"
+ "label": "MA-otarequestor",
+ "name": "MA-otarequestor"
},
"deviceTypes": [
+ {
+ "code": 18,
+ "profileId": 259,
+ "label": "MA-otarequestor",
+ "name": "MA-otarequestor"
+ },
{
"code": 22,
"profileId": 259,
@@ -52,13 +58,15 @@
}
],
"deviceVersions": [
+ 1,
1
],
"deviceIdentifiers": [
+ 18,
22
],
- "deviceTypeName": "MA-rootdevice",
- "deviceTypeCode": 22,
+ "deviceTypeName": "MA-otarequestor",
+ "deviceTypeCode": 18,
"deviceTypeProfileId": 259,
"clusters": [
{
@@ -96,7 +104,7 @@
"singleton": 0,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65534,
"reportableChange": 0
@@ -112,7 +120,7 @@
"singleton": 0,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65534,
"reportableChange": 0
@@ -128,11 +136,75 @@
"singleton": 0,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65534,
"reportableChange": 0
},
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "FeatureMap",
"code": 65532,
@@ -186,7 +258,7 @@
"singleton": 0,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
@@ -202,7 +274,7 @@
"singleton": 0,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
@@ -255,6 +327,54 @@
"maxInterval": 65534,
"reportableChange": 0
},
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "AttributeList",
"code": 65531,
@@ -340,7 +460,7 @@
"singleton": 1,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65344,
"reportableChange": 0
@@ -356,7 +476,7 @@
"singleton": 1,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65344,
"reportableChange": 0
@@ -372,7 +492,7 @@
"singleton": 1,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65344,
"reportableChange": 0
@@ -388,7 +508,7 @@
"singleton": 1,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65344,
"reportableChange": 0
@@ -404,7 +524,7 @@
"singleton": 1,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65344,
"reportableChange": 0
@@ -420,7 +540,7 @@
"singleton": 1,
"bounded": 0,
"defaultValue": "",
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65344,
"reportableChange": 0
@@ -436,7 +556,7 @@
"singleton": 1,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65344,
"reportableChange": 0
@@ -452,7 +572,7 @@
"singleton": 1,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65344,
"reportableChange": 0
@@ -468,7 +588,7 @@
"singleton": 1,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65344,
"reportableChange": 0
@@ -484,7 +604,7 @@
"singleton": 1,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65344,
"reportableChange": 0
@@ -500,7 +620,7 @@
"singleton": 1,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 0,
"maxInterval": 65344,
"reportableChange": 0
@@ -665,6 +785,70 @@
"maxInterval": 65534,
"reportableChange": 0
},
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "FeatureMap",
"code": 65532,
@@ -772,6 +956,22 @@
}
],
"attributes": [
+ {
+ "name": "FeatureMap",
+ "code": 65532,
+ "mfgCode": null,
+ "side": "client",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "ClusterRevision",
"code": 65533,
@@ -873,53 +1073,117 @@
"reportableChange": 0
},
{
- "name": "FeatureMap",
- "code": 65532,
+ "name": "GeneratedCommandList",
+ "code": 65528,
"mfgCode": null,
"side": "server",
- "type": "bitmap32",
+ "type": "array",
"included": 1,
- "storageOption": "RAM",
+ "storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0",
+ "defaultValue": "",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "ClusterRevision",
- "code": 65533,
+ "name": "AcceptedCommandList",
+ "code": 65529,
"mfgCode": null,
"side": "server",
- "type": "int16u",
+ "type": "array",
"included": 1,
- "storageOption": "RAM",
+ "storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
- }
- ],
- "events": [
+ },
{
- "name": "StateTransition",
- "code": 0,
+ "name": "EventList",
+ "code": 65530,
"mfgCode": null,
"side": "server",
- "included": 1
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
},
{
- "name": "VersionApplied",
- "code": 1,
+ "name": "AttributeList",
+ "code": 65531,
"mfgCode": null,
"side": "server",
- "included": 1
- },
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "FeatureMap",
+ "code": 65532,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ClusterRevision",
+ "code": 65533,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ],
+ "events": [
+ {
+ "name": "StateTransition",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ },
+ {
+ "name": "VersionApplied",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ },
{
"name": "DownloadError",
"code": 2,
@@ -948,7 +1212,7 @@
"singleton": 0,
"bounded": 0,
"defaultValue": "en-US",
- "reportable": 1,
+ "reportable": 0,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
@@ -964,6 +1228,70 @@
"singleton": 0,
"bounded": 0,
"defaultValue": null,
+ "reportable": 0,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -1022,7 +1350,7 @@
"singleton": 0,
"bounded": 0,
"defaultValue": "0",
- "reportable": 1,
+ "reportable": 0,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
@@ -1231,6 +1559,70 @@
"maxInterval": 65534,
"reportableChange": 0
},
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "FeatureMap",
"code": 65532,
@@ -1475,6 +1867,70 @@
"maxInterval": 65534,
"reportableChange": 0
},
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "FeatureMap",
"code": 65532,
@@ -1586,7 +2042,7 @@
"singleton": 0,
"bounded": 0,
"defaultValue": null,
- "reportable": 1,
+ "reportable": 0,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
@@ -1687,6 +2143,70 @@
"maxInterval": 65534,
"reportableChange": 0
},
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "FeatureMap",
"code": 65532,
@@ -1812,6 +2332,70 @@
"maxInterval": 65534,
"reportableChange": 0
},
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "FeatureMap",
"code": 65532,
@@ -2048,6 +2632,70 @@
"maxInterval": 65534,
"reportableChange": 0
},
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "FeatureMap",
"code": 65532,
@@ -2204,6 +2852,70 @@
"maxInterval": 65534,
"reportableChange": 0
},
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "FeatureMap",
"code": 65532,
diff --git a/examples/platform/esp32/mode-support/static-supported-modes-manager.cpp b/examples/platform/esp32/mode-support/static-supported-modes-manager.cpp
new file mode 100644
index 00000000000000..d06a8b8b7dc809
--- /dev/null
+++ b/examples/platform/esp32/mode-support/static-supported-modes-manager.cpp
@@ -0,0 +1,223 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include "static-supported-modes-manager.h"
+#include
+
+using namespace chip;
+using namespace chip::app::Clusters;
+using namespace chip::DeviceLayer::Internal;
+using namespace chip::app::Clusters::ModeSelect;
+using chip::Protocols::InteractionModel::Status;
+
+using ModeOptionStructType = Structs::ModeOptionStruct::Type;
+using SemanticTag = Structs::SemanticTagStruct::Type;
+
+template
+using List = app::DataModel::List;
+
+SupportedModesManager::ModeOptionsProvider * StaticSupportedModesManager::epModeOptionsProviderList = nullptr;
+
+const StaticSupportedModesManager StaticSupportedModesManager::instance = StaticSupportedModesManager();
+
+int StaticSupportedModesManager::mSize = 0;
+
+CHIP_ERROR StaticSupportedModesManager::InitEndpointArray(int size)
+{
+ if (epModeOptionsProviderList != nullptr)
+ {
+ ChipLogError(Zcl, "Cannot allocate epModeOptionsProviderList");
+ return CHIP_ERROR_INCORRECT_STATE;
+ }
+ mSize = size;
+ epModeOptionsProviderList = new SupportedModesManager::ModeOptionsProvider[mSize];
+ if (epModeOptionsProviderList == nullptr)
+ {
+ ChipLogError(Zcl, "Failed to allocate memory to epModeOptionsProviderList");
+ return CHIP_ERROR_NO_MEMORY;
+ }
+ for (int i = 0; i < mSize; i++)
+ {
+ epModeOptionsProviderList[i] = ModeOptionsProvider();
+ }
+ return CHIP_NO_ERROR;
+}
+
+SupportedModesManager::ModeOptionsProvider StaticSupportedModesManager::getModeOptionsProvider(EndpointId endpointId) const
+{
+ if (epModeOptionsProviderList[endpointId].begin() != nullptr && epModeOptionsProviderList[endpointId].end() != nullptr)
+ {
+ return ModeOptionsProvider(epModeOptionsProviderList[endpointId].begin(), epModeOptionsProviderList[endpointId].end());
+ }
+
+ ModeOptionStructType * modeOptionStructList = nullptr;
+ SemanticTag * semanticTags = nullptr;
+
+ char keyBuf[ESP32Config::kMaxConfigKeyNameLength];
+ uint32_t supportedModeCount = 0;
+
+ VerifyOrReturnValue(ESP32Config::KeyAllocator::SupportedModesCount(keyBuf, sizeof(keyBuf), endpointId) == CHIP_NO_ERROR,
+ ModeOptionsProvider(nullptr, nullptr));
+ ESP32Config::Key countKey(ESP32Config::kConfigNamespace_ChipFactory, keyBuf);
+ VerifyOrReturnValue(ESP32Config::ReadConfigValue(countKey, supportedModeCount) == CHIP_NO_ERROR,
+ ModeOptionsProvider(nullptr, nullptr));
+
+ modeOptionStructList = new ModeOptionStructType[supportedModeCount];
+ if (modeOptionStructList == nullptr)
+ {
+ return ModeOptionsProvider(nullptr, nullptr);
+ }
+
+ epModeOptionsProviderList[endpointId] = ModeOptionsProvider(modeOptionStructList, modeOptionStructList + supportedModeCount);
+
+ for (int index = 0; index < supportedModeCount; index++)
+ {
+ Structs::ModeOptionStruct::Type option;
+ uint32_t supportedModeMode = 0;
+ uint32_t semanticTagCount = 0;
+ size_t outLen = 0;
+
+ memset(keyBuf, 0, sizeof(char) * ESP32Config::kMaxConfigKeyNameLength);
+ VerifyOrReturnValue(ESP32Config::KeyAllocator::SupportedModesLabel(keyBuf, sizeof(keyBuf), endpointId, index) ==
+ CHIP_NO_ERROR,
+ ModeOptionsProvider(nullptr, nullptr), CleanUp(endpointId));
+ ESP32Config::Key labelKey(ESP32Config::kConfigNamespace_ChipFactory, keyBuf);
+ VerifyOrReturnValue(ESP32Config::ReadConfigValueStr(labelKey, nullptr, 0, outLen) == CHIP_NO_ERROR,
+ ModeOptionsProvider(nullptr, nullptr), CleanUp(endpointId));
+
+ char * modeLabel = new char[outLen + 1];
+ if (modeLabel == nullptr)
+ {
+ CleanUp(endpointId);
+ return ModeOptionsProvider(nullptr, nullptr);
+ }
+
+ VerifyOrReturnValue(ESP32Config::ReadConfigValueStr(labelKey, modeLabel, outLen + 1, outLen) == CHIP_NO_ERROR,
+ ModeOptionsProvider(nullptr, nullptr), CleanUp(endpointId));
+
+ memset(keyBuf, 0, sizeof(char) * ESP32Config::kMaxConfigKeyNameLength);
+ VerifyOrReturnValue(ESP32Config::KeyAllocator::SupportedModesValue(keyBuf, sizeof(keyBuf), endpointId, index) ==
+ CHIP_NO_ERROR,
+ ModeOptionsProvider(nullptr, nullptr), CleanUp(endpointId));
+ ESP32Config::Key modeKey(ESP32Config::kConfigNamespace_ChipFactory, keyBuf);
+ VerifyOrReturnValue(ESP32Config::ReadConfigValue(labelKey, supportedModeMode) == CHIP_NO_ERROR,
+ ModeOptionsProvider(nullptr, nullptr), CleanUp(endpointId));
+
+ memset(keyBuf, 0, sizeof(char) * ESP32Config::kMaxConfigKeyNameLength);
+ VerifyOrReturnValue(ESP32Config::KeyAllocator::SemanticTagsCount(keyBuf, sizeof(keyBuf), endpointId, index) ==
+ CHIP_NO_ERROR,
+ ModeOptionsProvider(nullptr, nullptr), CleanUp(endpointId));
+ ESP32Config::Key stCountKey(ESP32Config::kConfigNamespace_ChipFactory, keyBuf);
+ VerifyOrReturnValue(ESP32Config::ReadConfigValue(stCountKey, semanticTagCount) == CHIP_NO_ERROR,
+ ModeOptionsProvider(nullptr, nullptr), CleanUp(endpointId));
+
+ semanticTags = new SemanticTag[semanticTagCount];
+ if (semanticTags == nullptr)
+ {
+ CleanUp(endpointId);
+ return ModeOptionsProvider(nullptr, nullptr);
+ }
+ for (auto stIndex = 0; stIndex < semanticTagCount; stIndex++)
+ {
+
+ uint32_t semanticTagValue = 0;
+ uint32_t semanticTagMfgCode = 0;
+ SemanticTag tag;
+
+ memset(keyBuf, 0, sizeof(char) * ESP32Config::kMaxConfigKeyNameLength);
+ VerifyOrReturnValue(ESP32Config::KeyAllocator::SemanticTagValue(keyBuf, sizeof(keyBuf), endpointId, index, stIndex) ==
+ CHIP_NO_ERROR,
+ ModeOptionsProvider(nullptr, nullptr), CleanUp(endpointId));
+ ESP32Config::Key stValueKey(ESP32Config::kConfigNamespace_ChipFactory, keyBuf);
+ VerifyOrReturnValue(ESP32Config::ReadConfigValue(stValueKey, semanticTagValue) == CHIP_NO_ERROR,
+ ModeOptionsProvider(nullptr, nullptr), CleanUp(endpointId));
+
+ memset(keyBuf, 0, sizeof(char) * ESP32Config::kMaxConfigKeyNameLength);
+ VerifyOrReturnValue(ESP32Config::KeyAllocator::SemanticTagMfgCode(keyBuf, sizeof(keyBuf), endpointId, index, stIndex) ==
+ CHIP_NO_ERROR,
+ ModeOptionsProvider(nullptr, nullptr), CleanUp(endpointId));
+ ESP32Config::Key stMfgCodeKey(ESP32Config::kConfigNamespace_ChipFactory, keyBuf);
+ VerifyOrReturnValue(ESP32Config::ReadConfigValue(stMfgCodeKey, semanticTagMfgCode) == CHIP_NO_ERROR,
+ ModeOptionsProvider(nullptr, nullptr), CleanUp(endpointId));
+
+ tag.value = static_cast(semanticTagValue);
+ tag.mfgCode = static_cast(semanticTagMfgCode);
+ semanticTags[stIndex] = tag;
+ }
+
+ option.label = chip::CharSpan::fromCharString(modeLabel);
+ option.mode = static_cast(supportedModeMode);
+ option.semanticTags = DataModel::List(semanticTags, semanticTagCount);
+
+ modeOptionStructList[index] = option;
+ }
+
+ return ModeOptionsProvider(modeOptionStructList, modeOptionStructList + supportedModeCount);
+}
+
+Status StaticSupportedModesManager::getModeOptionByMode(unsigned short endpointId, unsigned char mode,
+ const ModeOptionStructType ** dataPtr) const
+{
+ auto modeOptionsProvider = this->getModeOptionsProvider(endpointId);
+ if (modeOptionsProvider.begin() == nullptr)
+ {
+ return Status::UnsupportedCluster;
+ }
+ auto * begin = modeOptionsProvider.begin();
+ auto * end = modeOptionsProvider.end();
+
+ for (auto * it = begin; it != end; ++it)
+ {
+ auto & modeOption = *it;
+ if (modeOption.mode == mode)
+ {
+ *dataPtr = &modeOption;
+ return Status::Success;
+ }
+ }
+ ChipLogProgress(Zcl, "Cannot find the mode %u", mode);
+ return Status::InvalidCommand;
+}
+
+const ModeSelect::SupportedModesManager * ModeSelect::getSupportedModesManager()
+{
+ return &StaticSupportedModesManager::getStaticSupportedModesManagerInstance();
+}
+
+void StaticSupportedModesManager::FreeSupportedModes(EndpointId endpointId) const
+{
+ if (epModeOptionsProviderList[endpointId].begin() != nullptr)
+ {
+ auto * begin = epModeOptionsProviderList[endpointId].begin();
+ auto * end = epModeOptionsProviderList[endpointId].end();
+ for (auto * it = begin; it != end; ++it)
+ {
+ auto & modeOption = *it;
+ delete[] modeOption.label.data();
+ delete[] modeOption.semanticTags.data();
+ }
+ delete[] begin;
+ }
+ epModeOptionsProviderList[endpointId] = ModeOptionsProvider();
+}
+
+void StaticSupportedModesManager::CleanUp(EndpointId endpointId) const
+{
+ ChipLogError(Zcl, "Supported mode data is in incorrect format");
+ FreeSupportedModes(endpointId);
+}
diff --git a/examples/platform/esp32/mode-support/static-supported-modes-manager.h b/examples/platform/esp32/mode-support/static-supported-modes-manager.h
new file mode 100644
index 00000000000000..8d6bb3c665ff0c
--- /dev/null
+++ b/examples/platform/esp32/mode-support/static-supported-modes-manager.h
@@ -0,0 +1,80 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace ModeSelect {
+
+class StaticSupportedModesManager : public chip::app::Clusters::ModeSelect::SupportedModesManager
+{
+private:
+ using ModeOptionStructType = Structs::ModeOptionStruct::Type;
+ using SemanticTag = Structs::SemanticTagStruct::Type;
+ static int mSize;
+
+ static ModeOptionsProvider * epModeOptionsProviderList;
+
+ void FreeSupportedModes(EndpointId endpointId) const;
+
+ static const StaticSupportedModesManager instance;
+
+public:
+ // InitEndpointArray should be called only once in the application. Memory allocated to the
+ // epModeOptionsProviderList will be needed for the lifetime of the program, so it's never deallocated.
+ static CHIP_ERROR InitEndpointArray(int size);
+
+ // DeInitEndpointArray should be called only when application need to reallocate memory of
+ // epModeOptionsProviderList ( Eg. Bridges ).
+ static void DeInitEndpointArray()
+ {
+ delete[] epModeOptionsProviderList;
+ epModeOptionsProviderList = nullptr;
+ mSize = 0;
+ }
+
+ SupportedModesManager::ModeOptionsProvider getModeOptionsProvider(EndpointId endpointId) const override;
+
+ Protocols::InteractionModel::Status getModeOptionByMode(EndpointId endpointId, uint8_t mode,
+ const ModeOptionStructType ** dataPtr) const override;
+
+ void CleanUp(EndpointId endpointId) const;
+
+ StaticSupportedModesManager() {}
+
+ ~StaticSupportedModesManager()
+ {
+ for (int i = 0; i < mSize; i++)
+ {
+ FreeSupportedModes(i);
+ }
+ }
+
+ static inline const StaticSupportedModesManager & getStaticSupportedModesManagerInstance() { return instance; }
+};
+
+const SupportedModesManager * getSupportedModesManager();
+
+} // namespace ModeSelect
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/examples/smoke-co-alarm-app/silabs/src/AppTask.cpp b/examples/smoke-co-alarm-app/silabs/src/AppTask.cpp
index c9b4a3ab7281f1..dc99728ccf90d5 100644
--- a/examples/smoke-co-alarm-app/silabs/src/AppTask.cpp
+++ b/examples/smoke-co-alarm-app/silabs/src/AppTask.cpp
@@ -78,7 +78,10 @@ CHIP_ERROR AppTask::Init()
}
// Register Smoke & Co Test Event Trigger
- Server::GetInstance().GetTestEventTriggerDelegate()->AddHandler(&AlarmMgr());
+ if (Server::GetInstance().GetTestEventTriggerDelegate() != nullptr)
+ {
+ Server::GetInstance().GetTestEventTriggerDelegate()->AddHandler(&AlarmMgr());
+ }
sAlarmLED.Init(LIGHT_LED);
sAlarmLED.Set(false);
diff --git a/examples/thermostat/infineon/cyw30739/README.md b/examples/thermostat/infineon/cyw30739/README.md
index 6d37d24eb920ef..0b94884fe134a4 100644
--- a/examples/thermostat/infineon/cyw30739/README.md
+++ b/examples/thermostat/infineon/cyw30739/README.md
@@ -12,7 +12,7 @@ An example showing the use of Matter on the Infineon CYW30739 platform.
- [Installing ModusToolbox™ Software](#installing-modustoolbox-software)
- [ModusToolbox™ tools package](#modustoolbox-tools-package)
- [Note for WSL (Windows Subsystem for Linux)](#note-for-wsl-windows-subsystem-for-linux)
- - [Checkout Submodules](#checkout-submodules)
+ - [Checkout Submodules and Bootstrap](#checkout-submodules-and-bootstrap)
- [Building](#building)
- [Factory Data](#factory-data)
- [Commissionable Data](#commissionable-data)
@@ -65,7 +65,7 @@ If you are using WSL, please ensure you have installed the ModusToolbox™
Software for Linux. Running Windows tools directly from the WSL command line
would cause path resolution failure in the build process.
-### Checkout Submodules
+### Checkout Submodules and Bootstrap
Before building the example, check out the Matter repository and sync submodules
using the following command:
@@ -73,6 +73,7 @@ using the following command:
```bash
$ cd ~/connectedhomeip
$ scripts/checkout_submodules.py --platform infineon
+$ bash scripts/bootstrap.sh -p all,infineon
```
## Building
diff --git a/examples/thermostat/nxp/zephyr/.gitignore b/examples/thermostat/nxp/zephyr/.gitignore
new file mode 100644
index 00000000000000..84c048a73cc2e5
--- /dev/null
+++ b/examples/thermostat/nxp/zephyr/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/examples/thermostat/nxp/zephyr/CMakeLists.txt b/examples/thermostat/nxp/zephyr/CMakeLists.txt
new file mode 100644
index 00000000000000..2b0fb87a55e7f9
--- /dev/null
+++ b/examples/thermostat/nxp/zephyr/CMakeLists.txt
@@ -0,0 +1,104 @@
+#
+# Copyright (c) 2023-2024 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.
+#
+cmake_minimum_required(VERSION 3.13.1)
+
+get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/third_party/connectedhomeip REALPATH)
+get_filename_component(GEN_DIR ${CHIP_ROOT}/zzz_generated/ REALPATH)
+get_filename_component(ALL_CLUSTERS_COMMON_DIR ${CHIP_ROOT}/examples/all-clusters-app/all-clusters-common REALPATH)
+get_filename_component(THERMOSTAT_NXP_COMMON_DIR ${CHIP_ROOT}/examples/thermostat/nxp/common REALPATH)
+get_filename_component(EXAMPLE_PLATFORM_NXP_COMMON_DIR ${CHIP_ROOT}/examples/platform/nxp/common REALPATH)
+get_filename_component(EXAMPLE_PLATFORM_NXP_ZEPHYR_DIR ${CHIP_ROOT}/examples/platform/nxp/zephyr REALPATH)
+
+# Perform common operations like detecting extra overlays in the platform folder for the target board
+# This must be called before find_package(Zephyr)
+include(${CHIP_ROOT}/config/nxp/app/pre-zephyr.cmake)
+
+list(APPEND ZEPHYR_EXTRA_MODULES ${CHIP_ROOT}/config/nxp/chip-module)
+find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
+
+# -Wmaybe-uninitialized has too many false positives, including on std::optional
+# and chip::Optional. Make it nonfatal.
+#
+# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80635
+target_compile_options(app PRIVATE -Werror -Wno-error=maybe-uninitialized)
+target_compile_options(app PRIVATE -Werror PRIVATE -Wno-error=format)
+
+project(chip-nxp-all-clusters-app-example)
+
+include(${CHIP_ROOT}/config/nxp/app/enable-gnu-std.cmake)
+include(${CHIP_ROOT}/src/app/chip_data_model.cmake)
+
+target_include_directories(app
+ PRIVATE
+ ${THERMOSTAT_NXP_COMMON_DIR}/main/include
+ ${ALL_CLUSTERS_COMMON_DIR}/include
+ ${GEN_DIR}/app-common
+ ${GEN_DIR}/all-clusters-app
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/device_manager/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/icd/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/device_callbacks/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/factory_data/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/app_task/include
+)
+
+target_sources(app
+ PRIVATE
+ main/main.cpp
+ ${THERMOSTAT_NXP_COMMON_DIR}/main/AppTask.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/device_manager/source/CHIPDeviceManager.cpp
+ ${THERMOSTAT_NXP_COMMON_DIR}/main/DeviceCallbacks.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/device_callbacks/source/CommonDeviceCallbacks.cpp
+ ${THERMOSTAT_NXP_COMMON_DIR}/main/ZclCallbacks.cpp
+ ${ALL_CLUSTERS_COMMON_DIR}/src/binding-handler.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/app_task/source/AppTaskBase.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/app_task/source/AppTaskZephyr.cpp
+ ${EXAMPLE_PLATFORM_NXP_ZEPHYR_DIR}/factory_data/source/AppFactoryDataExample.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/icd/source/ICDUtil.cpp
+)
+
+target_compile_definitions(app PUBLIC
+ "EXTERNAL_FACTORY_DATA_PROVIDER_IMPL_HEADER=\"platform/nxp/zephyr/FactoryDataProviderImpl.h\""
+)
+
+if(CONFIG_CHIP_OTA_REQUESTOR)
+ target_sources(app PRIVATE
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/ota_requestor/source/OTARequestorInitiatorCommon.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/ota_requestor/source/OTARequestorInitiatorZephyr.cpp
+ )
+ target_include_directories(app PRIVATE
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/ota_requestor/include/
+ )
+endif()
+
+chip_configure_data_model(app
+ INCLUDE_SERVER
+ ZAP_FILE ${ALL_CLUSTERS_COMMON_DIR}/../../thermostat/nxp/zap/thermostat_matter_wifi.zap
+)
+
+if(CONFIG_CHIP_LIB_SHELL)
+ target_compile_definitions(app PRIVATE ENABLE_CHIP_SHELL)
+ target_include_directories(app PRIVATE
+ ${CHIP_ROOT}/examples/shell/shell_common/include
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/matter_cli/include
+ )
+ target_sources(app PRIVATE
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/matter_cli/source/AppCLIBase.cpp
+ ${EXAMPLE_PLATFORM_NXP_COMMON_DIR}/matter_cli/source/AppCLIZephyr.cpp
+ ${CHIP_ROOT}/examples/shell/shell_common/cmd_misc.cpp
+ ${CHIP_ROOT}/examples/shell/shell_common/cmd_otcli.cpp
+ ${CHIP_ROOT}/examples/shell/shell_common/cmd_server.cpp
+ )
+endif()
diff --git a/examples/thermostat/nxp/zephyr/Kconfig b/examples/thermostat/nxp/zephyr/Kconfig
new file mode 100644
index 00000000000000..72e90f047d1e38
--- /dev/null
+++ b/examples/thermostat/nxp/zephyr/Kconfig
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2024 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.
+#
+mainmenu "Matter NXP Thermostat Example Application"
+
+rsource "../../../../config/nxp/chip-module/Kconfig.features"
+rsource "../../../../config/nxp/chip-module/Kconfig.defaults"
+source "Kconfig.zephyr"
diff --git a/examples/thermostat/nxp/zephyr/README.md b/examples/thermostat/nxp/zephyr/README.md
new file mode 100644
index 00000000000000..84d3fb9e59cf01
--- /dev/null
+++ b/examples/thermostat/nxp/zephyr/README.md
@@ -0,0 +1,4 @@
+# CHIP NXP Zephyr Thermostat Application
+
+All instructions describing how to use a Matter application on NXP Zephyr can be
+found in [README.md](../../../all-clusters-app/nxp/zephyr/README.md) root readme
diff --git a/examples/thermostat/nxp/zephyr/boards/rd_rw612_bga.overlay b/examples/thermostat/nxp/zephyr/boards/rd_rw612_bga.overlay
new file mode 100644
index 00000000000000..86bb20739527cd
--- /dev/null
+++ b/examples/thermostat/nxp/zephyr/boards/rd_rw612_bga.overlay
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2023-2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+/ {
+ chosen {
+ zephyr,console = &flexcomm0;
+ zephyr,shell-uart = &flexcomm3;
+ };
+};
+
+&flexcomm0 {
+ compatible = "nxp,lpc-usart";
+ status = "okay";
+ current-speed = <115200>;
+ pinctrl-0 = <&pinmux_flexcomm0_usart>;
+ pinctrl-names = "default";
+};
+
+&flexcomm3 {
+ compatible = "nxp,lpc-usart";
+ status = "okay";
+ current-speed = <115200>;
+ pinctrl-0 = <&pinmux_flexcomm3_usart>;
+ pinctrl-names = "default";
+};
diff --git a/examples/thermostat/nxp/zephyr/boards/rd_rw612_bga_fdata.conf b/examples/thermostat/nxp/zephyr/boards/rd_rw612_bga_fdata.conf
new file mode 100644
index 00000000000000..73d139c3948d95
--- /dev/null
+++ b/examples/thermostat/nxp/zephyr/boards/rd_rw612_bga_fdata.conf
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2023-2024 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.
+#
+
+CONFIG_SETTINGS_NVS_SECTOR_COUNT=16
+
+# 0xA226
+CONFIG_CHIP_DEVICE_PRODUCT_ID=41510
+CONFIG_CHIP_DEVICE_PRODUCT_URL="https://www.nxp.com/products/wireless-connectivity/wi-fi-plus-bluetooth-plus-802-15-4/wireless-mcu-with-integrated-tri-radio-1x1-wi-fi-6-plus-bluetooth-low-energy-5-3-802-15-4:RW612"
+CONFIG_CHIP_DEVICE_PRODUCT_LABEL="RW612"
+CONFIG_CHIP_DEVICE_PART_NUMBER="RW612"
diff --git a/examples/thermostat/nxp/zephyr/main/include/CHIPProjectConfig.h b/examples/thermostat/nxp/zephyr/main/include/CHIPProjectConfig.h
new file mode 100644
index 00000000000000..84c57df1ea140d
--- /dev/null
+++ b/examples/thermostat/nxp/zephyr/main/include/CHIPProjectConfig.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2023-2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+/**
+ * @file
+ * Example project configuration file for CHIP.
+ *
+ * This is a place to put application or project-specific overrides
+ * to the default configuration values for general CHIP features.
+ *
+ */
+
+#pragma once
+
+// Use a default pairing code if one hasn't been provisioned in flash.
+#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE CONFIG_CHIP_DEVICE_SPAKE2_PASSCODE
+#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR CONFIG_CHIP_DEVICE_DISCRIMINATOR
+
+// All clusters app has 3 group endpoints. This needs to defined here so that
+// CHIP_CONFIG_MAX_GROUPS_PER_FABRIC is properly configured.
+#define CHIP_CONFIG_MAX_GROUP_ENDPOINTS_PER_FABRIC 3
diff --git a/examples/thermostat/nxp/zephyr/main/main.cpp b/examples/thermostat/nxp/zephyr/main/main.cpp
new file mode 100644
index 00000000000000..9be47dfe0a95d8
--- /dev/null
+++ b/examples/thermostat/nxp/zephyr/main/main.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2023-2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include "AppTask.h"
+
+#include
+
+LOG_MODULE_REGISTER(app, CONFIG_CHIP_APP_LOG_LEVEL);
+
+using namespace ::chip;
+
+int main()
+{
+ CHIP_ERROR err = CHIP_NO_ERROR;
+
+ if (err == CHIP_NO_ERROR)
+ {
+ err = chip::NXP::App::GetAppTask().Start();
+ }
+
+ LOG_ERR("Exited with code %" CHIP_ERROR_FORMAT, err.Format());
+ return err == CHIP_NO_ERROR ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/examples/thermostat/nxp/zephyr/prj.conf b/examples/thermostat/nxp/zephyr/prj.conf
new file mode 100644
index 00000000000000..8bb5bd9f275756
--- /dev/null
+++ b/examples/thermostat/nxp/zephyr/prj.conf
@@ -0,0 +1,59 @@
+#
+# Copyright (c) 2023-2024 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.
+#
+
+# This sample uses Kconfig.defaults to set options common for all
+# samples. This file should contain only options specific for this sample
+# or overrides of default values.
+
+# Enable CHIP
+CONFIG_CHIP=y
+CONFIG_STD_CPP17=y
+CONFIG_CHIP_PROJECT_CONFIG="main/include/CHIPProjectConfig.h"
+CONFIG_CHIP_ENABLE_PAIRING_AUTOSTART=y
+# CHIP PID: 32769 == 0x8001 (all-clusters-app)
+CONFIG_CHIP_DEVICE_PRODUCT_ID=32769
+CONFIG_CHIP_DEVICE_PRODUCT_NAME="Thermostat"
+CONFIG_CHIP_DEVICE_DISCRIMINATOR=0x800
+
+# Enable MbedTLS PSA - heavily experimental, not thread safe yet
+# CONFIG_CHIP_CRYPTO_PSA=y
+
+# Bluetooth overrides
+CONFIG_BT_DEVICE_NAME="Thermostat"
+
+# Additional configs for debbugging experience.
+CONFIG_THREAD_NAME=y
+CONFIG_MPU_STACK_GUARD=y
+
+CONFIG_DEBUG=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_THREAD_INFO=y
+# use this config if stepping during debug session is not consistent
+# CONFIG_NO_OPTIMIZATIONS=y
+CONFIG_EXCEPTION_STACK_TRACE=y
+CONFIG_ASSERT=y
+# by default west will generate the full assembly output, which can take several minutes when binaries are large
+CONFIG_OUTPUT_DISASSEMBLY=n
+# embedded thread analyzer with thread statistics (stack usage, cpu usage...)
+# CONFIG_THREAD_ANALYZER=y
+# CONFIG_THREAD_ANALYZER_USE_PRINTK=y
+# CONFIG_THREAD_ANALYZER_AUTO=y
+
+# enable Matter CLI
+CONFIG_CHIP_LIB_SHELL=y
+# enable NET commands if desired
+#CONFIG_NET_SHELL=y
+CONFIG_CHIP_STATISTICS=y
diff --git a/examples/thermostat/nxp/zephyr/prj_fdata.conf b/examples/thermostat/nxp/zephyr/prj_fdata.conf
new file mode 100644
index 00000000000000..ee559b42ed9a71
--- /dev/null
+++ b/examples/thermostat/nxp/zephyr/prj_fdata.conf
@@ -0,0 +1,80 @@
+#
+# Copyright (c) 2023-2024 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.
+#
+
+# This sample uses Kconfig.defaults to set options common for all
+# samples. This file should contain only options specific for this sample
+# or overrides of default values.
+
+# Enable CHIP
+CONFIG_CHIP=y
+CONFIG_STD_CPP17=y
+CONFIG_CHIP_PROJECT_CONFIG="main/include/CHIPProjectConfig.h"
+CONFIG_CHIP_ENABLE_PAIRING_AUTOSTART=y
+
+# Enable MbedTLS PSA - heavily experimental, not thread safe yet
+# CONFIG_CHIP_CRYPTO_PSA=y
+
+# Bluetooth overrides
+CONFIG_BT_DEVICE_NAME="Thermostat"
+
+# enable Matter CLI
+CONFIG_CHIP_LIB_SHELL=y
+CONFIG_CHIP_STATISTICS=y
+
+# Factory data configuration
+CONFIG_CHIP_DEVICE_VENDOR_ID=4151
+CONFIG_CHIP_DEVICE_DISCRIMINATOR=0xA00
+CONFIG_CHIP_DEVICE_SPAKE2_PASSCODE=14014
+CONFIG_CHIP_DEVICE_PRODUCT_NAME="Thermostat"
+CONFIG_CHIP_DEVICE_TYPE=769
+CONFIG_CHIP_DEVICE_MANUFACTURING_DATE="2023-01-01"
+CONFIG_CHIP_DEVICE_SERIAL_NUMBER="12345678"
+CONFIG_CHIP_DEVICE_PRODUCT_COLOR="Green"
+CONFIG_CHIP_DEVICE_PRODUCT_FINISH="Matte"
+
+# Use factory data provider for device info
+CONFIG_CHIP_FACTORY_DATA=y
+# Generate factor data raw binary during the build process
+# CONFIG_CHIP_FACTORY_DATA_BUILD=y
+# Generate test certificates for factory data during the build process
+# CONFIG_CHIP_FACTORY_DATA_CERT_SOURCE_GENERATED=y
+# Spake2p verifier will be generated during factory data generation
+# CONFIG_CHIP_FACTORY_DATA_GENERATE_SPAKE2_VERIFIER=y
+
+# Example of using pre-generated certificates
+# CONFIG_CHIP_FACTORY_DATA_CERT_SOURCE_USER=y
+# CONFIG_CHIP_FACTORY_DATA_USER_CERTS_CD_CERT="/Chip-Test-CD-1037-A226.der"
+# CONFIG_CHIP_FACTORY_DATA_USER_CERTS_DAC_CERT="/Chip-DAC-NXP-1037-A226-Cert.der"
+# CONFIG_CHIP_FACTORY_DATA_USER_CERTS_DAC_KEY="/Chip-DAC-NXP-1037-A226-Key.der"
+# CONFIG_CHIP_FACTORY_DATA_USER_CERTS_PAI_CERT="/Chip-PAI-NXP-1037-A226-Cert.der"
+
+# Additional configs for debbugging experience.
+CONFIG_THREAD_NAME=y
+CONFIG_MPU_STACK_GUARD=y
+
+CONFIG_DEBUG=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_THREAD_INFO=y
+# use this config if stepping during debug session is not consistent
+# CONFIG_NO_OPTIMIZATIONS=y
+CONFIG_EXCEPTION_STACK_TRACE=y
+CONFIG_ASSERT=y
+# by default west will generate the full assembly output, which can take several minutes when binaries are large
+CONFIG_OUTPUT_DISASSEMBLY=n
+# embedded thread analyzer with thread statistics (stack usage, cpu usage...)
+# CONFIG_THREAD_ANALYZER=y
+# CONFIG_THREAD_ANALYZER_USE_PRINTK=y
+# CONFIG_THREAD_ANALYZER_AUTO=y
diff --git a/examples/thermostat/nxp/zephyr/prj_ota.conf b/examples/thermostat/nxp/zephyr/prj_ota.conf
new file mode 100644
index 00000000000000..bdc65e94fabf70
--- /dev/null
+++ b/examples/thermostat/nxp/zephyr/prj_ota.conf
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+# All rights reserved.
+#
+# 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.
+#
+
+# Options needed for OTA are located on this file
+# This file should contain only options specific for this sample
+# or overrides the default ones.
+
+CONFIG_CHIP_OTA_REQUESTOR=y
+
+# To generate an OTA image based on the application
+CONFIG_CHIP_OTA_IMAGE_BUILD=y
+
+# By default, MCUBOOT bootloader uses a signature key provided in their repository.
+# Change the key to the appropriate one.
+# Note: You need to use the same signature key used by MCUBOOT, i.e BOOT_SIGNATURE_KEY_FILE.
+# Default CONFIG_BOOT_SIGNATURE_KEY_FILE is defined in config/nxp/app/bootloader.conf
+CONFIG_MCUBOOT_SIGNATURE_KEY_FILE="./bootloader/mcuboot/root-rsa-2048.pem"
diff --git a/examples/thermostat/nxp/zephyr/third_party/connectedhomeip b/examples/thermostat/nxp/zephyr/third_party/connectedhomeip
new file mode 120000
index 00000000000000..3efed95be5dbe9
--- /dev/null
+++ b/examples/thermostat/nxp/zephyr/third_party/connectedhomeip
@@ -0,0 +1 @@
+../../../../../
\ No newline at end of file
diff --git a/examples/tv-app/android/App/content-app/src/main/AndroidManifest.xml b/examples/tv-app/android/App/content-app/src/main/AndroidManifest.xml
index 61d036e0a90ef4..fff52c4b59db7e 100644
--- a/examples/tv-app/android/App/content-app/src/main/AndroidManifest.xml
+++ b/examples/tv-app/android/App/content-app/src/main/AndroidManifest.xml
@@ -19,7 +19,7 @@
-
+
diff --git a/examples/tv-app/android/App/platform-app/src/main/AndroidManifest.xml b/examples/tv-app/android/App/platform-app/src/main/AndroidManifest.xml
index b6e00cd75d0365..476faa2030c7a2 100644
--- a/examples/tv-app/android/App/platform-app/src/main/AndroidManifest.xml
+++ b/examples/tv-app/android/App/platform-app/src/main/AndroidManifest.xml
@@ -26,6 +26,9 @@
tools:ignore="QueryAllPackagesPermission" />
+
+
+
tasks = activityManager.getRunningTasks(1);
+ if (tasks != null && !tasks.isEmpty()) {
+ ActivityManager.RunningTaskInfo taskInfo = tasks.get(0);
+ String packageName =
+ taskInfo.topActivity != null ? taskInfo.topActivity.getPackageName() : "";
+ return packageName.equals(contentAppPackageName);
+ }
+ return false;
+ }
+
public String sendCommand(int endpointId, long clusterId, long commandId, String commandPayload) {
Log.d(TAG, "Received a command for endpointId " + endpointId + ". Message " + commandPayload);
@@ -26,6 +55,17 @@ public String sendCommand(int endpointId, long clusterId, long commandId, String
ContentAppDiscoveryService.getReceiverInstance().getDiscoveredContentApps().values(),
endpointId);
if (discoveredApp != null) {
+ // Intercept NavigateTarget and LaunchContent commands and launch content app if necessary
+ if (isForegroundCommand(clusterId, commandId)) {
+ // Check if contentapp main/launch activity is already in foreground before launching.
+ if (!isAppInForeground(discoveredApp.getAppName())) {
+ Intent launchIntent =
+ context.getPackageManager().getLaunchIntentForPackage(discoveredApp.getAppName());
+ if (launchIntent != null) {
+ context.startActivity(launchIntent);
+ }
+ }
+ }
Log.d(TAG, "Sending a command for endpointId " + endpointId + ". Message " + commandPayload);
return ContentAppAgentService.sendCommand(
context, discoveredApp.getAppName(), clusterId, commandId, commandPayload);
diff --git a/examples/tv-app/android/App/platform-app/src/main/java/com/matter/tv/server/model/ContentApp.java b/examples/tv-app/android/App/platform-app/src/main/java/com/matter/tv/server/model/ContentApp.java
index e30a75a00d98b2..0cd12b404d6fcf 100644
--- a/examples/tv-app/android/App/platform-app/src/main/java/com/matter/tv/server/model/ContentApp.java
+++ b/examples/tv-app/android/App/platform-app/src/main/java/com/matter/tv/server/model/ContentApp.java
@@ -25,6 +25,7 @@ public ContentApp(
this.vendorId = vendorId;
this.productId = productId;
this.version = version;
+ this.supportedClusters = Collections.EMPTY_SET;
}
public ContentApp(
@@ -67,9 +68,7 @@ public void setEndpointId(int endpoint) {
}
public Set getSupportedClusters() {
- return supportedClusters != null
- ? Collections.unmodifiableSet(supportedClusters)
- : Collections.EMPTY_SET;
+ return Collections.unmodifiableSet(supportedClusters);
}
public String getVersion() {
diff --git a/examples/tv-app/android/App/platform-app/src/main/java/com/matter/tv/server/utils/EndpointsDataStore.java b/examples/tv-app/android/App/platform-app/src/main/java/com/matter/tv/server/utils/EndpointsDataStore.java
index f587905fb09145..227ea9326be538 100644
--- a/examples/tv-app/android/App/platform-app/src/main/java/com/matter/tv/server/utils/EndpointsDataStore.java
+++ b/examples/tv-app/android/App/platform-app/src/main/java/com/matter/tv/server/utils/EndpointsDataStore.java
@@ -4,13 +4,18 @@
import android.content.SharedPreferences;
import android.util.JsonReader;
import android.util.JsonWriter;
+import com.matter.tv.app.api.SupportedCluster;
import com.matter.tv.server.model.ContentApp;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
import java.util.Map;
+import java.util.Set;
public class EndpointsDataStore {
@@ -21,6 +26,11 @@ public class EndpointsDataStore {
private static final String KEY_PRODUCTID = "PID";
private static final String KEY_VERSION = "VER";
private static final String KEY_ENDPOINTID = "EPID";
+ private static final String KEY_SUPPORTED_CLUSTERS = "supportedClusters";
+ private static final String KEY_CLUSTER_IDENTIFIER = "clusterIdentifier";
+ private static final String KEY_FEATURES = "features";
+ private static final String KEY_OPTIONAL_COMMAND_IDENTIFIERS = "optionalCommandIdentifiers";
+ private static final String KEY_OPTIONAL_ATTRIBUTES_IDENTIFIERS = "optionalAttributesIdentifiers";
private static EndpointsDataStore instance;
private final SharedPreferences discoveredEndpoints;
Map persistedContentApps = new HashMap<>();
@@ -57,19 +67,20 @@ private String serializeContentApp(ContentApp app) {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
try {
- jsonWriter
- .beginObject()
- .name(KEY_VENDORID)
- .value(app.getVendorId())
- .name(KEY_VENDORNAME)
- .value(app.getVendorName())
- .name(KEY_PRODUCTID)
- .value(app.getProductId())
- .name(KEY_VERSION)
- .value(app.getVersion())
- .name(KEY_ENDPOINTID)
- .value(app.getEndpointId())
- .endObject();
+ jsonWriter.beginObject();
+ jsonWriter.name(KEY_VENDORID);
+ jsonWriter.value(app.getVendorId());
+ jsonWriter.name(KEY_VENDORNAME);
+ jsonWriter.value(app.getVendorName());
+ jsonWriter.name(KEY_PRODUCTID);
+ jsonWriter.value(app.getProductId());
+ jsonWriter.name(KEY_VERSION);
+ jsonWriter.value(app.getVersion());
+ jsonWriter.name(KEY_ENDPOINTID);
+ jsonWriter.value(app.getEndpointId());
+ jsonWriter.name(KEY_SUPPORTED_CLUSTERS);
+ serializeSupportedClusters(jsonWriter, app.getSupportedClusters());
+ jsonWriter.endObject();
jsonWriter.flush();
jsonWriter.close();
} catch (IOException e) {
@@ -88,6 +99,7 @@ private ContentApp deserializeContentApp(String appName, String appMetadata) {
int vendorId = 0;
int productId = 0;
int endpoint = ContentApp.INVALID_ENDPOINTID;
+ Set supportedClusters = new HashSet<>();
while (jsonReader.hasNext()) {
String name = jsonReader.nextName();
switch (name) {
@@ -106,9 +118,12 @@ private ContentApp deserializeContentApp(String appName, String appMetadata) {
case KEY_ENDPOINTID:
endpoint = jsonReader.nextInt();
break;
+ case KEY_SUPPORTED_CLUSTERS:
+ supportedClusters = deserializeSupportedClusters(jsonReader);
+ break;
}
}
- app = new ContentApp(appName, vendorName, vendorId, productId, version);
+ app = new ContentApp(appName, vendorName, vendorId, productId, version, supportedClusters);
jsonReader.endObject();
jsonReader.close();
} catch (IOException e) {
@@ -116,4 +131,86 @@ private ContentApp deserializeContentApp(String appName, String appMetadata) {
}
return app;
}
+
+ private void serializeSupportedClusters(
+ JsonWriter jsonWriter, Set supportedClusters) throws IOException {
+ if (supportedClusters != null) {
+ jsonWriter.beginArray();
+ for (SupportedCluster supportedCluster : supportedClusters) {
+ if (supportedCluster != null) {
+ serializeSupportedCluster(jsonWriter, supportedCluster);
+ }
+ }
+ jsonWriter.endArray();
+ }
+ }
+
+ private Set deserializeSupportedClusters(JsonReader jsonReader)
+ throws IOException {
+ Set supportedClusters = new HashSet<>();
+ jsonReader.beginArray();
+ while (jsonReader.hasNext()) {
+ supportedClusters.add(deserializeSupportedCluster(jsonReader));
+ }
+ jsonReader.endArray();
+ return supportedClusters;
+ }
+
+ private void serializeSupportedCluster(JsonWriter jsonWriter, SupportedCluster supportedCluster)
+ throws IOException {
+ jsonWriter.beginObject();
+ jsonWriter.name(KEY_CLUSTER_IDENTIFIER);
+ jsonWriter.value(supportedCluster.clusterIdentifier);
+ jsonWriter.name(KEY_FEATURES);
+ jsonWriter.value(supportedCluster.features);
+ jsonWriter.name(KEY_OPTIONAL_COMMAND_IDENTIFIERS);
+ serializeIntArray(jsonWriter, supportedCluster.optionalCommandIdentifiers);
+ jsonWriter.name(KEY_OPTIONAL_ATTRIBUTES_IDENTIFIERS);
+ serializeIntArray(jsonWriter, supportedCluster.optionalAttributesIdentifiers);
+ jsonWriter.endObject();
+ }
+
+ private SupportedCluster deserializeSupportedCluster(JsonReader jsonReader) throws IOException {
+ SupportedCluster supportedCluster = new SupportedCluster();
+ jsonReader.beginObject();
+ while (jsonReader.hasNext()) {
+ String name = jsonReader.nextName();
+ switch (name) {
+ case KEY_CLUSTER_IDENTIFIER:
+ supportedCluster.clusterIdentifier = jsonReader.nextInt();
+ break;
+ case KEY_FEATURES:
+ supportedCluster.features = jsonReader.nextInt();
+ break;
+ case KEY_OPTIONAL_COMMAND_IDENTIFIERS:
+ supportedCluster.optionalCommandIdentifiers = deserializeIntArray(jsonReader);
+ break;
+ case KEY_OPTIONAL_ATTRIBUTES_IDENTIFIERS:
+ supportedCluster.optionalAttributesIdentifiers = deserializeIntArray(jsonReader);
+ break;
+ }
+ }
+ jsonReader.endObject();
+ return supportedCluster;
+ }
+
+ private void serializeIntArray(JsonWriter jsonWriter, int[] array) throws IOException {
+ jsonWriter.beginArray();
+ if (array != null) {
+ for (int value : array) {
+ jsonWriter.value(value);
+ }
+ }
+ jsonWriter.endArray();
+ }
+
+ private int[] deserializeIntArray(JsonReader jsonReader) throws IOException {
+ List dynamicArray = new ArrayList<>();
+ jsonReader.beginArray();
+ while (jsonReader.hasNext()) {
+ dynamicArray.add(jsonReader.nextInt());
+ }
+ jsonReader.endArray();
+ return dynamicArray.stream().mapToInt(Integer::intValue).toArray();
+ }
}
diff --git a/examples/tv-app/android/java/AppImpl.cpp b/examples/tv-app/android/java/AppImpl.cpp
index 4dfabd03f12ec6..c24e7e537dbb23 100644
--- a/examples/tv-app/android/java/AppImpl.cpp
+++ b/examples/tv-app/android/java/AppImpl.cpp
@@ -355,6 +355,87 @@ ContentApp * ContentAppFactoryImpl::LoadContentApp(const CatalogVendorApp & vend
return nullptr;
}
+class DevicePairedCommand : public Controller::DevicePairingDelegate
+{
+public:
+ struct CallbackContext
+ {
+ uint16_t vendorId;
+ uint16_t productId;
+ chip::NodeId nodeId;
+
+ CallbackContext(uint16_t vId, uint16_t pId, chip::NodeId nId) : vendorId(vId), productId(pId), nodeId(nId) {}
+ };
+ DevicePairedCommand(uint16_t vendorId, uint16_t productId, chip::NodeId nodeId) :
+ mOnDeviceConnectedCallback(OnDeviceConnectedFn, this), mOnDeviceConnectionFailureCallback(OnDeviceConnectionFailureFn, this)
+ {
+ mContext = std::make_shared(vendorId, productId, nodeId);
+ }
+
+ static void OnDeviceConnectedFn(void * context, chip::Messaging::ExchangeManager & exchangeMgr,
+ const chip::SessionHandle & sessionHandle)
+ {
+ auto * pairingCommand = static_cast(context);
+ auto cbContext = pairingCommand->mContext;
+
+ if (pairingCommand)
+ {
+ ChipLogProgress(DeviceLayer,
+ "OnDeviceConnectedFn - Updating ACL for node id: " ChipLogFormatX64
+ " and vendor id: %d and product id: %d",
+ ChipLogValueX64(cbContext->nodeId), cbContext->vendorId, cbContext->productId);
+
+ GetCommissionerDiscoveryController()->CommissioningSucceeded(cbContext->vendorId, cbContext->productId,
+ cbContext->nodeId, exchangeMgr, sessionHandle);
+ }
+ }
+
+ static void OnDeviceConnectionFailureFn(void * context, const ScopedNodeId & peerId, CHIP_ERROR error)
+ {
+ auto * pairingCommand = static_cast(context);
+ auto cbContext = pairingCommand->mContext;
+
+ if (pairingCommand)
+ {
+ ChipLogProgress(DeviceLayer,
+ "OnDeviceConnectionFailureFn - Not updating ACL for node id: " ChipLogFormatX64
+ " and vendor id: %d and product id: %d",
+ ChipLogValueX64(cbContext->nodeId), cbContext->vendorId, cbContext->productId);
+ // TODO: Remove Node Id
+ }
+ }
+
+ chip::Callback::Callback mOnDeviceConnectedCallback;
+ chip::Callback::Callback mOnDeviceConnectionFailureCallback;
+ std::shared_ptr mContext;
+};
+
+void refreshConnectedClientsAcl(uint16_t vendorId, uint16_t productId, ContentAppImpl * app)
+{
+
+ std::set nodeIds = ContentAppPlatform::GetInstance().GetNodeIdsForContentApp(vendorId, productId);
+
+ for (const auto & allowedVendor : app->GetApplicationBasicDelegate()->GetAllowedVendorList())
+ {
+ std::set tempNodeIds = ContentAppPlatform::GetInstance().GetNodeIdsForAllowVendorId(allowedVendor);
+
+ nodeIds.insert(tempNodeIds.begin(), tempNodeIds.end());
+ }
+
+ for (const auto & nodeId : nodeIds)
+ {
+
+ ChipLogProgress(DeviceLayer,
+ "Creating Pairing Command with node id: " ChipLogFormatX64 " and vendor id: %d and product id: %d",
+ ChipLogValueX64(nodeId), vendorId, productId);
+
+ std::shared_ptr pairingCommand = std::make_shared(vendorId, productId, nodeId);
+
+ GetDeviceCommissioner()->GetConnectedDevice(nodeId, &pairingCommand->mOnDeviceConnectedCallback,
+ &pairingCommand->mOnDeviceConnectionFailureCallback);
+ }
+}
+
EndpointId ContentAppFactoryImpl::AddContentApp(const char * szVendorName, uint16_t vendorId, const char * szApplicationName,
uint16_t productId, const char * szApplicationVersion,
std::vector supportedClusters, jobject manager)
@@ -369,6 +450,9 @@ EndpointId ContentAppFactoryImpl::AddContentApp(const char * szVendorName, uint1
app->GetEndpointId());
mContentApps.push_back(app);
mDataVersions.push_back(dataVersionBuf);
+
+ refreshConnectedClientsAcl(vendorId, productId, app);
+
return epId;
}
@@ -387,6 +471,9 @@ EndpointId ContentAppFactoryImpl::AddContentApp(const char * szVendorName, uint1
app->GetEndpointId());
mContentApps.push_back(app);
mDataVersions.push_back(dataVersionBuf);
+
+ refreshConnectedClientsAcl(vendorId, productId, app);
+
return epId;
}
diff --git a/examples/tv-app/android/java/TVApp-JNI.cpp b/examples/tv-app/android/java/TVApp-JNI.cpp
index 04b5f4199edcaa..65a0a4409e9b8f 100644
--- a/examples/tv-app/android/java/TVApp-JNI.cpp
+++ b/examples/tv-app/android/java/TVApp-JNI.cpp
@@ -258,6 +258,8 @@ class MyPostCommissioningListener : public PostCommissioningListener
// read current binding list
chip::Controller::ClusterBase cluster(exchangeMgr, sessionHandle, kTargetBindingClusterEndpointId);
+ ContentAppPlatform::GetInstance().StoreNodeIdForContentApp(vendorId, productId, nodeId);
+
cacheContext(vendorId, productId, nodeId, exchangeMgr, sessionHandle);
CHIP_ERROR err =
diff --git a/examples/tv-app/linux/main.cpp b/examples/tv-app/linux/main.cpp
index 29fdd69cb36792..c2055e0abd03f3 100644
--- a/examples/tv-app/linux/main.cpp
+++ b/examples/tv-app/linux/main.cpp
@@ -45,6 +45,31 @@ void ApplicationInit()
ChipLogDetail(DeviceLayer, "TV Linux App: Warning - Fixed Content App Endpoint Not Disabled");
// Can't disable this without breaking CI unit tests that act upon account login cluster (only available on ep3)
// emberAfEndpointEnableDisable(3, false);
+
+#if CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED
+ // Install Content Apps
+ ContentAppFactoryImpl * factory = GetContentAppFactoryImpl();
+
+ // Content App 1
+ constexpr uint16_t kApp1VendorId = 65521;
+ constexpr uint16_t kApp1ProductId = 32769;
+ factory->InstallContentApp(kApp1VendorId, kApp1ProductId);
+
+ // Content App 2
+ constexpr uint16_t kApp2VendorId = 1;
+ constexpr uint16_t kApp2ProductId = 11;
+ factory->InstallContentApp(kApp2VendorId, kApp2ProductId);
+
+ // Content App 3
+ constexpr uint16_t kApp3VendorId = 9050;
+ constexpr uint16_t kApp3ProductId = 22;
+ factory->InstallContentApp(kApp3VendorId, kApp3ProductId);
+
+ // Content App 4
+ constexpr uint16_t kApp4VendorId = 1111;
+ constexpr uint16_t kApp4ProductId = 22;
+ factory->InstallContentApp(kApp4VendorId, kApp4ProductId);
+#endif // CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED
}
void ApplicationShutdown() {}
diff --git a/examples/tv-app/tv-common/shell/AppTvShellCommands.cpp b/examples/tv-app/tv-common/shell/AppTvShellCommands.cpp
index b39e84ad40f89a..5125ebbbbd7ecd 100644
--- a/examples/tv-app/tv-common/shell/AppTvShellCommands.cpp
+++ b/examples/tv-app/tv-common/shell/AppTvShellCommands.cpp
@@ -209,6 +209,10 @@ static CHIP_ERROR PrintAllCommands()
#if CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE
streamer_printf(sout, " print-app-access Print all ACLs for app platform fabric. Usage: app print-app-access\r\n");
streamer_printf(sout, " remove-app-access Remove all ACLs for app platform fabric. Usage: app remove-app-access\r\n");
+ streamer_printf(
+ sout,
+ " print-installed-apps Print all installed content apps with their endpoints. Usage: app print-installed-apps\r\n");
+
streamer_printf(sout,
" commission Commission given udc-entry using given pincode from corresponding app. Usage: "
"app commission 0\r\n");
@@ -436,6 +440,13 @@ static CHIP_ERROR AppPlatformHandler(int argc, char ** argv)
Access::GetAccessControl().DeleteAllEntriesForFabric(GetDeviceCommissioner()->GetFabricIndex());
return CHIP_NO_ERROR;
}
+ else if (strcmp(argv[0], "print-installed-apps") == 0)
+ {
+ ContentAppFactoryImpl * factory = GetContentAppFactoryImpl();
+ factory->LogInstalledApps();
+
+ return CHIP_NO_ERROR;
+ }
else if (strcmp(argv[0], "commission") == 0)
{
if (argc < 2)
diff --git a/examples/tv-app/tv-common/src/AppTv.cpp b/examples/tv-app/tv-common/src/AppTv.cpp
index 03422c3fa462e7..8d81d9cf6c2c5c 100644
--- a/examples/tv-app/tv-common/src/AppTv.cpp
+++ b/examples/tv-app/tv-common/src/AppTv.cpp
@@ -164,6 +164,8 @@ class MyPostCommissioningListener : public PostCommissioningListener
// read current binding list
chip::Controller::ClusterBase cluster(exchangeMgr, sessionHandle, kTargetBindingClusterEndpointId);
+ ContentAppPlatform::GetInstance().StoreNodeIdForContentApp(vendorId, productId, nodeId);
+
cacheContext(vendorId, productId, nodeId, exchangeMgr, sessionHandle);
CHIP_ERROR err =
@@ -565,6 +567,63 @@ void ContentAppFactoryImpl::AddAdminVendorId(uint16_t vendorId)
mAdminVendorIds.push_back(vendorId);
}
+#if CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE
+class DevicePairedCommand : public Controller::DevicePairingDelegate
+{
+public:
+ struct CallbackContext
+ {
+ uint16_t vendorId;
+ uint16_t productId;
+ chip::NodeId nodeId;
+
+ CallbackContext(uint16_t vId, uint16_t pId, chip::NodeId nId) : vendorId(vId), productId(pId), nodeId(nId) {}
+ };
+ DevicePairedCommand(uint16_t vendorId, uint16_t productId, chip::NodeId nodeId) :
+ mOnDeviceConnectedCallback(OnDeviceConnectedFn, this), mOnDeviceConnectionFailureCallback(OnDeviceConnectionFailureFn, this)
+ {
+ mContext = std::make_shared(vendorId, productId, nodeId);
+ }
+
+ static void OnDeviceConnectedFn(void * context, chip::Messaging::ExchangeManager & exchangeMgr,
+ const chip::SessionHandle & sessionHandle)
+ {
+ auto * pairingCommand = static_cast(context);
+ auto cbContext = pairingCommand->mContext;
+
+ if (pairingCommand)
+ {
+ ChipLogProgress(DeviceLayer,
+ "OnDeviceConnectedFn - Updating ACL for node id: " ChipLogFormatX64
+ " and vendor id: %d and product id: %d",
+ ChipLogValueX64(cbContext->nodeId), cbContext->vendorId, cbContext->productId);
+
+ GetCommissionerDiscoveryController()->CommissioningSucceeded(cbContext->vendorId, cbContext->productId,
+ cbContext->nodeId, exchangeMgr, sessionHandle);
+ }
+ }
+
+ static void OnDeviceConnectionFailureFn(void * context, const ScopedNodeId & peerId, CHIP_ERROR error)
+ {
+ auto * pairingCommand = static_cast(context);
+ auto cbContext = pairingCommand->mContext;
+
+ if (pairingCommand)
+ {
+ ChipLogProgress(DeviceLayer,
+ "OnDeviceConnectionFailureFn - Not updating ACL for node id: " ChipLogFormatX64
+ " and vendor id: %d and product id: %d",
+ ChipLogValueX64(cbContext->nodeId), cbContext->vendorId, cbContext->productId);
+ // TODO: Remove Node Id
+ }
+ }
+
+ chip::Callback::Callback mOnDeviceConnectedCallback;
+ chip::Callback::Callback mOnDeviceConnectionFailureCallback;
+ std::shared_ptr mContext;
+};
+#endif // CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE
+
void ContentAppFactoryImpl::InstallContentApp(uint16_t vendorId, uint16_t productId)
{
auto make_default_supported_clusters = []() {
@@ -605,6 +664,46 @@ void ContentAppFactoryImpl::InstallContentApp(uint16_t vendorId, uint16_t produc
make_default_supported_clusters());
mContentApps.emplace_back(std::move(ptr));
}
+
+#if CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE
+ // Get the list of node ids
+ std::set nodeIds = ContentAppPlatform::GetInstance().GetNodeIdsForContentApp(vendorId, productId);
+
+ // update ACLs
+ for (auto & contentApp : mContentApps)
+ {
+ auto app = contentApp.get();
+
+ if (app->MatchesPidVid(productId, vendorId))
+ {
+ CatalogVendorApp vendorApp = app->GetApplicationBasicDelegate()->GetCatalogVendorApp();
+
+ GetContentAppFactoryImpl()->LoadContentApp(vendorApp);
+ }
+
+ // update the list of node ids with content apps allowed vendor list
+ for (const auto & allowedVendor : app->GetApplicationBasicDelegate()->GetAllowedVendorList())
+ {
+ std::set tempNodeIds = ContentAppPlatform::GetInstance().GetNodeIdsForAllowVendorId(allowedVendor);
+
+ nodeIds.insert(tempNodeIds.begin(), tempNodeIds.end());
+ }
+ }
+
+ // refresh ACLs
+ for (const auto & nodeId : nodeIds)
+ {
+
+ ChipLogProgress(DeviceLayer,
+ "Creating Pairing Command with node id: " ChipLogFormatX64 " and vendor id: %d and product id: %d",
+ ChipLogValueX64(nodeId), vendorId, productId);
+
+ std::shared_ptr pairingCommand = std::make_shared(vendorId, productId, nodeId);
+
+ GetDeviceCommissioner()->GetConnectedDevice(nodeId, &pairingCommand->mOnDeviceConnectedCallback,
+ &pairingCommand->mOnDeviceConnectionFailureCallback);
+ }
+#endif // CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE
}
bool ContentAppFactoryImpl::UninstallContentApp(uint16_t vendorId, uint16_t productId)
@@ -625,8 +724,9 @@ bool ContentAppFactoryImpl::UninstallContentApp(uint16_t vendorId, uint16_t prod
ChipLogProgress(DeviceLayer, "Found an app vid=%d pid=%d. Uninstalling it.",
app->GetApplicationBasicDelegate()->HandleGetVendorId(),
app->GetApplicationBasicDelegate()->HandleGetProductId());
+ EndpointId removedEndpointID = ContentAppPlatform::GetInstance().RemoveContentApp(app);
+ ChipLogProgress(DeviceLayer, "Removed content app at endpoint id: %d", removedEndpointID);
mContentApps.erase(mContentApps.begin() + index);
- // TODO: call ContentAppPlatform->RemoveContentApp(ids...)
return true;
}
@@ -701,22 +801,8 @@ std::list ContentAppFactoryImpl::GetAllowedClusterListForStaticEndpoi
CHIP_ERROR AppTvInit()
{
#if CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED
- // test data for apps
- constexpr uint16_t kApp1VendorId = 1;
- constexpr uint16_t kApp1ProductId = 11;
- constexpr uint16_t kApp2VendorId = 65521;
- constexpr uint16_t kApp2ProductId = 32769;
- constexpr uint16_t kApp3VendorId = 9050;
- constexpr uint16_t kApp3ProductId = 22;
- constexpr uint16_t kApp4VendorId = 1111;
- constexpr uint16_t kApp4ProductId = 22;
-
ContentAppPlatform::GetInstance().SetupAppPlatform();
ContentAppPlatform::GetInstance().SetContentAppFactory(&gFactory);
- gFactory.InstallContentApp(kApp1VendorId, kApp1ProductId);
- gFactory.InstallContentApp(kApp2VendorId, kApp2ProductId);
- gFactory.InstallContentApp(kApp3VendorId, kApp3ProductId);
- gFactory.InstallContentApp(kApp4VendorId, kApp4ProductId);
uint16_t value;
if (DeviceLayer::GetDeviceInstanceInfoProvider()->GetVendorId(value) != CHIP_NO_ERROR)
{
diff --git a/scripts/build/build/targets.py b/scripts/build/build/targets.py
index 0a72b3733a96d1..97f8e90af507d5 100755
--- a/scripts/build/build/targets.py
+++ b/scripts/build/build/targets.py
@@ -28,7 +28,7 @@
from builders.mw320 import MW320App, MW320Builder
from builders.nrf import NrfApp, NrfBoard, NrfConnectBuilder
from builders.nuttx import NuttXApp, NuttXBoard, NuttXBuilder
-from builders.nxp import NxpApp, NxpBoard, NxpBuilder
+from builders.nxp import NxpApp, NxpBoard, NxpBuilder, NxpOsUsed
from builders.openiotsdk import OpenIotSdkApp, OpenIotSdkBuilder, OpenIotSdkCryptoBackend
from builders.qpg import QpgApp, QpgBoard, QpgBuilder
from builders.rw61x import RW61XApp, RW61XBuilder
@@ -499,13 +499,23 @@ def BuildNxpTarget():
# boards
target.AppendFixedTargets([
TargetPart('k32w0', board=NxpBoard.K32W0),
- TargetPart('k32w1', board=NxpBoard.K32W1)
+ TargetPart('k32w1', board=NxpBoard.K32W1),
+ TargetPart('rw61x', board=NxpBoard.RW61X)
+ ])
+
+ # OS
+ target.AppendFixedTargets([
+ TargetPart('zephyr', os_env=NxpOsUsed.ZEPHYR).OnlyIfRe('rw61x'),
+ TargetPart('freertos', os_env=NxpOsUsed.FREERTOS).ExceptIfRe('rw61x'),
])
# apps
target.AppendFixedTargets([
TargetPart('lighting', app=NxpApp.LIGHTING).OnlyIfRe('(k32w0|k32w1)'),
- TargetPart('contact-sensor', app=NxpApp.CONTACT).OnlyIfRe('(k32w0|k32w1)')
+ TargetPart('contact-sensor', app=NxpApp.CONTACT).OnlyIfRe('(k32w0|k32w1)'),
+ TargetPart('all-clusters', app=NxpApp.ALLCLUSTERS).OnlyIfRe('rw61x'),
+ TargetPart('laundry-washer', app=NxpApp.LAUNDRYWASHER).OnlyIfRe('rw61x'),
+ TargetPart('thermostat', app=NxpApp.THERMOSTAT).OnlyIfRe('rw61x')
])
target.AppendModifier(name="factory", enable_factory_data=True)
@@ -513,8 +523,8 @@ def BuildNxpTarget():
target.AppendModifier(name="lit", enable_lit=True).OnlyIfRe('contact-sensor')
target.AppendModifier(name="fro32k", use_fro32k=True).OnlyIfRe('k32w0')
target.AppendModifier(name="smu2", smu2=True).OnlyIfRe('k32w1-lighting')
- target.AppendModifier(name="dac-conversion", convert_dac_pk=True).OnlyIfRe('factory').ExceptIfRe('k32w0')
- target.AppendModifier(name="rotating-id", enable_rotating_id=True)
+ target.AppendModifier(name="dac-conversion", convert_dac_pk=True).OnlyIfRe('factory').ExceptIfRe('(k32w0|rw61x)')
+ target.AppendModifier(name="rotating-id", enable_rotating_id=True).ExceptIfRe('rw61x')
target.AppendModifier(name="sw-v2", has_sw_version_2=True)
return target
diff --git a/scripts/build/builders/nxp.py b/scripts/build/builders/nxp.py
index 4bd4f0ae451875..74f40eaa0a36aa 100644
--- a/scripts/build/builders/nxp.py
+++ b/scripts/build/builders/nxp.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2021 Project CHIP Authors
+# Copyright (c) 2021-2024 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.
@@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+import logging
import os
from enum import Enum, auto
@@ -19,15 +20,31 @@
from .gn import GnBuilder
+class NxpOsUsed(Enum):
+ FREERTOS = auto()
+ ZEPHYR = auto()
+
+ def OsEnv(self):
+ if self == NxpOsUsed.ZEPHYR:
+ return 'zephyr'
+ elif self == NxpOsUsed.FREERTOS:
+ return 'freertos'
+ else:
+ raise Exception('Unknown OS type: %r' % self)
+
+
class NxpBoard(Enum):
K32W0 = auto()
K32W1 = auto()
+ RW61X = auto()
def Name(self):
if self == NxpBoard.K32W0:
return 'k32w0x'
elif self == NxpBoard.K32W1:
return 'k32w1'
+ elif self == NxpBoard.RW61X:
+ return 'rd_rw612_bga'
else:
raise Exception('Unknown board type: %r' % self)
@@ -36,6 +53,8 @@ def FolderName(self):
return 'k32w/k32w0'
elif self == NxpBoard.K32W1:
return 'k32w/k32w1'
+ elif self == NxpBoard.RW61X:
+ return 'zephyr'
else:
raise Exception('Unknown board type: %r' % self)
@@ -43,12 +62,21 @@ def FolderName(self):
class NxpApp(Enum):
LIGHTING = auto()
CONTACT = auto()
+ ALLCLUSTERS = auto()
+ LAUNDRYWASHER = auto()
+ THERMOSTAT = auto()
def ExampleName(self):
if self == NxpApp.LIGHTING:
return 'lighting-app'
elif self == NxpApp.CONTACT:
return "contact-sensor-app"
+ elif self == NxpApp.ALLCLUSTERS:
+ return "all-clusters-app"
+ elif self == NxpApp.LAUNDRYWASHER:
+ return "laundry-washer-app"
+ elif self == NxpApp.THERMOSTAT:
+ return "thermostat"
else:
raise Exception('Unknown app type: %r' % self)
@@ -57,6 +85,12 @@ def NameSuffix(self):
return 'light-example'
elif self == NxpApp.CONTACT:
return 'contact-example'
+ elif self == NxpApp.ALLCLUSTERS:
+ return "all-cluster-example"
+ elif self == NxpApp.LAUNDRYWASHER:
+ return "laundry-washer-example"
+ elif self == NxpApp.THERMOSTAT:
+ return "thermostat-example"
else:
raise Exception('Unknown app type: %r' % self)
@@ -71,6 +105,7 @@ def __init__(self,
runner,
app: NxpApp = NxpApp.LIGHTING,
board: NxpBoard = NxpBoard.K32W0,
+ os_env: NxpOsUsed = NxpOsUsed.FREERTOS,
low_power: bool = False,
smu2: bool = False,
enable_factory_data: bool = False,
@@ -85,6 +120,7 @@ def __init__(self,
self.code_root = root
self.app = app
self.board = board
+ self.os_env = os_env
self.low_power = low_power
self.smu2 = smu2
self.enable_factory_data = enable_factory_data
@@ -125,15 +161,54 @@ def GnBuildArgs(self):
return args
+ def WestBuildArgs(self):
+ args = []
+ if self.enable_factory_data:
+ args.append('-DFILE_SUFFIX=fdata')
+
+ if self.has_sw_version_2:
+ args.append('-DCONFIG_CHIP_DEVICE_SOFTWARE_VERSION=2')
+
+ build_args = " -- " + " ".join(args) if len(args) > 0 else ""
+ return build_args
+
def generate(self):
- super(NxpBuilder, self).generate()
+ if self.os_env == NxpOsUsed.ZEPHYR:
+ if 'ZEPHYR_NXP_SDK_INSTALL_DIR' in os.environ:
+ cmd = 'export ZEPHYR_SDK_INSTALL_DIR="$ZEPHYR_NXP_SDK_INSTALL_DIR"\n'
+ else:
+ raise Exception("ZEPHYR_SDK_INSTALL_DIR need to be set")
+ if 'ZEPHYR_NXP_BASE' in os.environ:
+ cmd += 'export ZEPHYR_BASE="$ZEPHYR_NXP_BASE"\n'
+ else:
+ raise Exception("ZEPHYR_NXP_BASE need to be set")
+ build_args = self.WestBuildArgs()
+ cmd += '''
+ west build -p --cmake-only -b {board_name} -d {out_folder} {example_folder} {build_args}
+ '''.format(
+ board_name=self.board.Name(),
+ out_folder=self.output_dir,
+ example_folder=self.app.BuildRoot(self.code_root, self.board),
+ build_args=build_args).strip()
+ self._Execute(['bash', '-c', cmd], title='Generating ' + self.identifier)
+ else:
+ super(NxpBuilder, self).generate()
def build_outputs(self):
name = 'chip-%s-%s' % (self.board.Name(), self.app.NameSuffix())
- yield BuilderOutput(
- os.path.join(self.output_dir, name),
- f'{name}.elf')
- if self.options.enable_link_map_file:
+ if self.os_env == NxpOsUsed.ZEPHYR:
+ yield BuilderOutput(
+ os.path.join(self.output_dir, 'zephyr', 'zephyr.elf'),
+ f'{name}.elf')
+ if self.options.enable_link_map_file:
+ yield BuilderOutput(
+ os.path.join(self.output_dir, 'zephyr', 'zephyr.map'),
+ f'{name}.map')
+ else:
yield BuilderOutput(
- os.path.join(self.output_dir, f'{name}.map'),
- f'{name}.map')
+ os.path.join(self.output_dir, name),
+ f'{name}.elf')
+ if self.options.enable_link_map_file:
+ yield BuilderOutput(
+ os.path.join(self.output_dir, f'{name}.map'),
+ f'{name}.map')
diff --git a/scripts/build/testdata/all_targets_linux_x64.txt b/scripts/build/testdata/all_targets_linux_x64.txt
index 7714bddaae42e3..2d9fee76e68ac0 100644
--- a/scripts/build/testdata/all_targets_linux_x64.txt
+++ b/scripts/build/testdata/all_targets_linux_x64.txt
@@ -14,7 +14,7 @@ linux-x64-efr32-test-runner[-clang]
imx-{chip-tool,lighting-app,thermostat,all-clusters-app,all-clusters-minimal-app,ota-provider-app}[-release]
infineon-psoc6-{lock,light,all-clusters,all-clusters-minimal}[-ota][-updateimage][-trustm]
rw61x-{all-clusters-app,thermostat,laundry-washer}[-ota][-wifi][-thread][-factory-data][-matter-shell]
-nxp-{k32w0,k32w1}-{lighting,contact-sensor}[-factory][-low-power][-lit][-fro32k][-smu2][-dac-conversion][-rotating-id][-sw-v2]
+nxp-{k32w0,k32w1,rw61x}-{zephyr,freertos}-{lighting,contact-sensor,all-clusters,laundry-washer,thermostat}[-factory][-low-power][-lit][-fro32k][-smu2][-dac-conversion][-rotating-id][-sw-v2]
mbed-cy8cproto_062_4343w-{lock,light,all-clusters,all-clusters-minimal,pigweed,ota-requestor,shell}[-release][-develop][-debug]
mw320-all-clusters-app
nrf-{nrf5340dk,nrf52840dk,nrf52840dongle}-{all-clusters,all-clusters-minimal,lock,light,light-switch,shell,pump,pump-controller,window-covering}[-rpc]
diff --git a/scripts/rules.matterlint b/scripts/rules.matterlint
index ecfd8a99fe3d6f..eff738deb58d8e 100644
--- a/scripts/rules.matterlint
+++ b/scripts/rules.matterlint
@@ -19,6 +19,7 @@ load "../src/app/zap-templates/zcl/data-model/chip/chip-ota.xml";
load "../src/app/zap-templates/zcl/data-model/chip/chip-types.xml";
load "../src/app/zap-templates/zcl/data-model/chip/clusters-extensions.xml";
load "../src/app/zap-templates/zcl/data-model/chip/color-control-cluster.xml";
+load "../src/app/zap-templates/zcl/data-model/chip/commissioner-control-cluster.xml";
load "../src/app/zap-templates/zcl/data-model/chip/concentration-measurement-cluster.xml";
load "../src/app/zap-templates/zcl/data-model/chip/content-launch-cluster.xml";
load "../src/app/zap-templates/zcl/data-model/chip/content-app-observer-cluster.xml";
diff --git a/scripts/setup/requirements.infineon.txt b/scripts/setup/requirements.infineon.txt
index 0a79ce1f3bfa63..97b60983b72f32 100644
--- a/scripts/setup/requirements.infineon.txt
+++ b/scripts/setup/requirements.infineon.txt
@@ -1,2 +1,4 @@
+ecdsa
+intelhex
leb128
zcbor
diff --git a/scripts/setup/zap.json b/scripts/setup/zap.json
index c3e65c8bab9752..636da03eeb2e8f 100644
--- a/scripts/setup/zap.json
+++ b/scripts/setup/zap.json
@@ -8,13 +8,13 @@
"mac-amd64",
"windows-amd64"
],
- "tags": ["version:2@v2024.06.10-nightly.1"]
+ "tags": ["version:2@v2024.07.10-nightly.1"]
},
{
"_comment": "Always get the amd64 version on mac until usable arm64 zap build is available",
"path": "fuchsia/third_party/zap/mac-amd64",
"platforms": ["mac-arm64"],
- "tags": ["version:2@v2024.06.10-nightly.1"]
+ "tags": ["version:2@v2024.07.10-nightly.1"]
}
]
}
diff --git a/scripts/setup/zap.version b/scripts/setup/zap.version
index 8b3c20afc891f6..4414b06f961e8b 100644
--- a/scripts/setup/zap.version
+++ b/scripts/setup/zap.version
@@ -1 +1 @@
-v2024.06.10-nightly
+v2024.07.10-nightly
diff --git a/scripts/tests/py/metadata.py b/scripts/tests/py/metadata.py
index 46ac1fe9ec8ab8..050f20f9920d6b 100644
--- a/scripts/tests/py/metadata.py
+++ b/scripts/tests/py/metadata.py
@@ -14,12 +14,18 @@
# limitations under the License.
import re
+import sys
from dataclasses import dataclass
from typing import Any, Dict, List
import yaml
+def bool_from_str(value: str) -> bool:
+ """Convert True/true/False/false strings to bool."""
+ return value.strip().lower() == "true"
+
+
@dataclass
class Metadata:
py_script_path: str
@@ -58,16 +64,59 @@ def copy_from_dict(self, attr_dict: Dict[str, Any]) -> None:
self.py_script_path = attr_dict["py_script_path"]
if "factoryreset" in attr_dict:
- self.factoryreset = bool(attr_dict["factoryreset"])
+ self.factoryreset = bool_from_str(attr_dict["factoryreset"])
if "factoryreset_app_only" in attr_dict:
- self.factoryreset_app_only = bool(attr_dict["factoryreset_app_only"])
+ self.factoryreset_app_only = bool_from_str(attr_dict["factoryreset_app_only"])
if "script_gdb" in attr_dict:
- self.script_gdb = bool(attr_dict["script_gdb"])
+ self.script_gdb = bool_from_str(attr_dict["script_gdb"])
if "quiet" in attr_dict:
- self.quiet = bool(attr_dict["quiet"])
+ self.quiet = bool_from_str(attr_dict["quiet"])
+
+
+def extract_runs_arg_lines(py_script_path: str) -> Dict[str, Dict[str, str]]:
+ """Extract the run arguments from the CI test arguments blocks."""
+
+ found_ci_args_section = False
+ done_ci_args_section = False
+
+ runs_def_ptrn = re.compile(r'^\s*#\s*test-runner-runs:\s*(?P.*)$')
+ arg_def_ptrn = re.compile(
+ r'^\s*#\s*test-runner-run/(?P[a-zA-Z0-9_]+)/(?P[a-zA-Z0-9_\-]+):\s*(?P.*)$')
+
+ runs_arg_lines: Dict[str, Dict[str, str]] = {}
+
+ with open(py_script_path, 'r', encoding='utf8') as py_script:
+ for line_idx, line in enumerate(py_script.readlines()):
+ line = line.strip()
+ line_num = line_idx + 1
+
+ # Detect the single CI args section, to skip the lines otherwise.
+ if not done_ci_args_section and line.startswith("# === BEGIN CI TEST ARGUMENTS ==="):
+ found_ci_args_section = True
+ elif found_ci_args_section and line.startswith("# === END CI TEST ARGUMENTS ==="):
+ done_ci_args_section = True
+ found_ci_args_section = False
+
+ runs_match = runs_def_ptrn.match(line)
+ args_match = arg_def_ptrn.match(line)
+
+ if not found_ci_args_section and (runs_match or args_match):
+ print(f"WARNING: {py_script_path}:{line_num}: Found CI args outside of CI TEST ARGUMENTS block!", file=sys.stderr)
+ continue
+
+ if runs_match:
+ for run in runs_match.group("run_id").strip().split():
+ runs_arg_lines[run] = {}
+ runs_arg_lines[run]['run'] = run
+ runs_arg_lines[run]['py_script_path'] = py_script_path
+
+ elif args_match:
+ runs_arg_lines[args_match.group("run_id")][args_match.group("arg_name")] = args_match.group("arg_val")
+
+ return runs_arg_lines
class MetadataReader:
@@ -126,33 +175,15 @@ def parse_script(self, py_script_path: str) -> List[Metadata]:
the run arguments associated with a particular run defined in
the script file.
"""
-
- runs_def_ptrn = re.compile(r'^\s*#\s*test-runner-runs:\s*(.*)$')
- arg_def_ptrn = re.compile(r'^\s*#\s*test-runner-run/([a-zA-Z0-9_]+)/([a-zA-Z0-9_\-]+):\s*(.*)$')
-
- runs_arg_lines: Dict[str, Dict[str, str]] = {}
runs_metadata: List[Metadata] = []
-
- with open(py_script_path, 'r', encoding='utf8') as py_script:
- for line in py_script.readlines():
- runs_match = runs_def_ptrn.match(line.strip())
- args_match = arg_def_ptrn.match(line.strip())
-
- if runs_match:
- for run in runs_match.group(1).strip().split():
- runs_arg_lines[run] = {}
- runs_arg_lines[run]['run'] = run
- runs_arg_lines[run]['py_script_path'] = py_script_path
-
- elif args_match:
- runs_arg_lines[args_match.group(1)][args_match.group(2)] = args_match.group(3)
+ runs_arg_lines = extract_runs_arg_lines(py_script_path)
for run, attr in runs_arg_lines.items():
self.__resolve_env_vals__(attr)
metadata = Metadata(
py_script_path=attr.get("py_script_path", ""),
- run=attr.get("run", ""),
+ run=run,
app=attr.get("app", ""),
app_args=attr.get("app_args", ""),
script_args=attr.get("script_args", ""),
diff --git a/scripts/tests/py/test_metadata.py b/scripts/tests/py/test_metadata.py
index a0c12a0ab0ed5a..863add965c315e 100644
--- a/scripts/tests/py/test_metadata.py
+++ b/scripts/tests/py/test_metadata.py
@@ -21,13 +21,17 @@
class TestMetadataReader(unittest.TestCase):
- test_file_content = '''
- # test-runner-runs: run1
+ test_file_content = '''
+ # === BEGIN CI TEST ARGUMENTS ===
+ # test-runner-runs: run1
# test-runner-run/run1/app: ${ALL_CLUSTERS_APP}
# test-runner-run/run1/app-args: --discriminator 1234 --trace-to json:${TRACE_APP}.json
# test-runner-run/run1/script-args: --commissioning-method on-network --trace-to json:${TRACE_TEST_JSON}.json --trace-to perfetto:${TRACE_TEST_PERFETTO}.perfetto
# test-runner-run/run1/factoryreset: True
# test-runner-run/run1/quiet: True
+ # === END CI TEST ARGUMENTS ===
+
+ # test-runner-run/run1/quiet: False
'''
env_file_content = '''
diff --git a/scripts/tools/generate_esp32_chip_factory_bin.py b/scripts/tools/generate_esp32_chip_factory_bin.py
index b641ef05b6cd88..eab2ec6b43c229 100755
--- a/scripts/tools/generate_esp32_chip_factory_bin.py
+++ b/scripts/tools/generate_esp32_chip_factory_bin.py
@@ -159,6 +159,39 @@ def ishex(s):
except ValueError:
return False
+# get_supported_modes_dict() converts the list of strings to per endpoint dictionaries.
+# example with semantic tags
+# input : ['0/label1/1/"1\0x8000, 2\0x8000" 1/label2/1/"1\0x8000, 2\0x8000"']
+# output : {'1': [{'Label': 'label1', 'Mode': 0, 'Semantic_Tag': [{'value': 1, 'mfgCode': 32768}, {'value': 2, 'mfgCode': 32768}]}, {'Label': 'label2', 'Mode': 1, 'Semantic_Tag': [{'value': 1, 'mfgCode': 32768}, {'value': 2, 'mfgCode': 32768}]}]}
+
+# example without semantic tags
+# input : ['0/label1/1 1/label2/1']
+# output : {'1': [{'Label': 'label1', 'Mode': 0, 'Semantic_Tag': []}, {'Label': 'label2', 'Mode': 1, 'Semantic_Tag': []}]}
+
+
+def get_supported_modes_dict(supported_modes):
+ output_dict = {}
+
+ for mode_str in supported_modes:
+ mode_label_strs = mode_str.split('/')
+ mode = mode_label_strs[0]
+ label = mode_label_strs[1]
+ ep = mode_label_strs[2]
+
+ semantic_tags = ''
+ if (len(mode_label_strs) == 4):
+ semantic_tag_strs = mode_label_strs[3].split(', ')
+ semantic_tags = [{"value": int(v.split('\\')[0]), "mfgCode": int(v.split('\\')[1], 16)} for v in semantic_tag_strs]
+
+ mode_dict = {"Label": label, "Mode": int(mode), "Semantic_Tag": semantic_tags}
+
+ if ep in output_dict:
+ output_dict[ep].append(mode_dict)
+ else:
+ output_dict[ep] = [mode_dict]
+
+ return output_dict
+
def check_str_range(s, min_len, max_len, name):
if s and ((len(s) < min_len) or (len(s) > max_len)):
@@ -269,6 +302,60 @@ def populate_factory_data(args, spake2p_params):
if args.hw_ver_str:
FACTORY_DATA['hw-ver-str']['value'] = args.hw_ver_str
+ # SupportedModes are stored as multiple entries
+ # - sm-sz/ : number of supported modes for the endpoint
+ # - sm-label// : supported modes label key for the endpoint and index
+ # - sm-mode// : supported modes mode key for the endpoint and index
+ # - sm-st-sz// : supported modes SemanticTag key for the endpoint and index
+ # - st-v/// : semantic tag value key for the endpoint and index and ind
+ # - st-mfg/// : semantic tag mfg code key for the endpoint and index and ind
+ if (args.supported_modes is not None):
+ dictionary = get_supported_modes_dict(args.supported_modes)
+ for ep in dictionary.keys():
+ _sz = {
+ 'type': 'data',
+ 'encoding': 'u32',
+ 'value': len(dictionary[ep])
+ }
+ FACTORY_DATA.update({'sm-sz/{:x}'.format(int(ep)): _sz})
+ for i in range(len(dictionary[ep])):
+ item = dictionary[ep][i]
+ _label = {
+ 'type': 'data',
+ 'encoding': 'string',
+ 'value': item["Label"]
+ }
+ _mode = {
+ 'type': 'data',
+ 'encoding': 'u32',
+ 'value': item["Mode"]
+ }
+ _st_sz = {
+ 'type': 'data',
+ 'encoding': 'u32',
+ 'value': len(item["Semantic_Tag"])
+ }
+ FACTORY_DATA.update({'sm-label/{:x}/{:x}'.format(int(ep), i): _label})
+ FACTORY_DATA.update({'sm-mode/{:x}/{:x}'.format(int(ep), i): _mode})
+ FACTORY_DATA.update({'sm-st-sz/{:x}/{:x}'.format(int(ep), i): _st_sz})
+
+ for j in range(len(item["Semantic_Tag"])):
+ entry = item["Semantic_Tag"][j]
+
+ _value = {
+ 'type': 'data',
+ 'encoding': 'u32',
+ 'value': entry["value"]
+ }
+ _mfg_code = {
+ 'type': 'data',
+ 'encoding': 'u32',
+ 'value': entry["mfgCode"]
+ }
+
+ FACTORY_DATA.update({'st-v/{:x}/{:x}/{:x}'.format(int(ep), i, j): _value})
+ FACTORY_DATA.update({'st-mfg/{:x}/{:x}/{:x}'.format(int(ep), i, j): _mfg_code})
+
def gen_raw_ec_keypair_from_der(key_file, pubkey_raw_file, privkey_raw_file):
with open(key_file, 'rb') as f:
@@ -381,6 +468,9 @@ def any_base_int(s): return int(s, 0)
help=('128-bit unique identifier for generating rotating device identifier, '
'provide 32-byte hex string, e.g. "1234567890abcdef1234567890abcdef"'))
+ parser.add_argument('--supported-modes', type=str, nargs='+', required=False,
+ help='List of supported modes, eg: mode1/label1/ep/"tagValue1\\mfgCode, tagValue2\\mfgCode" mode2/label2/ep/"tagValue1\\mfgCode, tagValue2\\mfgCode" mode3/label3/ep/"tagValue1\\mfgCode, tagValue2\\mfgCode"')
+
parser.add_argument('-s', '--size', type=any_base_int, default=0x6000,
help='The size of the partition.bin, default: 0x6000')
parser.add_argument('--target', default='esp32',
@@ -419,8 +509,7 @@ def set_up_factory_data(args):
def generate_factory_partiton_binary(args):
generate_nvs_csv(args.output_dir, FACTORY_PARTITION_CSV)
if args.generate_bin:
- csv_file = os.path.join(args.output_dir, FACTORY_PARTITION_CSV)
- generate_nvs_bin(args.encrypt, args.size, csv_file, FACTORY_PARTITION_BIN, args.output_dir)
+ generate_nvs_bin(args.encrypt, args.size, FACTORY_PARTITION_CSV, FACTORY_PARTITION_BIN, args.output_dir)
print_flashing_help(args.encrypt, args.output_dir, FACTORY_PARTITION_BIN)
clean_up()
diff --git a/scripts/tools/zap/zap_execution.py b/scripts/tools/zap/zap_execution.py
index 80def9602dce77..d027079ac70070 100644
--- a/scripts/tools/zap/zap_execution.py
+++ b/scripts/tools/zap/zap_execution.py
@@ -23,7 +23,7 @@
# Use scripts/tools/zap/version_update.py to manage ZAP versioning as many
# files may need updating for versions
#
-MIN_ZAP_VERSION = '2024.6.6'
+MIN_ZAP_VERSION = '2024.7.10'
class ZapTool:
diff --git a/scripts/tools/zap_regen_all.py b/scripts/tools/zap_regen_all.py
index dce4f719a19829..afe931fd8609a6 100755
--- a/scripts/tools/zap_regen_all.py
+++ b/scripts/tools/zap_regen_all.py
@@ -350,7 +350,8 @@ def setupArgumentsParser():
parser.add_argument('--parallel', action='store_true')
parser.add_argument('--no-parallel', action='store_false', dest='parallel')
- parser.set_defaults(parallel=True)
+ parser.add_argument('--no-rerun-in-env', action='store_false', dest='rerun_in_env')
+ parser.set_defaults(parallel=True, rerun_in_env=True)
args = parser.parse_args()
@@ -495,6 +496,26 @@ def main():
level=logging.INFO,
format='%(asctime)s %(name)s %(levelname)-7s %(message)s'
)
+
+ # The scripts executed by this generally MUST be within a bootstrapped environment because
+ # we need:
+ # - zap-cli in PATH
+ # - scripts/codegen.py uses click (can be in current pyenv, but guaranteed in bootstrap)
+ # - formatting is using bootstrapped clang-format
+ # Figure out if bootstrapped. For now assume `PW_ROOT` is such a marker in the environment
+ if "PW_ROOT" not in os.environ:
+ logging.error("Script MUST be run in a bootstrapped environment.")
+
+ # using the `--no-rerun-in-env` to avoid recursive infinite calls
+ if '--no-rerun-in-env' not in sys.argv:
+ import shlex
+ logging.info("Will re-try running in a build environment....")
+
+ what_to_run = sys.argv + ['--no-rerun-in-env']
+ launcher = os.path.join(CHIP_ROOT_DIR, 'scripts', 'run_in_build_env.sh')
+ os.execv(launcher, [launcher, shlex.join(what_to_run)])
+ sys.exit(1)
+
checkPythonVersion()
os.chdir(CHIP_ROOT_DIR)
args = setupArgumentsParser()
diff --git a/src/BUILD.gn b/src/BUILD.gn
index 3f4421d2f3f584..7e5fedcc0d539b 100644
--- a/src/BUILD.gn
+++ b/src/BUILD.gn
@@ -51,6 +51,7 @@ if (chip_build_tests) {
deps = []
tests = [
"${chip_root}/src/app/data-model/tests",
+ "${chip_root}/src/app/cluster-building-blocks/tests",
"${chip_root}/src/app/data-model-interface/tests",
"${chip_root}/src/access/tests",
"${chip_root}/src/crypto/tests",
diff --git a/src/access/tests/BUILD.gn b/src/access/tests/BUILD.gn
index 702aade7f8c5e2..d8b43e6a17a01d 100644
--- a/src/access/tests/BUILD.gn
+++ b/src/access/tests/BUILD.gn
@@ -25,6 +25,7 @@ chip_test_suite("tests") {
cflags = [ "-Wconversion" ]
public_deps = [
"${chip_root}/src/access",
+ "${chip_root}/src/lib/core:string-builder-adapters",
"${chip_root}/src/lib/support:test_utils",
"${dir_pw_unit_test}",
]
diff --git a/src/access/tests/TestAccessControl.cpp b/src/access/tests/TestAccessControl.cpp
index 16f30284fbc4d1..400ea04b76e535 100644
--- a/src/access/tests/TestAccessControl.cpp
+++ b/src/access/tests/TestAccessControl.cpp
@@ -19,9 +19,10 @@
#include "access/AccessControl.h"
#include "access/examples/ExampleAccessControlDelegate.h"
-#include
+#include
-#include
+#include
+#include
namespace chip {
namespace Access {
diff --git a/src/app/AttributeAccessInterfaceCache.h b/src/app/AttributeAccessInterfaceCache.h
index 21e29410f9a367..9268a7096ea9d5 100644
--- a/src/app/AttributeAccessInterfaceCache.h
+++ b/src/app/AttributeAccessInterfaceCache.h
@@ -48,7 +48,7 @@ class AttributeAccessInterfaceCache
kDefinitelyUsed
};
- constexpr AttributeAccessInterfaceCache() = default;
+ AttributeAccessInterfaceCache() { Invalidate(); }
/**
* @brief Invalidate the whole cache. Must be called every time list of AAI registrations changes.
@@ -106,8 +106,6 @@ class AttributeAccessInterfaceCache
private:
struct AttributeAccessCacheEntry
{
- constexpr AttributeAccessCacheEntry() = default;
-
EndpointId endpointId = kInvalidEndpointId;
ClusterId clusterId = kInvalidClusterId;
AttributeAccessInterface * accessor = nullptr;
@@ -139,8 +137,8 @@ class AttributeAccessInterfaceCache
return &mCacheSlots[0];
}
- AttributeAccessCacheEntry mCacheSlots[1] = {};
- AttributeAccessCacheEntry mLastUnusedEntry{};
+ AttributeAccessCacheEntry mCacheSlots[1];
+ AttributeAccessCacheEntry mLastUnusedEntry;
};
} // namespace app
diff --git a/src/app/BUILD.gn b/src/app/BUILD.gn
index 55bc5f305ddd99..666c452b09dc3a 100644
--- a/src/app/BUILD.gn
+++ b/src/app/BUILD.gn
@@ -207,7 +207,7 @@ static_library("interaction-model") {
public_deps = [
":app_config",
- ":command-handler",
+ ":command-handler-impl",
":constants",
":paths",
":subscription-info-provider",
@@ -333,16 +333,32 @@ source_set("status-response") {
]
}
-source_set("command-handler") {
+source_set("command-handler-interface") {
sources = [
"CommandHandler.cpp",
"CommandHandler.h",
"CommandHandlerExchangeInterface.h",
+ ]
+
+ public_deps = [
+ ":paths",
+ "${chip_root}/src/access:types",
+ "${chip_root}/src/app/data-model",
+ "${chip_root}/src/lib/core",
+ "${chip_root}/src/lib/support",
+ "${chip_root}/src/messaging",
+ "${chip_root}/src/protocols/interaction_model",
+ ]
+}
+
+source_set("command-handler-impl") {
+ sources = [
"CommandHandlerImpl.cpp",
"CommandHandlerImpl.h",
]
public_deps = [
+ ":command-handler-interface",
":paths",
":required-privileges",
":status-response",
diff --git a/src/app/DefaultAttributePersistenceProvider.cpp b/src/app/DefaultAttributePersistenceProvider.cpp
index 5bef4c11fb8c1a..6e7120999fe519 100644
--- a/src/app/DefaultAttributePersistenceProvider.cpp
+++ b/src/app/DefaultAttributePersistenceProvider.cpp
@@ -37,34 +37,40 @@ CHIP_ERROR DefaultAttributePersistenceProvider::InternalWriteValue(const Storage
return mStorage->SyncSetKeyValue(aKey.KeyName(), aValue.data(), static_cast(aValue.size()));
}
-CHIP_ERROR DefaultAttributePersistenceProvider::InternalReadValue(const StorageKeyName & aKey, EmberAfAttributeType aType,
- size_t aSize, MutableByteSpan & aValue)
+CHIP_ERROR DefaultAttributePersistenceProvider::InternalReadValue(const StorageKeyName & aKey, MutableByteSpan & aValue)
{
VerifyOrReturnError(mStorage != nullptr, CHIP_ERROR_INCORRECT_STATE);
uint16_t size = static_cast(min(aValue.size(), static_cast(UINT16_MAX)));
ReturnErrorOnFailure(mStorage->SyncGetKeyValue(aKey.KeyName(), aValue.data(), size));
- EmberAfAttributeType type = aType;
- if (emberAfIsStringAttributeType(type))
+ aValue.reduce_size(size);
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR DefaultAttributePersistenceProvider::InternalReadValue(const StorageKeyName & aKey, EmberAfAttributeType aType,
+ size_t aExpectedSize, MutableByteSpan & aValue)
+{
+ ReturnErrorOnFailure(InternalReadValue(aKey, aValue));
+ size_t size = aValue.size();
+ if (emberAfIsStringAttributeType(aType))
{
// Ensure that we've read enough bytes that we are not ending up with
// un-initialized memory. Should have read length + 1 (for the length
// byte).
- VerifyOrReturnError(size >= emberAfStringLength(aValue.data()) + 1, CHIP_ERROR_INCORRECT_STATE);
+ VerifyOrReturnError(size >= 1 && size - 1 >= emberAfStringLength(aValue.data()), CHIP_ERROR_INCORRECT_STATE);
}
- else if (emberAfIsLongStringAttributeType(type))
+ else if (emberAfIsLongStringAttributeType(aType))
{
// Ensure that we've read enough bytes that we are not ending up with
// un-initialized memory. Should have read length + 2 (for the length
// bytes).
- VerifyOrReturnError(size >= emberAfLongStringLength(aValue.data()) + 2, CHIP_ERROR_INCORRECT_STATE);
+ VerifyOrReturnError(size >= 2 && size - 2 >= emberAfLongStringLength(aValue.data()), CHIP_ERROR_INCORRECT_STATE);
}
else
{
// Ensure we got the expected number of bytes for all other types.
- VerifyOrReturnError(size == aSize, CHIP_ERROR_INVALID_ARGUMENT);
+ VerifyOrReturnError(size == aExpectedSize, CHIP_ERROR_INVALID_ARGUMENT);
}
- aValue.reduce_size(size);
return CHIP_NO_ERROR;
}
@@ -90,8 +96,7 @@ CHIP_ERROR DefaultAttributePersistenceProvider::SafeWriteValue(const ConcreteAtt
CHIP_ERROR DefaultAttributePersistenceProvider::SafeReadValue(const ConcreteAttributePath & aPath, MutableByteSpan & aValue)
{
return InternalReadValue(
- DefaultStorageKeyAllocator::SafeAttributeValue(aPath.mEndpointId, aPath.mClusterId, aPath.mAttributeId), 0x20,
- aValue.size(), aValue);
+ DefaultStorageKeyAllocator::SafeAttributeValue(aPath.mEndpointId, aPath.mClusterId, aPath.mAttributeId), aValue);
}
namespace {
diff --git a/src/app/DefaultAttributePersistenceProvider.h b/src/app/DefaultAttributePersistenceProvider.h
index 4db77e8919222c..3e18808f366d37 100644
--- a/src/app/DefaultAttributePersistenceProvider.h
+++ b/src/app/DefaultAttributePersistenceProvider.h
@@ -63,7 +63,9 @@ class DefaultAttributePersistenceProvider : public AttributePersistenceProvider,
private:
CHIP_ERROR InternalWriteValue(const StorageKeyName & aKey, const ByteSpan & aValue);
- CHIP_ERROR InternalReadValue(const StorageKeyName & aKey, EmberAfAttributeType aType, size_t aSize, MutableByteSpan & aValue);
+ CHIP_ERROR InternalReadValue(const StorageKeyName & aKey, MutableByteSpan & aValue);
+ CHIP_ERROR InternalReadValue(const StorageKeyName & aKey, EmberAfAttributeType aType, size_t aExpectedSize,
+ MutableByteSpan & aValue);
};
} // namespace app
diff --git a/src/app/EventLoggingTypes.h b/src/app/EventLoggingTypes.h
index 666cb3886331fe..04a843ebcfbd60 100644
--- a/src/app/EventLoggingTypes.h
+++ b/src/app/EventLoggingTypes.h
@@ -100,7 +100,7 @@ struct Timestamp
kSystem = 0,
kEpoch
};
- constexpr Timestamp() = default;
+ Timestamp() {}
Timestamp(Type aType, uint64_t aValue) : mType(aType), mValue(aValue) {}
Timestamp(System::Clock::Timestamp aValue) : mType(Type::kSystem), mValue(aValue.count()) {}
static Timestamp Epoch(System::Clock::Timestamp aValue)
diff --git a/src/app/EventManagement.cpp b/src/app/EventManagement.cpp
index 7b210064898b6e..8e6d53c24c9636 100644
--- a/src/app/EventManagement.cpp
+++ b/src/app/EventManagement.cpp
@@ -32,7 +32,7 @@ using namespace chip::TLV;
namespace chip {
namespace app {
-EventManagement EventManagement::sInstance;
+static EventManagement sInstance;
/**
* @brief
diff --git a/src/app/EventManagement.h b/src/app/EventManagement.h
index 16e2271d3448b5..ce5a34039ea0fe 100644
--- a/src/app/EventManagement.h
+++ b/src/app/EventManagement.h
@@ -73,7 +73,7 @@ namespace app {
inline constexpr const uint32_t kEventManagementProfile = 0x1;
inline constexpr const uint32_t kFabricIndexTag = 0x1;
inline constexpr size_t kMaxEventSizeReserve = 512;
-inline constexpr uint16_t kRequiredEventField =
+constexpr uint16_t kRequiredEventField =
(1 << to_underlying(EventDataIB::Tag::kPriority)) | (1 << to_underlying(EventDataIB::Tag::kPath));
/**
@@ -388,9 +388,6 @@ class EventManagement
void SetScheduledEventInfo(EventNumber & aEventNumber, uint32_t & aInitialWrittenEventBytes) const;
private:
- constexpr EventManagement() = default;
- static EventManagement sInstance;
-
/**
* @brief
* Internal structure for traversing events.
@@ -558,9 +555,9 @@ class EventManagement
MonotonicallyIncreasingCounter * mpEventNumberCounter = nullptr;
EventNumber mLastEventNumber = 0; ///< Last event Number vended
- Timestamp mLastEventTimestamp{}; ///< The timestamp of the last event in this buffer
+ Timestamp mLastEventTimestamp; ///< The timestamp of the last event in this buffer
- System::Clock::Milliseconds64 mMonotonicStartupTime{};
+ System::Clock::Milliseconds64 mMonotonicStartupTime;
};
} // namespace app
} // namespace chip
diff --git a/src/app/SafeAttributePersistenceProvider.h b/src/app/SafeAttributePersistenceProvider.h
index ed02d6039043ad..8d11d95d47b02d 100644
--- a/src/app/SafeAttributePersistenceProvider.h
+++ b/src/app/SafeAttributePersistenceProvider.h
@@ -40,8 +40,8 @@ class SafeAttributePersistenceProvider
// The following API provides helper functions to simplify the access of commonly used types.
// The API may not be complete.
- // Currently implemented write and read types are: uint8_t, uint16_t, uint32_t, unit64_t and
- // their nullable varieties, and bool.
+ // Currently implemented write and read types are: bool, uint8_t, uint16_t, uint32_t, unit64_t and
+ // their nullable varieties, as well as ByteSpans.
/**
* Write an attribute value of type intX, uintX or bool to non-volatile memory.
@@ -50,7 +50,7 @@ class SafeAttributePersistenceProvider
* @param [in] aValue the data to write.
*/
template ::value, bool> = true>
- CHIP_ERROR WriteScalarValue(const ConcreteAttributePath & aPath, T & aValue)
+ CHIP_ERROR WriteScalarValue(const ConcreteAttributePath & aPath, T aValue)
{
uint8_t value[sizeof(T)];
auto w = Encoding::LittleEndian::BufferWriter(value, sizeof(T));
@@ -71,18 +71,16 @@ class SafeAttributePersistenceProvider
*
* @param [in] aPath the attribute path for the data being persisted.
* @param [in,out] aValue where to place the data.
+ *
+ * @retval CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND if no stored value exists for the attribute
*/
template ::value, bool> = true>
CHIP_ERROR ReadScalarValue(const ConcreteAttributePath & aPath, T & aValue)
{
uint8_t attrData[sizeof(T)];
MutableByteSpan tempVal(attrData);
- auto err = SafeReadValue(aPath, tempVal);
- if (err != CHIP_NO_ERROR)
- {
- return err;
- }
-
+ ReturnErrorOnFailure(SafeReadValue(aPath, tempVal));
+ VerifyOrReturnError(tempVal.size() == sizeof(T), CHIP_ERROR_INCORRECT_STATE);
Encoding::LittleEndian::Reader r(tempVal.data(), tempVal.size());
r.RawReadLowLevelBeCareful(&aValue);
return r.StatusCode();
@@ -95,7 +93,7 @@ class SafeAttributePersistenceProvider
* @param [in] aValue the data to write.
*/
template ::value, bool> = true>
- CHIP_ERROR WriteScalarValue(const ConcreteAttributePath & aPath, DataModel::Nullable & aValue)
+ CHIP_ERROR WriteScalarValue(const ConcreteAttributePath & aPath, const DataModel::Nullable & aValue)
{
typename NumericAttributeTraits::StorageType storageValue;
if (aValue.IsNull())
@@ -114,16 +112,14 @@ class SafeAttributePersistenceProvider
*
* @param [in] aPath the attribute path for the data being persisted.
* @param [in,out] aValue where to place the data.
+ *
+ * @retval CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND if no stored value exists for the attribute
*/
template ::value, bool> = true>
CHIP_ERROR ReadScalarValue(const ConcreteAttributePath & aPath, DataModel::Nullable & aValue)
{
typename NumericAttributeTraits::StorageType storageValue;
- CHIP_ERROR err = ReadScalarValue(aPath, storageValue);
- if (err != CHIP_NO_ERROR)
- {
- return err;
- }
+ ReturnErrorOnFailure(ReadScalarValue(aPath, storageValue));
if (NumericAttributeTraits::IsNullValue(storageValue))
{
@@ -137,25 +133,25 @@ class SafeAttributePersistenceProvider
return CHIP_NO_ERROR;
}
-protected:
/**
* Write an attribute value from the attribute store (i.e. not a struct or
* list) to non-volatile memory.
*
* @param [in] aPath the attribute path for the data being written.
- * @param [in] aValue the data to write. The value should be stored as-is.
+ * @param [in] aValue the data to write. The value will be stored as-is.
*/
virtual CHIP_ERROR SafeWriteValue(const ConcreteAttributePath & aPath, const ByteSpan & aValue) = 0;
/**
- * Read an attribute value from non-volatile memory.
- * It can be assumed that this method will never be called upon to read
- * an attribute of type string or long-string.
+ * Read an attribute value as a raw sequence of bytes from non-volatile memory.
*
* @param [in] aPath the attribute path for the data being persisted.
* @param [in,out] aValue where to place the data. The size of the buffer
- * will be equal to `aValue.size()`. The callee is expected to adjust
- * aValue's size to the actual number of bytes read.
+ * will be equal to `aValue.size()`. On success aValue.size()
+ * will be the actual number of bytes read.
+ *
+ * @retval CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND if no stored value exists for the attribute
+ * @retval CHIP_ERROR_BUFFER_TOO_SMALL aValue.size() is too small to hold the value.
*/
virtual CHIP_ERROR SafeReadValue(const ConcreteAttributePath & aPath, MutableByteSpan & aValue) = 0;
};
diff --git a/src/app/WriteClient.h b/src/app/WriteClient.h
index b67bf4ea0b8c84..b4d803981be3d8 100644
--- a/src/app/WriteClient.h
+++ b/src/app/WriteClient.h
@@ -178,7 +178,7 @@ class WriteClient : public Messaging::ExchangeDelegate
ReturnErrorOnFailure(EncodeSingleAttributeDataIB(path, DataModel::List()));
path.mListOp = ConcreteDataAttributePath::ListOperation::AppendItem;
- for (ListIndex i = 0; i < value.size(); i++)
+ for (size_t i = 0; i < value.size(); i++)
{
ReturnErrorOnFailure(EncodeSingleAttributeDataIB(path, value.data()[i]));
}
diff --git a/src/app/app-platform/ContentAppPlatform.cpp b/src/app/app-platform/ContentAppPlatform.cpp
index fb2d6ab39a1b5f..214af261e26e54 100644
--- a/src/app/app-platform/ContentAppPlatform.cpp
+++ b/src/app/app-platform/ContentAppPlatform.cpp
@@ -387,6 +387,57 @@ ContentApp * ContentAppPlatform::GetContentApp(EndpointId id)
return nullptr;
}
+// create a string key from vendorId and productId
+std::string createKey(uint16_t vendorId, uint16_t productId)
+{
+ return std::to_string(vendorId) + ":" + std::to_string(productId);
+}
+
+void ContentAppPlatform::StoreNodeIdForContentApp(uint16_t vendorId, uint16_t productId, NodeId nodeId)
+{
+ std::string key = createKey(vendorId, productId);
+
+ ChipLogProgress(DeviceLayer, "Stored node id: " ChipLogFormatX64 " for key: %s", ChipLogValueX64(nodeId), key.c_str());
+
+ mConnectedContentAppNodeIds[key].insert(nodeId);
+}
+
+std::set