diff --git a/.github/actions/bootstrap-cache/action.yaml b/.github/actions/bootstrap-cache/action.yaml
index 9a883ecf22da79..f5ed24ba3f06e7 100644
--- a/.github/actions/bootstrap-cache/action.yaml
+++ b/.github/actions/bootstrap-cache/action.yaml
@@ -11,7 +11,7 @@ runs:
attempt_limit: 3
attempt_delay: 2000
with: |
- key: ${{ runner.os }}-env-${{ hashFiles('scripts/setup/*', 'third_party/pigweed/**') }}
+ key: ${{ runner.os }}-env-${{ hashFiles('scripts/setup/*', 'third_party/pigweed/**', '/etc/lsb-release') }}
path: |
.environment
build_overrides/pigweed_environment.gni
diff --git a/.github/workflows/bloat_check.yaml b/.github/workflows/bloat_check.yaml
index a28be330220581..d9a2a506724188 100644
--- a/.github/workflows/bloat_check.yaml
+++ b/.github/workflows/bloat_check.yaml
@@ -34,7 +34,7 @@ jobs:
runs-on: ubuntu-latest
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
steps:
- name: Checkout
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index ab5e30d2abd1d4..c4215c5745d4fd 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)
@@ -42,7 +42,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
volumes:
- "/:/runner-root-volume"
- "/tmp/log_output:/tmp/test_logs"
@@ -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
@@ -456,7 +456,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
volumes:
- "/:/runner-root-volume"
- "/tmp/log_output:/tmp/test_logs"
diff --git a/.github/workflows/chef.yaml b/.github/workflows/chef.yaml
index 0b330d86910a62..1af112cf6dc23a 100644
--- a/.github/workflows/chef.yaml
+++ b/.github/workflows/chef.yaml
@@ -35,7 +35,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
options: --user root
steps:
diff --git a/.github/workflows/examples-linux-standalone.yaml b/.github/workflows/examples-linux-standalone.yaml
index 1fae7081caba6b..0307eedc057bfd 100644
--- a/.github/workflows/examples-linux-standalone.yaml
+++ b/.github/workflows/examples-linux-standalone.yaml
@@ -36,7 +36,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
diff --git a/.github/workflows/examples-linux-tv-casting-app.yaml b/.github/workflows/examples-linux-tv-casting-app.yaml
index 235aa2cbebabd0..744c40b2654421 100644
--- a/.github/workflows/examples-linux-tv-casting-app.yaml
+++ b/.github/workflows/examples-linux-tv-casting-app.yaml
@@ -36,7 +36,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
steps:
- name: Checkout
diff --git a/.github/workflows/examples-mw320.yaml b/.github/workflows/examples-mw320.yaml
index 759c0dc9582066..4b07c513db5d24 100644
--- a/.github/workflows/examples-mw320.yaml
+++ b/.github/workflows/examples-mw320.yaml
@@ -39,7 +39,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
steps:
diff --git a/.github/workflows/examples-nxp.yaml b/.github/workflows/examples-nxp.yaml
index 130092cb258656..a4cb2101872cf8 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,24 +75,51 @@ 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
if: ${{ !env.ACT }}
with:
platform-name: K32W
+
+ zephyr:
+ name: ZEPHYR_RW61X
+
+ runs-on: ubuntu-latest
+ if: github.actor != 'restyled-io[bot]'
+
+ container:
+ image: ghcr.io/project-chip/chip-build-nxp-zephyr:64
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Checkout submodules & Bootstrap
+ uses: ./.github/actions/checkout-submodules-and-bootstrap
+ with:
+ platform: nxp
+
+ - name: Build RW61x Zephyr examples
+ run: |
+ scripts/run_in_build_env.sh "\
+ ./scripts/build/build_examples.py \
+ --target nxp-rw61x-zephyr-all-clusters \
+ --target nxp-rw61x-zephyr-thermostat \
+ --target nxp-rw61x-zephyr-laundry-washer-factory \
+ build \
+ "
diff --git a/.github/workflows/examples-qpg.yaml b/.github/workflows/examples-qpg.yaml
index 11c9cc1f013803..e015d3db3f5d08 100644
--- a/.github/workflows/examples-qpg.yaml
+++ b/.github/workflows/examples-qpg.yaml
@@ -39,7 +39,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
steps:
diff --git a/.github/workflows/examples-stm32.yaml b/.github/workflows/examples-stm32.yaml
index ab113a8780dcbe..47435add440808 100644
--- a/.github/workflows/examples-stm32.yaml
+++ b/.github/workflows/examples-stm32.yaml
@@ -40,7 +40,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
steps:
diff --git a/.github/workflows/fuzzing-build.yaml b/.github/workflows/fuzzing-build.yaml
index 8dcabb223cbb78..17be73a9346d39 100644
--- a/.github/workflows/fuzzing-build.yaml
+++ b/.github/workflows/fuzzing-build.yaml
@@ -33,7 +33,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
volumes:
- "/tmp/log_output:/tmp/test_logs"
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 66b745fb064d07..19cf8e8bd910b0 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -35,7 +35,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
steps:
- name: Checkout
diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml
index dcb3adb599b9ba..cb8f5c6b6ed636 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 \
@@ -191,6 +192,7 @@ jobs:
src/app/zap-templates/zcl/data-model/chip/unit-localization-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/wake-on-lan-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/washer-controls-cluster.xml \
+ src/app/zap-templates/zcl/data-model/chip/water-heater-management-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/wifi-network-diagnostics-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/wifi-network-management-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/window-covering.xml \
@@ -443,7 +445,7 @@ jobs:
runs-on: ubuntu-latest
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0
net.ipv4.conf.all.forwarding=0 net.ipv6.conf.all.forwarding=0"
@@ -493,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'
@@ -529,6 +531,7 @@ jobs:
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_ICDManagementCluster.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_IDM_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_IDM_1_4.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_IDM_4_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_PWRTL_2_1.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_RR_1_1.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_SC_3_6.py'
@@ -579,6 +582,8 @@ jobs:
scripts/run_in_python_env.sh out/venv './scripts/tests/TestTimeSyncTrustedTimeSourceRunner.py'
scripts/run_in_python_env.sh out/venv './src/python_testing/test_testing/test_TC_ICDM_2_1.py'
scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestIdChecks.py'
+ scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestConformanceSupport.py'
+ scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/test_testing/test_IDM_10_4.py'
- name: Uploading core files
uses: actions/upload-artifact@v4
diff --git a/.github/workflows/unit_integration_test.yaml b/.github/workflows/unit_integration_test.yaml
index 4164020743c3f1..59e2dafc30cd63 100644
--- a/.github/workflows/unit_integration_test.yaml
+++ b/.github/workflows/unit_integration_test.yaml
@@ -39,7 +39,7 @@ jobs:
runs-on: ubuntu-latest
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
volumes:
- "/:/runner-root-volume"
- "/tmp/log_output:/tmp/test_logs"
diff --git a/.github/workflows/zap_regeneration.yaml b/.github/workflows/zap_regeneration.yaml
index 0f134668d49ec2..356c8922b9419e 100644
--- a/.github/workflows/zap_regeneration.yaml
+++ b/.github/workflows/zap_regeneration.yaml
@@ -30,7 +30,7 @@ jobs:
runs-on: ubuntu-20.04
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
defaults:
run:
shell: sh
diff --git a/.github/workflows/zap_templates.yaml b/.github/workflows/zap_templates.yaml
index b7a9020259fa8a..2e9d5e82f1df90 100644
--- a/.github/workflows/zap_templates.yaml
+++ b/.github/workflows/zap_templates.yaml
@@ -34,7 +34,7 @@ jobs:
runs-on: ubuntu-20.04
container:
- image: ghcr.io/project-chip/chip-build:64
+ image: ghcr.io/project-chip/chip-build:65
defaults:
run:
shell: sh
diff --git a/.vscode/settings.json b/.vscode/settings.json
index d38758524ac8a5..397e6230087325 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -133,7 +133,8 @@
"random": "cpp",
"thread": "cpp",
"variant": "cpp",
- "any": "cpp"
+ "any": "cpp",
+ "future": "cpp"
},
// Configure paths or glob patterns to exclude from file watching.
"files.watcherExclude": {
diff --git a/config/esp32/components/chip/Kconfig b/config/esp32/components/chip/Kconfig
index e2f9dcc099eba6..c742ddb0336764 100644
--- a/config/esp32/components/chip/Kconfig
+++ b/config/esp32/components/chip/Kconfig
@@ -330,9 +330,11 @@ menu "CHIP Device Layer"
config MAX_EVENT_QUEUE_SIZE
int "Max Event Queue Size"
range 0 65535
- default 25
+ default 40
help
The maximum number of events that can be held in the CHIP Platform event queue.
+ Should be set greater than CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM. For SoCs other than
+ ESP32-C2, where the Wi-Fi buffer number is 8, recommended to use the default value.
config ENABLE_EXTENDED_DISCOVERY
bool "Enable Extended discovery Support"
diff --git a/config/python/CHIPProjectConfig.h b/config/python/CHIPProjectConfig.h
index 5effaaa13c6479..4412c5bec75a01 100644
--- a/config/python/CHIPProjectConfig.h
+++ b/config/python/CHIPProjectConfig.h
@@ -26,14 +26,19 @@
#define CHIP_CONFIG_EVENT_LOGGING_NUM_EXTERNAL_CALLBACKS 2
// Uncomment this for a large Tunnel MTU.
-//#define CHIP_CONFIG_TUNNEL_INTERFACE_MTU (9000)
+// #define CHIP_CONFIG_TUNNEL_INTERFACE_MTU (9000)
// Enable support functions for parsing command-line arguments
#define CHIP_CONFIG_ENABLE_ARG_PARSER 1
-// Use a default pairing code if one hasn't been provisioned in flash.
-#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE 20202021
-#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR 0xF00
+// Enable use of test setup parameters for testing purposes only.
+//
+// WARNING: This option makes it possible to circumvent basic chip security functionality.
+// Because of this it SHOULD NEVER BE ENABLED IN PRODUCTION BUILDS.
+//
+#ifndef CHIP_DEVICE_CONFIG_ENABLE_TEST_SETUP_PARAMS
+#define CHIP_DEVICE_CONFIG_ENABLE_TEST_SETUP_PARAMS 1
+#endif
// Enable reading DRBG seed data from /dev/(u)random.
// This is needed for test applications and the CHIP device manager to function
@@ -46,6 +51,8 @@
// WARNING: These options make it possible to circumvent basic Chip security functionality,
// including message encryption. Because of this they MUST NEVER BE ENABLED IN PRODUCTION BUILDS.
//
+// To build with this flag, pass 'treat_warnings_as_errors=false' to gn/ninja.
+//
#define CHIP_CONFIG_SECURITY_TEST_MODE 0
#define CHIP_CONFIG_ENABLE_UPDATE 1
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/getting_started/SDKBasics.md b/docs/getting_started/SDKBasics.md
index fee03ae7cd484d..7f2c81f285fceb 100644
--- a/docs/getting_started/SDKBasics.md
+++ b/docs/getting_started/SDKBasics.md
@@ -58,7 +58,7 @@ logic is handled in the run-time installed interface layers.
- examples
- [examples/chip-tool](https://github.com/project-chip/connectedhomeip/blob/master/examples/chip-tool) -
main controller example
- - [examples/all-clusters-app](https://github.com/project-chip/connectedhomeip/blob/master/examples/all-cluster-app) -
+ - [examples/all-clusters-app](https://github.com/project-chip/connectedhomeip/blob/master/examples/all-clusters-app) -
QA app
- [examples/\](https://github.com/project-chip/connectedhomeip/blob/master/examples) -
Specific Device examples
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/testing/unit_testing.md b/docs/testing/unit_testing.md
index 64046a4c21a9d6..243e35d9b380c9 100644
--- a/docs/testing/unit_testing.md
+++ b/docs/testing/unit_testing.md
@@ -218,8 +218,8 @@ your overriding function make sure to check `HasFailure()` and return if the
parent function failed.
If you don't override any of the setup/teardown functions, you can simply make a
-type alias: `using YourTestContext = Test::AppContextPW;` instead of defining
-your own text context class.
+type alias: `using YourTestContext = Test::AppContext;` instead of defining your
+own text context class.
## Best practices
diff --git a/docs/zap_clusters.md b/docs/zap_clusters.md
index 7651e35b784ed1..ac9c8f04e7f86f 100644
--- a/docs/zap_clusters.md
+++ b/docs/zap_clusters.md
@@ -79,6 +79,7 @@ Generally regenerate using one of:
| 129 | 0x81 | ValveConfigurationAndControl |
| 144 | 0x90 | ElectricalPowerMeasurement |
| 145 | 0x91 | ElectricalEnergyMeasurement |
+| 148 | 0x94 | WaterHeaterManagement |
| 150 | 0x96 | DemandResponseLoadControl |
| 151 | 0x97 | Messages |
| 152 | 0x98 | DeviceEnergyManagement |
@@ -86,6 +87,7 @@ Generally regenerate using one of:
| 155 | 0x9B | EnergyPreference |
| 156 | 0x9C | PowerTopology |
| 157 | 0x9D | EnergyEvseMode |
+| 158 | 0x9E | WaterHeaterMode |
| 159 | 0x9F | DeviceEnergyManagementMode |
| 257 | 0x101 | DoorLock |
| 258 | 0x102 | WindowCovering |
@@ -130,6 +132,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/all-clusters-common/all-clusters-app.matter b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
index b512a6b1399d58..3ed93a0190c273 100644
--- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
+++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
@@ -2731,8 +2731,8 @@ cluster OvenMode = 73 {
command ChangeToMode(ChangeToModeRequest): ChangeToModeResponse = 0;
}
-/** This cluster supports remotely monitoring and controling the different typs of
- functionality available to a drying device, such as a laundry dryer. */
+/** This cluster provides a way to access options associated with the operation of
+ a laundry dryer device type. */
cluster LaundryDryerControls = 74 {
revision 1;
@@ -4298,7 +4298,7 @@ provisional cluster DeviceEnergyManagement = 152 {
/** Electric Vehicle Supply Equipment (EVSE) is equipment used to charge an Electric Vehicle (EV) or Plug-In Hybrid Electric Vehicle. This cluster provides an interface to the functionality of Electric Vehicle Supply Equipment (EVSE) management. */
cluster EnergyEvse = 153 {
- revision 2;
+ revision 4;
enum EnergyTransferStoppedReasonEnum : enum8 {
kEVStopped = 0;
@@ -4342,6 +4342,7 @@ cluster EnergyEvse = 153 {
kDischargingEnabled = 2;
kDisabledError = 3;
kDisabledDiagnostics = 4;
+ kEnabled = 5;
}
bitmap Feature : bitmap32 {
@@ -4389,6 +4390,7 @@ cluster EnergyEvse = 153 {
int32u sessionID = 0;
StateEnum state = 1;
amperage_ma maximumCurrent = 2;
+ optional amperage_ma maximumDischargeCurrent = 3;
}
info event EnergyTransferStopped = 3 {
@@ -4396,6 +4398,7 @@ cluster EnergyEvse = 153 {
StateEnum state = 1;
EnergyTransferStoppedReasonEnum reason = 2;
energy_mwh energyTransferred = 4;
+ optional energy_mwh energyDischarged = 5;
}
critical event Fault = 4 {
@@ -4460,15 +4463,15 @@ cluster EnergyEvse = 153 {
/** Allows a client to disable the EVSE from charging and discharging. */
timed command Disable(): DefaultSuccess = 1;
- /** Allows a client to enable the EVSE to charge an EV. */
+ /** This command allows a client to enable the EVSE to charge an EV, */
timed command EnableCharging(EnableChargingRequest): DefaultSuccess = 2;
- /** Allows a client to enable the EVSE to discharge an EV. */
+ /** Upon receipt, this SHALL allow a client to enable the discharge of an EV, */
timed command EnableDischarging(EnableDischargingRequest): DefaultSuccess = 3;
/** Allows a client to put the EVSE into a self-diagnostics mode. */
timed command StartDiagnostics(): DefaultSuccess = 4;
/** Allows a client to set the user specified charging targets. */
timed command SetTargets(SetTargetsRequest): DefaultSuccess = 5;
- /** Allows a client to retrieve the user specified charging targets. */
+ /** Allows a client to retrieve the current set of charging targets. */
timed command GetTargets(): GetTargetsResponse = 6;
/** Allows a client to clear all stored charging targets. */
timed command ClearTargets(): DefaultSuccess = 7;
@@ -9262,6 +9265,48 @@ endpoint 2 {
ram attribute clusterRevision default = 4;
}
}
+endpoint 3 {
+ device type ma_genericswitch = 15, version 3;
+
+
+ server cluster Identify {
+ ram attribute identifyTime default = 0x0000;
+ ram attribute identifyType default = 0x00;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute attributeList;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 4;
+
+ handle command Identify;
+ handle command TriggerEffect;
+ }
+
+ server cluster Descriptor {
+ callback attribute deviceTypeList;
+ callback attribute serverList;
+ callback attribute clientList;
+ callback attribute partsList;
+ callback attribute tagList;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute attributeList;
+ callback attribute featureMap;
+ callback attribute clusterRevision;
+ }
+
+ server cluster Switch {
+ emits event InitialPress;
+ emits event LongPress;
+ emits event LongRelease;
+ emits event MultiPressComplete;
+ ram attribute numberOfPositions default = 2;
+ ram attribute currentPosition default = 0;
+ ram attribute multiPressMax default = 3;
+ ram attribute featureMap default = 58;
+ ram attribute clusterRevision default = 2;
+ }
+}
endpoint 65534 {
device type ma_secondary_network_interface = 25, version 1;
diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
index c547030731c6cf..4dd86543613c40 100644
--- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
+++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
@@ -19,18 +19,18 @@
"package": [
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/zcl/zcl-with-test-extensions.json",
- "type": "zcl-properties",
+ "path": "../../../src/app/zap-templates/app-templates.json",
+ "type": "gen-templates-json",
"category": "matter",
- "version": 1,
- "description": "Matter SDK ZCL data with some extensions"
+ "version": "chip-v1"
},
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/app-templates.json",
- "type": "gen-templates-json",
+ "path": "../../../src/app/zap-templates/zcl/zcl-with-test-extensions.json",
+ "type": "zcl-properties",
"category": "matter",
- "version": "chip-v1"
+ "version": 1,
+ "description": "Matter SDK ZCL data with some extensions"
}
],
"endpointTypes": [
@@ -21900,6 +21900,14 @@
"isIncoming": 1,
"isEnabled": 1
},
+ {
+ "name": "StringEchoResponse",
+ "code": 13,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 0,
+ "isEnabled": 1
+ },
{
"name": "TestEnumsRequest",
"code": 14,
@@ -21973,32 +21981,24 @@
"isEnabled": 1
},
{
- "name": "TestDifferentVendorMeiRequest",
- "code": 4294049962,
+ "name": "StringEchoRequest",
+ "code": 24,
"mfgCode": null,
"source": "client",
"isIncoming": 1,
"isEnabled": 1
},
{
- "name": "TestDifferentVendorMeiResponse",
- "code": 4294049979,
- "mfgCode": null,
- "source": "server",
- "isIncoming": 0,
- "isEnabled": 1
- },
- {
- "name": "StringEchoRequest",
- "code": 24,
+ "name": "TestDifferentVendorMeiRequest",
+ "code": 4294049962,
"mfgCode": null,
"source": "client",
"isIncoming": 1,
"isEnabled": 1
},
{
- "name": "StringEchoResponse",
- "code": 13,
+ "name": "TestDifferentVendorMeiResponse",
+ "code": 4294049979,
"mfgCode": null,
"source": "server",
"isIncoming": 0,
@@ -24783,6 +24783,465 @@
},
{
"id": 4,
+ "name": "MA-genericswitch",
+ "deviceTypeRef": {
+ "code": 15,
+ "profileId": 259,
+ "label": "MA-genericswitch",
+ "name": "MA-genericswitch"
+ },
+ "deviceTypes": [
+ {
+ "code": 15,
+ "profileId": 259,
+ "label": "MA-genericswitch",
+ "name": "MA-genericswitch"
+ }
+ ],
+ "deviceVersions": [
+ 3
+ ],
+ "deviceIdentifiers": [
+ 15
+ ],
+ "deviceTypeName": "MA-genericswitch",
+ "deviceTypeCode": 15,
+ "deviceTypeProfileId": 259,
+ "clusters": [
+ {
+ "name": "Identify",
+ "code": 3,
+ "mfgCode": null,
+ "define": "IDENTIFY_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "Identify",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "TriggerEffect",
+ "code": 64,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "IdentifyTime",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x0000",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "IdentifyType",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "IdentifyTypeEnum",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x00",
+ "reportable": 1,
+ "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": null,
+ "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": null,
+ "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": null,
+ "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": "4",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Descriptor",
+ "code": 29,
+ "mfgCode": null,
+ "define": "DESCRIPTOR_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "DeviceTypeList",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ServerList",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ClientList",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PartsList",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "TagList",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "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": null,
+ "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": null,
+ "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": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "FeatureMap",
+ "code": 65532,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ClusterRevision",
+ "code": 65533,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Switch",
+ "code": 59,
+ "mfgCode": null,
+ "define": "SWITCH_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "NumberOfPositions",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "2",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "CurrentPosition",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "MultiPressMax",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "3",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "FeatureMap",
+ "code": 65532,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "58",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "ClusterRevision",
+ "code": 65533,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "2",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ }
+ ],
+ "events": [
+ {
+ "name": "InitialPress",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ },
+ {
+ "name": "LongPress",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ },
+ {
+ "name": "LongRelease",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ },
+ {
+ "name": "MultiPressComplete",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "included": 12
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": 5,
"name": "Anonymous Endpoint Type",
"deviceTypeRef": {
"code": 25,
@@ -25315,9 +25774,17 @@
"parentEndpointIdentifier": null
},
{
- "endpointTypeName": "Anonymous Endpoint Type",
+ "endpointTypeName": "MA-genericswitch",
"endpointTypeIndex": 3,
"profileId": 259,
+ "endpointId": 3,
+ "networkId": 0,
+ "parentEndpointIdentifier": null
+ },
+ {
+ "endpointTypeName": "Anonymous Endpoint Type",
+ "endpointTypeIndex": 4,
+ "profileId": 259,
"endpointId": 65534,
"networkId": 0,
"parentEndpointIdentifier": null
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/esp32/sdkconfig.defaults.esp32c2 b/examples/all-clusters-app/esp32/sdkconfig.defaults.esp32c2
index 6cb90db4f55b9d..200dc5825bc2e2 100644
--- a/examples/all-clusters-app/esp32/sdkconfig.defaults.esp32c2
+++ b/examples/all-clusters-app/esp32/sdkconfig.defaults.esp32c2
@@ -17,3 +17,6 @@ CONFIG_BT_NIMBLE_ROLE_OBSERVER=n
CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=4
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=8
CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=16
+
+# Event Queue Size
+CONFIG_MAX_EVENT_QUEUE_SIZE=25
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/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap
index 090dda6a70e2e5..a5e9bdd3164ee2 100644
--- a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap
+++ b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap
@@ -17,13 +17,6 @@
}
],
"package": [
- {
- "pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/app-templates.json",
- "type": "gen-templates-json",
- "category": "matter",
- "version": "chip-v1"
- },
{
"pathRelativity": "relativeToZap",
"path": "../../../src/app/zap-templates/zcl/zcl.json",
@@ -31,6 +24,13 @@
"category": "matter",
"version": 1,
"description": "Matter SDK ZCL data"
+ },
+ {
+ "pathRelativity": "relativeToZap",
+ "path": "../../../src/app/zap-templates/app-templates.json",
+ "type": "gen-templates-json",
+ "category": "matter",
+ "version": "chip-v1"
}
],
"endpointTypes": [
@@ -910,7 +910,7 @@
"storageOption": "External",
"singleton": 1,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
diff --git a/examples/all-clusters-minimal-app/esp32/sdkconfig.defaults.esp32c2 b/examples/all-clusters-minimal-app/esp32/sdkconfig.defaults.esp32c2
index 6cb90db4f55b9d..200dc5825bc2e2 100644
--- a/examples/all-clusters-minimal-app/esp32/sdkconfig.defaults.esp32c2
+++ b/examples/all-clusters-minimal-app/esp32/sdkconfig.defaults.esp32c2
@@ -17,3 +17,6 @@ CONFIG_BT_NIMBLE_ROLE_OBSERVER=n
CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=4
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=8
CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=16
+
+# Event Queue Size
+CONFIG_MAX_EVENT_QUEUE_SIZE=25
diff --git a/examples/chef/devices/rootnode_airpurifier_73a6fe2651.zap b/examples/chef/devices/rootnode_airpurifier_73a6fe2651.zap
index d72b6d11800223..78aa987f1d8fa6 100644
--- a/examples/chef/devices/rootnode_airpurifier_73a6fe2651.zap
+++ b/examples/chef/devices/rootnode_airpurifier_73a6fe2651.zap
@@ -17,13 +17,6 @@
}
],
"package": [
- {
- "pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/app-templates.json",
- "type": "gen-templates-json",
- "category": "matter",
- "version": "chip-v1"
- },
{
"pathRelativity": "relativeToZap",
"path": "../../../src/app/zap-templates/zcl/zcl.json",
@@ -31,6 +24,13 @@
"category": "matter",
"version": 1,
"description": "Matter SDK ZCL data"
+ },
+ {
+ "pathRelativity": "relativeToZap",
+ "path": "../../../src/app/zap-templates/app-templates.json",
+ "type": "gen-templates-json",
+ "category": "matter",
+ "version": "chip-v1"
}
],
"endpointTypes": [
diff --git a/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.zap b/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.zap
index 127d31dc60551f..535aa424e1d2a7 100644
--- a/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.zap
+++ b/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.zap
@@ -2997,7 +2997,7 @@
"storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -3013,7 +3013,7 @@
"storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -3029,7 +3029,7 @@
"storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -3045,7 +3045,7 @@
"storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -3061,7 +3061,7 @@
"storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
diff --git a/examples/chef/devices/rootnode_pump_5f904818cc.zap b/examples/chef/devices/rootnode_pump_5f904818cc.zap
index ca8e1ad91d30fc..f28d7cfbab317e 100644
--- a/examples/chef/devices/rootnode_pump_5f904818cc.zap
+++ b/examples/chef/devices/rootnode_pump_5f904818cc.zap
@@ -579,7 +579,7 @@
"storageOption": "External",
"singleton": 1,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
diff --git a/examples/chef/devices/rootnode_pump_a811bb33a0.zap b/examples/chef/devices/rootnode_pump_a811bb33a0.zap
index ad107294293b67..6314e3fb0c2e3a 100644
--- a/examples/chef/devices/rootnode_pump_a811bb33a0.zap
+++ b/examples/chef/devices/rootnode_pump_a811bb33a0.zap
@@ -579,7 +579,7 @@
"storageOption": "External",
"singleton": 1,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
diff --git a/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.zap b/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.zap
index 6833a1a52bb222..a784ab5723b85f 100644
--- a/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.zap
+++ b/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.zap
@@ -17,13 +17,6 @@
}
],
"package": [
- {
- "pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/app-templates.json",
- "type": "gen-templates-json",
- "category": "matter",
- "version": "chip-v1"
- },
{
"pathRelativity": "relativeToZap",
"path": "../../../src/app/zap-templates/zcl/zcl.json",
diff --git a/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp b/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp
index 9e4f29c5534757..294673512882b3 100644
--- a/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp
+++ b/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp
@@ -241,7 +241,8 @@ CHIP_ERROR LogDiscoveredNodeData(const chip::Dnssd::CommissionNodeData & nodeDat
value["rotatingIdLen"] = static_cast(commissionData.rotatingIdLen);
value["pairingHint"] = commissionData.pairingHint;
value["pairingInstruction"] = commissionData.pairingInstruction;
- value["supportsTcp"] = resolutionData.supportsTcp;
+ value["supportsTcpClient"] = resolutionData.supportsTcpClient;
+ value["supportsTcpServer"] = resolutionData.supportsTcpServer;
value["port"] = resolutionData.port;
value["numIPs"] = static_cast(resolutionData.numIPs);
diff --git a/examples/chip-tool/commands/discover/Commands.h b/examples/chip-tool/commands/discover/Commands.h
index e7a59dbaee9110..d308d4ab75b430 100644
--- a/examples/chip-tool/commands/discover/Commands.h
+++ b/examples/chip-tool/commands/discover/Commands.h
@@ -53,7 +53,8 @@ class Resolve : public DiscoverCommand, public chip::AddressResolve::NodeListene
result.mrpRemoteConfig.mIdleRetransTimeout.count());
ChipLogProgress(chipTool, " MRP retry interval (active): %" PRIu32 "ms",
result.mrpRemoteConfig.mActiveRetransTimeout.count());
- ChipLogProgress(chipTool, " Supports TCP: %s", result.supportsTcp ? "yes" : "no");
+ ChipLogProgress(chipTool, " Supports TCP Client: %s", result.supportsTcpClient ? "yes" : "no");
+ ChipLogProgress(chipTool, " Supports TCP Server: %s", result.supportsTcpServer ? "yes" : "no");
ChipLogProgress(chipTool, " ICD is operating as: %s", result.isICDOperatingAsLIT ? "LIT" : "SIT");
SetCommandExitStatus(CHIP_NO_ERROR);
}
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/contact-sensor-app/nxp/k32w/k32w0/README.md b/examples/contact-sensor-app/nxp/k32w/k32w0/README.md
index ae519c9808c882..ac418ecbd4aa77 100644
--- a/examples/contact-sensor-app/nxp/k32w/k32w0/README.md
+++ b/examples/contact-sensor-app/nxp/k32w/k32w0/README.md
@@ -730,9 +730,14 @@ Please see more in the
Here is an example that generates an OTA image with application update TLV:
```
-./scripts/tools/nxp/ota/ota_image_tool.py create -v 0xDEAD -p 0xBEEF -vn 42021 -vs "1.0" -da sha256 --app-input-file chip-k32w0x-contact-example.bin chip-k32w0x-contact-example.ota
+./scripts/tools/nxp/ota/ota_image_tool.py create -v 0xDEAD -p 0xBEEF -vn 2 -vs "2.0" -da sha256 --enc_enable --input_ota_key "1234567890ABCDEFA1B2C3D4E5F6F1B4" --app-input-file chip-k32w0x-contact-example.bin chip-k32w0x-contact-example.ota
```
+Please note the two options `--enc_enable` and `--input_ota_key`, which are
+mandatory when `chip_with_ota_encryption=1`. The value of `--input_ota_key` must
+match the value of `chip_with_ota_key`. See `args.gni` for the default gn
+configuration.
+
A note regarding OTA image header version (`-vn` option). An application binary
has its own software version, given by
`CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION` (`42020` by default), which can be
diff --git a/examples/contact-sensor-app/nxp/zap-lit/contact-sensor-app.zap b/examples/contact-sensor-app/nxp/zap-lit/contact-sensor-app.zap
index 7cba96b7f511d6..64c948a5c8c233 100644
--- a/examples/contact-sensor-app/nxp/zap-lit/contact-sensor-app.zap
+++ b/examples/contact-sensor-app/nxp/zap-lit/contact-sensor-app.zap
@@ -563,7 +563,7 @@
"storageOption": "External",
"singleton": 1,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
diff --git a/examples/contact-sensor-app/nxp/zap-sit/contact-sensor-app.zap b/examples/contact-sensor-app/nxp/zap-sit/contact-sensor-app.zap
index 3caa58a4d7f042..0b05af158f1bde 100644
--- a/examples/contact-sensor-app/nxp/zap-sit/contact-sensor-app.zap
+++ b/examples/contact-sensor-app/nxp/zap-sit/contact-sensor-app.zap
@@ -563,7 +563,7 @@
"storageOption": "External",
"singleton": 1,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
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/energy-management-app/energy-management-common/energy-management-app.matter b/examples/energy-management-app/energy-management-common/energy-management-app.matter
index 3035f377a13475..f34ffd80cdf87b 100644
--- a/examples/energy-management-app/energy-management-common/energy-management-app.matter
+++ b/examples/energy-management-app/energy-management-common/energy-management-app.matter
@@ -1651,7 +1651,7 @@ provisional cluster DeviceEnergyManagement = 152 {
/** Electric Vehicle Supply Equipment (EVSE) is equipment used to charge an Electric Vehicle (EV) or Plug-In Hybrid Electric Vehicle. This cluster provides an interface to the functionality of Electric Vehicle Supply Equipment (EVSE) management. */
cluster EnergyEvse = 153 {
- revision 2;
+ revision 4;
enum EnergyTransferStoppedReasonEnum : enum8 {
kEVStopped = 0;
@@ -1695,6 +1695,7 @@ cluster EnergyEvse = 153 {
kDischargingEnabled = 2;
kDisabledError = 3;
kDisabledDiagnostics = 4;
+ kEnabled = 5;
}
bitmap Feature : bitmap32 {
@@ -1742,6 +1743,7 @@ cluster EnergyEvse = 153 {
int32u sessionID = 0;
StateEnum state = 1;
amperage_ma maximumCurrent = 2;
+ optional amperage_ma maximumDischargeCurrent = 3;
}
info event EnergyTransferStopped = 3 {
@@ -1749,6 +1751,7 @@ cluster EnergyEvse = 153 {
StateEnum state = 1;
EnergyTransferStoppedReasonEnum reason = 2;
energy_mwh energyTransferred = 4;
+ optional energy_mwh energyDischarged = 5;
}
critical event Fault = 4 {
@@ -1813,15 +1816,15 @@ cluster EnergyEvse = 153 {
/** Allows a client to disable the EVSE from charging and discharging. */
timed command Disable(): DefaultSuccess = 1;
- /** Allows a client to enable the EVSE to charge an EV. */
+ /** This command allows a client to enable the EVSE to charge an EV, */
timed command EnableCharging(EnableChargingRequest): DefaultSuccess = 2;
- /** Allows a client to enable the EVSE to discharge an EV. */
+ /** Upon receipt, this SHALL allow a client to enable the discharge of an EV, */
timed command EnableDischarging(EnableDischargingRequest): DefaultSuccess = 3;
/** Allows a client to put the EVSE into a self-diagnostics mode. */
timed command StartDiagnostics(): DefaultSuccess = 4;
/** Allows a client to set the user specified charging targets. */
timed command SetTargets(SetTargetsRequest): DefaultSuccess = 5;
- /** Allows a client to retrieve the user specified charging targets. */
+ /** Allows a client to retrieve the current set of charging targets. */
timed command GetTargets(): GetTargetsResponse = 6;
/** Allows a client to clear all stored charging targets. */
timed command ClearTargets(): DefaultSuccess = 7;
diff --git a/examples/energy-management-app/energy-management-common/energy-management-app.zap b/examples/energy-management-app/energy-management-common/energy-management-app.zap
index 597247dbc6998c..dc4b11c14c6742 100644
--- a/examples/energy-management-app/energy-management-common/energy-management-app.zap
+++ b/examples/energy-management-app/energy-management-common/energy-management-app.zap
@@ -627,7 +627,7 @@
"storageOption": "External",
"singleton": 1,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
diff --git a/examples/energy-management-app/esp32/sdkconfig.defaults.esp32c2 b/examples/energy-management-app/esp32/sdkconfig.defaults.esp32c2
index 5e5d596cacb673..2347f73ec8cc6c 100644
--- a/examples/energy-management-app/esp32/sdkconfig.defaults.esp32c2
+++ b/examples/energy-management-app/esp32/sdkconfig.defaults.esp32c2
@@ -18,5 +18,8 @@ CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=4
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=8
CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=16
+# Event Queue Size
+CONFIG_MAX_EVENT_QUEUE_SIZE=25
+
# Enable HKDF in mbedtls
CONFIG_MBEDTLS_HKDF_C=y
diff --git a/examples/fabric-admin/commands/common/RemoteDataModelLogger.cpp b/examples/fabric-admin/commands/common/RemoteDataModelLogger.cpp
index c8e9d5a5450703..6334d42506d53f 100644
--- a/examples/fabric-admin/commands/common/RemoteDataModelLogger.cpp
+++ b/examples/fabric-admin/commands/common/RemoteDataModelLogger.cpp
@@ -241,7 +241,8 @@ CHIP_ERROR LogDiscoveredNodeData(const chip::Dnssd::CommissionNodeData & nodeDat
value["rotatingIdLen"] = static_cast(commissionData.rotatingIdLen);
value["pairingHint"] = commissionData.pairingHint;
value["pairingInstruction"] = commissionData.pairingInstruction;
- value["supportsTcp"] = resolutionData.supportsTcp;
+ value["supportsTcpClient"] = resolutionData.supportsTcpClient;
+ value["supportsTcpServer"] = resolutionData.supportsTcpServer;
value["port"] = resolutionData.port;
value["numIPs"] = static_cast(resolutionData.numIPs);
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/light-switch-app/qpg/zap/switch.zap b/examples/light-switch-app/qpg/zap/switch.zap
index 0f65ac5eb64615..362ef409bebaa6 100644
--- a/examples/light-switch-app/qpg/zap/switch.zap
+++ b/examples/light-switch-app/qpg/zap/switch.zap
@@ -17,13 +17,6 @@
}
],
"package": [
- {
- "pathRelativity": "relativeToZap",
- "path": "../../../../src/app/zap-templates/app-templates.json",
- "type": "gen-templates-json",
- "category": "matter",
- "version": "chip-v1"
- },
{
"pathRelativity": "relativeToZap",
"path": "../../../../src/app/zap-templates/zcl/zcl.json",
@@ -31,6 +24,13 @@
"category": "matter",
"version": 1,
"description": "Matter SDK ZCL data"
+ },
+ {
+ "pathRelativity": "relativeToZap",
+ "path": "../../../../src/app/zap-templates/app-templates.json",
+ "type": "gen-templates-json",
+ "category": "matter",
+ "version": "chip-v1"
}
],
"endpointTypes": [
diff --git a/examples/lighting-app/esp32/sdkconfig.defaults.esp32c2 b/examples/lighting-app/esp32/sdkconfig.defaults.esp32c2
index 5e5d596cacb673..2347f73ec8cc6c 100644
--- a/examples/lighting-app/esp32/sdkconfig.defaults.esp32c2
+++ b/examples/lighting-app/esp32/sdkconfig.defaults.esp32c2
@@ -18,5 +18,8 @@ CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=4
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=8
CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=16
+# Event Queue Size
+CONFIG_MAX_EVENT_QUEUE_SIZE=25
+
# Enable HKDF in mbedtls
CONFIG_MBEDTLS_HKDF_C=y
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/lighting-app/lighting-common/lighting-app.zap b/examples/lighting-app/lighting-common/lighting-app.zap
index 69ee10fe7794f0..6489a395b38c7e 100644
--- a/examples/lighting-app/lighting-common/lighting-app.zap
+++ b/examples/lighting-app/lighting-common/lighting-app.zap
@@ -19,18 +19,18 @@
"package": [
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/zcl/zcl.json",
- "type": "zcl-properties",
+ "path": "../../../src/app/zap-templates/app-templates.json",
+ "type": "gen-templates-json",
"category": "matter",
- "version": 1,
- "description": "Matter SDK ZCL data"
+ "version": "chip-v1"
},
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/app-templates.json",
- "type": "gen-templates-json",
+ "path": "../../../src/app/zap-templates/zcl/zcl.json",
+ "type": "zcl-properties",
"category": "matter",
- "version": "chip-v1"
+ "version": 1,
+ "description": "Matter SDK ZCL data"
}
],
"endpointTypes": [
diff --git a/examples/lighting-app/nxp/zap/lighting-on-off.zap b/examples/lighting-app/nxp/zap/lighting-on-off.zap
index beccb5480ca340..839971a84dec9e 100644
--- a/examples/lighting-app/nxp/zap/lighting-on-off.zap
+++ b/examples/lighting-app/nxp/zap/lighting-on-off.zap
@@ -499,7 +499,7 @@
"storageOption": "External",
"singleton": 1,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
diff --git a/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.zap b/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.zap
index ba855b3908feae..65236d3c49498e 100644
--- a/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.zap
+++ b/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.zap
@@ -19,18 +19,18 @@
"package": [
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/zcl/zcl.json",
- "type": "zcl-properties",
+ "path": "../../../src/app/zap-templates/app-templates.json",
+ "type": "gen-templates-json",
"category": "matter",
- "version": 1,
- "description": "Matter SDK ZCL data"
+ "version": "chip-v1"
},
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/app-templates.json",
- "type": "gen-templates-json",
+ "path": "../../../src/app/zap-templates/zcl/zcl.json",
+ "type": "zcl-properties",
"category": "matter",
- "version": "chip-v1"
+ "version": 1,
+ "description": "Matter SDK ZCL data"
}
],
"endpointTypes": [
@@ -712,7 +712,7 @@
"storageOption": "External",
"singleton": 1,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
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/lock-app/nxp/zap/lock-app.zap b/examples/lock-app/nxp/zap/lock-app.zap
index ff1ead7297c757..70442ac916c7fe 100644
--- a/examples/lock-app/nxp/zap/lock-app.zap
+++ b/examples/lock-app/nxp/zap/lock-app.zap
@@ -499,7 +499,7 @@
"storageOption": "External",
"singleton": 1,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
diff --git a/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.zap b/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.zap
index 03113285ad2567..1df2afdd38fc8a 100644
--- a/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.zap
+++ b/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.zap
@@ -19,18 +19,18 @@
"package": [
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/zcl/zcl.json",
- "type": "zcl-properties",
+ "path": "../../../src/app/zap-templates/app-templates.json",
+ "type": "gen-templates-json",
"category": "matter",
- "version": 1,
- "description": "Matter SDK ZCL data"
+ "version": "chip-v1"
},
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/app-templates.json",
- "type": "gen-templates-json",
+ "path": "../../../src/app/zap-templates/zcl/zcl.json",
+ "type": "zcl-properties",
"category": "matter",
- "version": "chip-v1"
+ "version": 1,
+ "description": "Matter SDK ZCL data"
}
],
"endpointTypes": [
diff --git a/examples/ota-provider-app/ota-provider-common/ota-provider-app.zap b/examples/ota-provider-app/ota-provider-common/ota-provider-app.zap
index c98b9e661328e5..b019c91de5ef04 100644
--- a/examples/ota-provider-app/ota-provider-common/ota-provider-app.zap
+++ b/examples/ota-provider-app/ota-provider-common/ota-provider-app.zap
@@ -19,18 +19,18 @@
"package": [
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/zcl/zcl.json",
- "type": "zcl-properties",
+ "path": "../../../src/app/zap-templates/app-templates.json",
+ "type": "gen-templates-json",
"category": "matter",
- "version": 1,
- "description": "Matter SDK ZCL data"
+ "version": "chip-v1"
},
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/app-templates.json",
- "type": "gen-templates-json",
+ "path": "../../../src/app/zap-templates/zcl/zcl.json",
+ "type": "zcl-properties",
"category": "matter",
- "version": "chip-v1"
+ "version": 1,
+ "description": "Matter SDK ZCL data"
}
],
"endpointTypes": [
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..ce4e60fe260d25 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
@@ -19,18 +19,18 @@
"package": [
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/zcl/zcl.json",
- "type": "zcl-properties",
+ "path": "../../../src/app/zap-templates/app-templates.json",
+ "type": "gen-templates-json",
"category": "matter",
- "version": 1,
- "description": "Matter SDK ZCL data"
+ "version": "chip-v1"
},
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/app-templates.json",
- "type": "gen-templates-json",
+ "path": "../../../src/app/zap-templates/zcl/zcl.json",
+ "type": "zcl-properties",
"category": "matter",
- "version": "chip-v1"
+ "version": 1,
+ "description": "Matter SDK ZCL data"
}
],
"endpointTypes": [
@@ -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,47 +1073,111 @@
"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": "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,
+ "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,
@@ -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,
@@ -1548,39 +2004,103 @@
"code": 0,
"mfgCode": null,
"side": "server",
- "type": "array",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "RebootCount",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "UpTime",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int64u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 0,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "TotalOperationalHours",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int32u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "BootReason",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "BootReasonEnum",
"included": 1,
"storageOption": "External",
"singleton": 0,
"bounded": 0,
"defaultValue": null,
"reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
+ "minInterval": 1,
+ "maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "RebootCount",
- "code": 1,
+ "name": "ActiveHardwareFaults",
+ "code": 5,
"mfgCode": null,
"side": "server",
- "type": "int16u",
+ "type": "array",
"included": 1,
"storageOption": "External",
"singleton": 0,
"bounded": 0,
"defaultValue": null,
"reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
+ "minInterval": 1,
+ "maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "UpTime",
- "code": 2,
+ "name": "ActiveRadioFaults",
+ "code": 6,
"mfgCode": null,
"side": "server",
- "type": "int64u",
+ "type": "array",
"included": 1,
"storageOption": "External",
"singleton": 0,
@@ -1592,11 +2112,11 @@
"reportableChange": 0
},
{
- "name": "TotalOperationalHours",
- "code": 3,
+ "name": "ActiveNetworkFaults",
+ "code": 7,
"mfgCode": null,
"side": "server",
- "type": "int32u",
+ "type": "array",
"included": 1,
"storageOption": "External",
"singleton": 0,
@@ -1608,24 +2128,24 @@
"reportableChange": 0
},
{
- "name": "BootReason",
- "code": 4,
+ "name": "TestEventTriggersEnabled",
+ "code": 8,
"mfgCode": null,
"side": "server",
- "type": "BootReasonEnum",
+ "type": "boolean",
"included": 1,
"storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": null,
+ "defaultValue": "false",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "ActiveHardwareFaults",
- "code": 5,
+ "name": "GeneratedCommandList",
+ "code": 65528,
"mfgCode": null,
"side": "server",
"type": "array",
@@ -1633,15 +2153,15 @@
"storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": null,
+ "defaultValue": "",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "ActiveRadioFaults",
- "code": 6,
+ "name": "AcceptedCommandList",
+ "code": 65529,
"mfgCode": null,
"side": "server",
"type": "array",
@@ -1649,15 +2169,15 @@
"storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": null,
+ "defaultValue": "",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "ActiveNetworkFaults",
- "code": 7,
+ "name": "EventList",
+ "code": 65530,
"mfgCode": null,
"side": "server",
"type": "array",
@@ -1665,23 +2185,23 @@
"storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": null,
+ "defaultValue": "",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "TestEventTriggersEnabled",
- "code": 8,
+ "name": "AttributeList",
+ "code": 65531,
"mfgCode": null,
"side": "server",
- "type": "boolean",
+ "type": "array",
"included": 1,
"storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "false",
+ "defaultValue": "",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -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/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp b/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp
index 5253b3b2ec5062..59bf52bbc0f30f 100644
--- a/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp
+++ b/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp
@@ -19,9 +19,10 @@
#include
#include
-#include "silabs_utils.h"
#include "sl_status.h"
#include
+#include
+#include
#include "FreeRTOS.h"
#include "event_groups.h"
@@ -132,14 +133,14 @@ static void CancelDHCPTimer()
// Check if timer started
if (!osTimerIsRunning(sDHCPTimer))
{
- SILABS_LOG("CancelDHCPTimer: timer not running");
+ ChipLogDetail(DeviceLayer, "CancelDHCPTimer: timer not running");
return;
}
status = osTimerStop(sDHCPTimer);
if (status != osOK)
{
- SILABS_LOG("CancelDHCPTimer: failed to stop timer with status: %d", status);
+ ChipLogError(DeviceLayer, "CancelDHCPTimer: failed to stop timer: %d", status);
}
}
@@ -153,7 +154,7 @@ static void StartDHCPTimer(uint32_t timeout)
status = osTimerStart(sDHCPTimer, pdMS_TO_TICKS(timeout));
if (status != osOK)
{
- SILABS_LOG("StartDHCPTimer: failed to start timer with status: %d", status);
+ ChipLogError(DeviceLayer, "StartDHCPTimer: failed to start timer: %d", status);
}
}
@@ -171,7 +172,7 @@ int32_t wfx_rsi_get_ap_info(wfx_wifi_scan_result_t * ap)
int32_t rssi = 0;
ap->security = wfx_rsi.sec.security;
ap->chan = wfx_rsi.ap_chan;
- memcpy(&ap->bssid[0], &wfx_rsi.ap_mac.octet[0], BSSID_MAX_STR_LEN);
+ memcpy(&ap->bssid[0], &wfx_rsi.ap_mac.octet[0], BSSID_LEN);
sl_wifi_get_signal_strength(SL_WIFI_CLIENT_INTERFACE, &rssi);
ap->rssi = rssi;
return status;
@@ -246,7 +247,7 @@ sl_status_t join_callback_handler(sl_wifi_event_t event, char * result, uint32_t
if (SL_WIFI_CHECK_IF_EVENT_FAILED(event))
{
callback_status = *(sl_status_t *) result;
- SILABS_LOG("join_callback_handler: failed: 0x%X", callback_status);
+ ChipLogError(DeviceLayer, "join_callback_handler: failed: 0x%lx", static_cast(callback_status));
wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTED);
wfx_retry_interval_handler(is_wifi_disconnection_event, wfx_rsi.join_retries++);
if (is_wifi_disconnection_event || wfx_rsi.join_retries <= WFX_RSI_CONFIG_MAX_JOIN)
@@ -259,8 +260,8 @@ sl_status_t join_callback_handler(sl_wifi_event_t event, char * result, uint32_t
/*
* Join was complete - Do the DHCP
*/
- memset(&temp_reset, 0, sizeof(wfx_wifi_scan_ext_t));
- SILABS_LOG("join_callback_handler: success");
+ ChipLogDetail(DeviceLayer, "join_callback_handler: success");
+ memset(&temp_reset, 0, sizeof(temp_reset));
WfxEvent.eventType = WFX_EVT_STA_CONN;
WfxPostEvent(&WfxEvent);
@@ -329,14 +330,14 @@ int32_t wfx_rsi_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_
status = rsi_bt_power_save_profile(sl_si91x_ble_state, 0);
if (status != RSI_SUCCESS)
{
- SILABS_LOG("BT Powersave Config Failed, Error Code : 0x%lX", status);
+ ChipLogError(DeviceLayer, "rsi_bt_power_save_profile failed: 0x%lx", static_cast(status));
return status;
}
sl_wifi_performance_profile_t wifi_profile = { .profile = sl_si91x_wifi_state };
status = sl_wifi_set_performance_profile(&wifi_profile);
if (status != RSI_SUCCESS)
{
- SILABS_LOG("Powersave Config Failed, Error Code : 0x%lX", status);
+ ChipLogError(DeviceLayer, "sl_wifi_set_performance_profile failed: 0x%lx", static_cast(status));
return status;
}
if (sl_si91x_wifi_state == HIGH_PERFORMANCE)
@@ -361,34 +362,23 @@ int32_t wfx_rsi_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_
*****************************************************************************************/
int32_t wfx_wifi_rsi_init(void)
{
- SILABS_LOG("wfx_wifi_rsi_init started");
+ ChipLogDetail(DeviceLayer, "wfx_wifi_rsi_init started");
sl_status_t status;
status = sl_wifi_init(&config, NULL, sl_wifi_default_event_handler);
- if (status != SL_STATUS_OK)
- {
- return status;
- }
+ VerifyOrReturnError(status == SL_STATUS_OK, status);
// Create Sempaphore for scan
sScanSemaphore = osSemaphoreNew(1, 0, NULL);
- if (sScanSemaphore == NULL)
- {
- return SL_STATUS_ALLOCATION_FAILED;
- }
+ VerifyOrReturnError(sScanSemaphore != NULL, SL_STATUS_ALLOCATION_FAILED);
+
// Create the message queue
sWifiEventQueue = osMessageQueueNew(WFX_QUEUE_SIZE, sizeof(WfxEvent_t), NULL);
- if (sWifiEventQueue == NULL)
- {
- return SL_STATUS_ALLOCATION_FAILED;
- }
+ VerifyOrReturnError(sWifiEventQueue != NULL, SL_STATUS_ALLOCATION_FAILED);
// Create timer for DHCP polling
// TODO: Use LWIP timer instead of creating a new one here
sDHCPTimer = osTimerNew(DHCPTimerEventHandler, osTimerPeriodic, NULL, NULL);
- if (sDHCPTimer == NULL)
- {
- return SL_STATUS_ALLOCATION_FAILED;
- }
+ VerifyOrReturnError(sDHCPTimer != NULL, SL_STATUS_ALLOCATION_FAILED);
return status;
}
@@ -403,9 +393,9 @@ int32_t wfx_wifi_rsi_init(void)
*****************************************************************************************/
static void sl_print_firmware_version(sl_wifi_firmware_version_t * firmware_version)
{
- SILABS_LOG("Firmware version is: %x%x.%d.%d.%d.%d.%d.%d", firmware_version->chip_id, firmware_version->rom_id,
- firmware_version->major, firmware_version->minor, firmware_version->security_version, firmware_version->patch_num,
- firmware_version->customer_id, firmware_version->build_num);
+ ChipLogDetail(DeviceLayer, "Firmware version is: %x%x.%d.%d.%d.%d.%d.%d", firmware_version->chip_id, firmware_version->rom_id,
+ firmware_version->major, firmware_version->minor, firmware_version->security_version, firmware_version->patch_num,
+ firmware_version->customer_id, firmware_version->build_num);
}
/*************************************************************************************
@@ -424,7 +414,7 @@ static sl_status_t wfx_rsi_init(void)
status = wfx_wifi_rsi_init();
if (status != SL_STATUS_OK)
{
- SILABS_LOG("wfx_rsi_init failed %x", status);
+ ChipLogError(DeviceLayer, "wfx_rsi_init failed: 0x%lx", static_cast(status));
return status;
}
#else // For SoC
@@ -433,7 +423,7 @@ static sl_status_t wfx_rsi_init(void)
status = sl_si91x_m4_ta_secure_handshake(SL_SI91X_ENABLE_XTAL, 1, &xtal_enable, 0, NULL);
if (status != SL_STATUS_OK)
{
- SILABS_LOG("Failed to bring m4_ta_secure_handshake: 0x%lx\r\n", status);
+ ChipLogError(DeviceLayer, "sl_si91x_m4_ta_secure_handshake failed: 0x%lx", static_cast(status));
return status;
}
#endif /* CHIP_CONFIG_ENABLE_ICD_SERVER */
@@ -443,8 +433,7 @@ static sl_status_t wfx_rsi_init(void)
status = sl_wifi_get_firmware_version(&version);
if (status != SL_STATUS_OK)
{
- SILABS_LOG("Get fw version failed:");
- sl_print_firmware_version(&version);
+ ChipLogError(DeviceLayer, "sl_wifi_get_firmware_version failed: 0x%lx", static_cast(status));
return status;
}
sl_print_firmware_version(&version);
@@ -452,7 +441,7 @@ static sl_status_t wfx_rsi_init(void)
status = sl_wifi_get_mac_address(SL_WIFI_CLIENT_INTERFACE, (sl_mac_address_t *) &wfx_rsi.sta_mac.octet[0]);
if (status != SL_STATUS_OK)
{
- SILABS_LOG("sl_wifi_get_mac_address failed: %x", status);
+ ChipLogDetail(DeviceLayer, "sl_wifi_get_mac_address failed: 0x%lx", static_cast(status));
return status;
}
@@ -463,7 +452,7 @@ static sl_status_t wfx_rsi_init(void)
status = sl_si91x_trng_entropy();
if (status != SL_STATUS_OK)
{
- SILABS_LOG("TRNG Entropy Failed");
+ ChipLogError(DeviceLayer, "sl_si91x_trng_entropy failed: 0x%lx", static_cast(status));
return status;
}
@@ -471,7 +460,7 @@ static sl_status_t wfx_rsi_init(void)
status = sl_si91x_trng_program_key((uint32_t *) trngKey, TRNG_KEY_SIZE);
if (status != SL_STATUS_OK)
{
- SILABS_LOG("TRNG Key Programming Failed");
+ ChipLogError(DeviceLayer, "sl_si91x_trng_program_key failed: 0x%lx", static_cast(status));
return status;
}
#endif // SL_MBEDTLS_USE_TINYCRYPT
@@ -492,7 +481,7 @@ static sl_status_t wfx_rsi_init(void)
*****************************************************************************************/
void wfx_show_err(char * msg)
{
- SILABS_LOG("wfx_show_err: message: %d", msg);
+ ChipLogError(DeviceLayer, "wfx_show_err: message: %s", msg);
}
sl_status_t scan_callback_handler(sl_wifi_event_t event, sl_wifi_scan_result_t * scan_result, uint32_t result_length, void * arg)
@@ -500,12 +489,12 @@ sl_status_t scan_callback_handler(sl_wifi_event_t event, sl_wifi_scan_result_t *
if (SL_WIFI_CHECK_IF_EVENT_FAILED(event))
{
callback_status = *(sl_status_t *) scan_result;
- SILABS_LOG("scan_callback_handler: failed: 0x%X", callback_status);
+ ChipLogError(DeviceLayer, "scan_callback_handler: failed: 0x%lx", static_cast(callback_status));
scan_results_complete = true;
#if WIFI_ENABLE_SECURITY_WPA3_TRANSITION
wfx_rsi.sec.security = WFX_SEC_WPA3;
#else
- wfx_rsi.sec.security = WFX_SEC_WPA2;
+ wfx_rsi.sec.security = WFX_SEC_WPA2;
#endif /* WIFI_ENABLE_SECURITY_WPA3_TRANSITION */
osSemaphoreRelease(sScanSemaphore);
@@ -513,7 +502,7 @@ sl_status_t scan_callback_handler(sl_wifi_event_t event, sl_wifi_scan_result_t *
}
wfx_rsi.sec.security = WFX_SEC_UNSPECIFIED;
wfx_rsi.ap_chan = scan_result->scan_info[0].rf_channel;
- memcpy(&wfx_rsi.ap_mac.octet, scan_result->scan_info[0].bssid, BSSID_MAX_STR_LEN);
+ memcpy(&wfx_rsi.ap_mac.octet, scan_result->scan_info[0].bssid, BSSID_LEN);
switch (scan_result->scan_info[0].security_mode)
{
case SL_WIFI_OPEN:
@@ -536,7 +525,7 @@ sl_status_t scan_callback_handler(sl_wifi_event_t event, sl_wifi_scan_result_t *
case SL_WIFI_WPA3:
wfx_rsi.sec.security = WFX_SEC_WPA3;
#else
- wfx_rsi.sec.security = WFX_SEC_WPA2;
+ wfx_rsi.sec.security = WFX_SEC_WPA2;
#endif /* WIFI_ENABLE_SECURITY_WPA3_TRANSITION */
break;
default:
@@ -549,44 +538,48 @@ sl_status_t scan_callback_handler(sl_wifi_event_t event, sl_wifi_scan_result_t *
osSemaphoreRelease(sScanSemaphore);
return SL_STATUS_OK;
}
+
sl_status_t show_scan_results(sl_wifi_scan_result_t * scan_result)
{
SL_WIFI_ARGS_CHECK_NULL_POINTER(scan_result);
- int x;
- wfx_wifi_scan_result_t ap;
- for (x = 0; x < (int) scan_result->scan_count; x++)
+ VerifyOrReturnError(wfx_rsi.scan_cb != NULL, SL_STATUS_INVALID_HANDLE);
+
+ wfx_wifi_scan_result_t cur_scan_result;
+ for (int idx = 0; idx < (int) scan_result->scan_count; idx++)
{
- strcpy(&ap.ssid[0], (char *) &scan_result->scan_info[x].ssid);
- if (wfx_rsi.scan_ssid)
+ memset(&cur_scan_result, 0, sizeof(cur_scan_result));
+ strncpy(cur_scan_result.ssid, (char *) &scan_result->scan_info[idx].ssid, WFX_MAX_SSID_LENGTH);
+
+ // if user has provided ssid, then check if the current scan result ssid matches the user provided ssid
+ if (wfx_rsi.scan_ssid != NULL && strcmp(wfx_rsi.scan_ssid, cur_scan_result.ssid) != CMP_SUCCESS)
{
- SILABS_LOG("SCAN SSID: %s , ap scan: %s", wfx_rsi.scan_ssid, ap.ssid);
- if (strcmp(wfx_rsi.scan_ssid, ap.ssid) == CMP_SUCCESS)
- {
- ap.security = static_cast(scan_result->scan_info[x].security_mode);
- ap.rssi = (-1) * scan_result->scan_info[x].rssi_val;
- memcpy(&ap.bssid[0], &scan_result->scan_info[x].bssid[0], BSSID_MAX_STR_LEN);
- (*wfx_rsi.scan_cb)(&ap);
- break;
- }
+ continue;
}
- else
+ cur_scan_result.security = static_cast(scan_result->scan_info[idx].security_mode);
+ cur_scan_result.rssi = (-1) * scan_result->scan_info[idx].rssi_val;
+ memcpy(cur_scan_result.bssid, scan_result->scan_info[idx].bssid, BSSID_LEN);
+ wfx_rsi.scan_cb(&cur_scan_result);
+
+ // if user has not provided the ssid, then call the callback for each scan result
+ if (wfx_rsi.scan_ssid == NULL)
{
- ap.security = static_cast(scan_result->scan_info[x].security_mode);
- ap.rssi = (-1) * scan_result->scan_info[x].rssi_val;
- memcpy(&ap.bssid[0], &scan_result->scan_info[x].bssid[0], BSSID_MAX_STR_LEN);
- (*wfx_rsi.scan_cb)(&ap);
+ continue;
}
+ break;
}
+
+ // cleanup and return
wfx_rsi.dev_state &= ~WFX_RSI_ST_SCANSTARTED;
- (*wfx_rsi.scan_cb)((wfx_wifi_scan_result_t *) 0);
- wfx_rsi.scan_cb = (void (*)(wfx_wifi_scan_result_t *)) 0;
+ wfx_rsi.scan_cb((wfx_wifi_scan_result_t *) 0);
+ wfx_rsi.scan_cb = NULL;
if (wfx_rsi.scan_ssid)
{
vPortFree(wfx_rsi.scan_ssid);
- wfx_rsi.scan_ssid = (char *) 0;
+ wfx_rsi.scan_ssid = NULL;
}
return SL_STATUS_OK;
}
+
sl_status_t bg_scan_callback_handler(sl_wifi_event_t event, sl_wifi_scan_result_t * result, uint32_t result_length, void * arg)
{
callback_status = show_scan_results(result);
@@ -605,16 +598,18 @@ sl_status_t bg_scan_callback_handler(sl_wifi_event_t event, sl_wifi_scan_result_
static void wfx_rsi_save_ap_info() // translation
{
sl_status_t status = SL_STATUS_OK;
-#ifndef EXP_BOARD // TODO: this changes will be reverted back after the SDK team fix the scan API
+#ifndef EXP_BOARD
+ // TODO: this changes will be reverted back after the Silabs WiFi SDK team fix the scan API
sl_wifi_scan_configuration_t wifi_scan_configuration = default_wifi_scan_configuration;
#endif
sl_wifi_ssid_t ssid_arg;
- ssid_arg.length = strlen(wfx_rsi.sec.ssid);
- memcpy(ssid_arg.value, (int8_t *) &wfx_rsi.sec.ssid[0], ssid_arg.length);
+ memset(&ssid_arg, 0, sizeof(ssid_arg));
+ ssid_arg.length = strnlen(wfx_rsi.sec.ssid, WFX_MAX_SSID_LENGTH);
+ strncpy((char *) &ssid_arg.value[0], wfx_rsi.sec.ssid, WFX_MAX_SSID_LENGTH);
sl_wifi_set_scan_callback(scan_callback_handler, NULL);
scan_results_complete = false;
#ifndef EXP_BOARD
- // TODO: this changes will be reverted back after the SDK team fix the scan API
+ // TODO: this changes will be reverted back after the Silabs WiFi SDK team fix the scan API
status = sl_wifi_start_scan(SL_WIFI_CLIENT_2_4GHZ_INTERFACE, &ssid_arg, &wifi_scan_configuration);
#endif
if (SL_STATUS_IN_PROGRESS == status)
@@ -632,115 +627,81 @@ static void wfx_rsi_save_ap_info() // translation
**********************************************************************************************/
static sl_status_t wfx_rsi_do_join(void)
{
+ ReturnErrorCodeIf((wfx_rsi.dev_state & (WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED)), SL_STATUS_IN_PROGRESS);
sl_status_t status = SL_STATUS_OK;
- sl_wifi_security_t connect_security_mode;
+ sl_wifi_client_configuration_t ap;
+ memset(&ap, 0, sizeof(ap));
WfxEvent_t event;
switch (wfx_rsi.sec.security)
{
case WFX_SEC_WEP:
- connect_security_mode = SL_WIFI_WEP;
+ ap.security = SL_WIFI_WEP;
break;
case WFX_SEC_WPA:
- connect_security_mode = SL_WIFI_WPA_WPA2_MIXED;
+ ap.security = SL_WIFI_WPA_WPA2_MIXED;
break;
case WFX_SEC_WPA2:
#if WIFI_ENABLE_SECURITY_WPA3_TRANSITION
- connect_security_mode = SL_WIFI_WPA3_TRANSITION;
+ ap.security = SL_WIFI_WPA3_TRANSITION;
break;
case WFX_SEC_WPA3:
- connect_security_mode = SL_WIFI_WPA3_TRANSITION;
+ ap.security = SL_WIFI_WPA3_TRANSITION;
#else
- connect_security_mode = SL_WIFI_WPA_WPA2_MIXED;
+ ap.security = SL_WIFI_WPA_WPA2_MIXED;
#endif // WIFI_ENABLE_SECURITY_WPA3_TRANSITION
break;
case WFX_SEC_NONE:
- connect_security_mode = SL_WIFI_OPEN;
+ ap.security = SL_WIFI_OPEN;
break;
default:
- SILABS_LOG("error: unknown security type.");
+ ChipLogError(DeviceLayer, "wfx_rsi_do_join: unknown security type.");
return status;
}
-
- if (wfx_rsi.dev_state & (WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED))
- {
- SILABS_LOG("%s: not joining - already in progress", __func__);
- }
- else
- {
- SILABS_LOG("%s: WLAN: connecting to %s, sec=%d", __func__, &wfx_rsi.sec.ssid[0], wfx_rsi.sec.security);
-
- /*
- * Join the network
- */
- /* TODO - make the WFX_SECURITY_xxx - same as RSI_xxx
- * Right now it's done by hand - we need something better
- */
- wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTING;
-
- sl_wifi_set_join_callback(join_callback_handler, NULL);
+ /*
+ * Join the network
+ */
+ wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTING;
+ status = sl_wifi_set_join_callback(join_callback_handler, NULL);
+ VerifyOrReturnError(status == SL_STATUS_OK, status);
#if CHIP_CONFIG_ENABLE_ICD_SERVER
- // Setting the listen interval to 0 which will set it to DTIM interval
- sl_wifi_listen_interval_t sleep_interval = { .listen_interval = 0 };
- status = sl_wifi_set_listen_interval(SL_WIFI_CLIENT_INTERFACE, sleep_interval);
-
- sl_wifi_advanced_client_configuration_t client_config = { .max_retry_attempts = 5 };
- sl_wifi_set_advanced_client_configuration(SL_WIFI_CLIENT_INTERFACE, &client_config);
+ // Setting the listen interval to 0 which will set it to DTIM interval
+ sl_wifi_listen_interval_t sleep_interval = { .listen_interval = 0 };
+ status = sl_wifi_set_listen_interval(SL_WIFI_CLIENT_INTERFACE, sleep_interval);
+ VerifyOrReturnError(status == SL_STATUS_OK, status);
+
+ sl_wifi_advanced_client_configuration_t client_config = { .max_retry_attempts = 5 };
+ status = sl_wifi_set_advanced_client_configuration(SL_WIFI_CLIENT_INTERFACE, &client_config);
+ VerifyOrReturnError(status == SL_STATUS_OK, status);
#endif // CHIP_CONFIG_ENABLE_ICD_SERVER
- /* Try to connect Wifi with given Credentials
- * untill there is a success or maximum number of tries allowed
- */
-
- /* Call rsi connect call with given ssid and password
- * And check there is a success
- */
- sl_wifi_credential_t cred;
- memset(&cred, 0, sizeof(sl_wifi_credential_t));
- cred.type = SL_WIFI_PSK_CREDENTIAL;
- memcpy(cred.psk.value, &wfx_rsi.sec.passkey[0], strlen(wfx_rsi.sec.passkey));
- sl_net_credential_id_t id = SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID;
- status = sl_net_set_credential(id, SL_NET_WIFI_PSK, &wfx_rsi.sec.passkey[0], strlen(wfx_rsi.sec.passkey));
- if (SL_STATUS_OK != status)
- {
- SILABS_LOG("wfx_rsi_do_join: RSI callback register join failed with status: %02x", status);
- return status;
- }
-
- sl_wifi_client_configuration_t ap = { 0 };
- uint32_t timeout_ms = 0;
-
- ap.ssid.length = strlen(wfx_rsi.sec.ssid);
- memcpy(ap.ssid.value, (int8_t *) &wfx_rsi.sec.ssid[0], ap.ssid.length);
- ap.security = connect_security_mode;
- ap.encryption = SL_WIFI_NO_ENCRYPTION;
- ap.credential_id = id;
- if ((status = sl_wifi_connect(SL_WIFI_CLIENT_INTERFACE, &ap, timeout_ms)) == SL_STATUS_IN_PROGRESS)
- {
- callback_status = SL_STATUS_IN_PROGRESS;
- while (callback_status == SL_STATUS_IN_PROGRESS)
- {
- osThreadYield();
- }
- status = callback_status;
- }
- else
- {
- if (is_wifi_disconnection_event || wfx_rsi.join_retries <= WFX_RSI_CONFIG_MAX_JOIN)
- {
- SILABS_LOG("wfx_rsi_do_join: Wifi connect failed with status: %x", status);
- SILABS_LOG("wfx_rsi_do_join: starting JOIN to %s after %d tries\n", (char *) &wfx_rsi.sec.ssid[0],
- wfx_rsi.join_retries);
- wfx_rsi.join_retries += 1;
- wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED);
- wfx_retry_interval_handler(is_wifi_disconnection_event, wfx_rsi.join_retries);
- if (is_wifi_disconnection_event || wfx_rsi.join_retries <= MAX_JOIN_RETRIES_COUNT)
- {
- event.eventType = WFX_EVT_STA_START_JOIN;
- WfxPostEvent(&event);
- }
- }
- }
- }
+ size_t psk_length = strlen(wfx_rsi.sec.passkey);
+ VerifyOrReturnError(psk_length <= SL_WIFI_MAX_PSK_LENGTH, SL_STATUS_SI91X_INVALID_PSK_LENGTH);
+ sl_net_credential_id_t id = SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID;
+ status = sl_net_set_credential(id, SL_NET_WIFI_PSK, &wfx_rsi.sec.passkey[0], psk_length);
+ VerifyOrReturnError(status == SL_STATUS_OK, status);
+
+ uint32_t timeout_ms = 0;
+ ap.ssid.length = strnlen(wfx_rsi.sec.ssid, WFX_MAX_SSID_LENGTH);
+ ap.encryption = SL_WIFI_NO_ENCRYPTION;
+ ap.credential_id = id;
+ memset(&ap.ssid.value, 0, (sizeof(ap.ssid.value) / sizeof(ap.ssid.value[0])));
+ strncpy((char *) &ap.ssid.value[0], wfx_rsi.sec.ssid, WFX_MAX_SSID_LENGTH);
+ ChipLogDetail(DeviceLayer, "wfx_rsi_do_join: SSID: %s, SECURITY: %d(%d)", ap.ssid.value, ap.security, wfx_rsi.sec.security);
+ status = sl_wifi_connect(SL_WIFI_CLIENT_INTERFACE, &ap, timeout_ms);
+ // sl_wifi_connect returns SL_STATUS_IN_PROGRESS if join is in progress
+ // after the initial scan is done, the scan does not check for SSID
+ ReturnErrorCodeIf((status == SL_STATUS_OK || status == SL_STATUS_IN_PROGRESS), status);
+
+ // failure only happens when the firmware returns an error
+ ChipLogError(DeviceLayer, "wfx_rsi_do_join: sl_wifi_connect failed: 0x%lx", static_cast(status));
+ VerifyOrReturnError((is_wifi_disconnection_event || wfx_rsi.join_retries <= MAX_JOIN_RETRIES_COUNT), status);
+
+ wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED);
+ ChipLogProgress(DeviceLayer, "wfx_rsi_do_join: retry attempt %d", wfx_rsi.join_retries);
+ wfx_retry_interval_handler(is_wifi_disconnection_event, wfx_rsi.join_retries);
+ wfx_rsi.join_retries++;
+ event.eventType = WFX_EVT_STA_START_JOIN;
+ WfxPostEvent(&event);
return status;
}
@@ -765,7 +726,7 @@ void HandleDHCPPolling()
if (sta_netif == NULL)
{
// TODO: Notify the application that the interface is not set up or Chipdie here because we are in an unkonwn state
- SILABS_LOG("HandleDHCPPolling: failed to get STA netif");
+ ChipLogError(DeviceLayer, "HandleDHCPPolling: failed to get STA netif");
return;
}
#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
@@ -787,6 +748,9 @@ void HandleDHCPPolling()
*/
if ((ip6_addr_ispreferred(netif_ip6_addr_state(sta_netif, 0))) && !hasNotifiedIPV6)
{
+ char addrStr[chip::Inet::IPAddress::kMaxStringLength] = { 0 };
+ VerifyOrReturn(ip6addr_ntoa_r(netif_ip6_addr(sta_netif, 0), addrStr, sizeof(addrStr)) != NULL);
+ ChipLogProgress(DeviceLayer, "SLAAC OK: linklocal addr: %s", addrStr);
wfx_ipv6_notify(GET_IPV6_SUCCESS);
hasNotifiedIPV6 = true;
event.eventType = WFX_EVT_STA_DHCP_DONE;
@@ -801,7 +765,7 @@ void WfxPostEvent(WfxEvent_t * event)
if (status != osOK)
{
- SILABS_LOG("WfxPostEvent: failed to post event with status: %d", status);
+ ChipLogError(DeviceLayer, "WfxPostEvent: failed to post event: 0x%lx", static_cast(status));
// TODO: Handle error, requeue event depending on queue size or notify relevant task, Chipdie, etc.
}
}
@@ -829,7 +793,7 @@ void ProcessEvent(WfxEvent_t inEvent)
switch (inEvent.eventType)
{
case WFX_EVT_STA_CONN:
- SILABS_LOG("%s: starting LwIP STA", __func__);
+ ChipLogDetail(DeviceLayer, "WFX_EVT_STA_CONN");
wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTED;
ResetDHCPNotificationFlags();
wfx_lwip_set_sta_link_up();
@@ -840,10 +804,10 @@ void ProcessEvent(WfxEvent_t inEvent)
// is independant of IP connectivity.
break;
case WFX_EVT_STA_DISCONN:
+ ChipLogDetail(DeviceLayer, "WFX_EVT_STA_DISCONN");
// TODO: This event is not being posted anywhere, seems to be a dead code or we are missing something
wfx_rsi.dev_state &=
~(WFX_RSI_ST_STA_READY | WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED | WFX_RSI_ST_STA_DHCP_DONE);
- SILABS_LOG("%s: disconnect notify", __func__);
/* TODO: Implement disconnect notify */
ResetDHCPNotificationFlags();
wfx_lwip_set_sta_link_down(); // Internally dhcpclient_poll(netif) ->
@@ -863,9 +827,9 @@ void ProcessEvent(WfxEvent_t inEvent)
#ifdef SL_WFX_CONFIG_SCAN
if (!(wfx_rsi.dev_state & WFX_RSI_ST_SCANSTARTED))
{
- SILABS_LOG("%s: start SSID scan", __func__);
+ ChipLogDetail(DeviceLayer, "WFX_EVT_SCAN");
sl_wifi_scan_configuration_t wifi_scan_configuration;
- memset(&wifi_scan_configuration, 0, sizeof(sl_wifi_scan_configuration_t));
+ memset(&wifi_scan_configuration, 0, sizeof(wifi_scan_configuration));
// TODO: Add scan logic
sl_wifi_advanced_scan_configuration_t advanced_scan_configuration = { 0 };
@@ -879,7 +843,7 @@ void ProcessEvent(WfxEvent_t inEvent)
if (SL_STATUS_OK != status)
{
// TODO: Seems like Chipdie should be called here, the device should be initialized here
- SILABS_LOG("Failed to set advanced scan configuration with status: %d", status);
+ ChipLogError(DeviceLayer, "sl_wifi_set_advanced_scan_configuration failed: 0x%lx", static_cast(status));
return;
}
@@ -942,13 +906,13 @@ void wfx_rsi_task(void * arg)
WfxEvent_t wfxEvent;
if (status != RSI_SUCCESS)
{
- SILABS_LOG("wfx_rsi_task: error: wfx_rsi_init with status: %02x", status);
+ ChipLogError(DeviceLayer, "wfx_rsi_task: wfx_rsi_init failed: 0x%lx", static_cast(status));
return;
}
wfx_lwip_start();
wfx_started_notify();
- SILABS_LOG("wfx_rsi_task: starting event loop");
+ ChipLogDetail(DeviceLayer, "wfx_rsi_task: starting event loop");
for (;;)
{
status = osMessageQueueGet(sWifiEventQueue, &wfxEvent, NULL, osWaitForever);
@@ -958,8 +922,7 @@ void wfx_rsi_task(void * arg)
}
else
{
- // TODO: Everywhere in this file(and related) SILABS_LOG ---> Chiplog
- SILABS_LOG("Failed to get event with status: %x", status);
+ ChipLogError(DeviceLayer, "wfx_rsi_task: get event failed: 0x%lx", static_cast(status));
}
}
}
@@ -982,8 +945,8 @@ void wfx_dhcp_got_ipv4(uint32_t ip)
wfx_rsi.ip4_addr[1] = (ip >> 8) & HEX_VALUE_FF;
wfx_rsi.ip4_addr[2] = (ip >> 16) & HEX_VALUE_FF;
wfx_rsi.ip4_addr[3] = (ip >> 24) & HEX_VALUE_FF;
- SILABS_LOG("%s: DHCP OK: IP=%d.%d.%d.%d", __func__, wfx_rsi.ip4_addr[0], wfx_rsi.ip4_addr[1], wfx_rsi.ip4_addr[2],
- wfx_rsi.ip4_addr[3]);
+ ChipLogDetail(DeviceLayer, "DHCP OK: IP=%d.%d.%d.%d", wfx_rsi.ip4_addr[0], wfx_rsi.ip4_addr[1], wfx_rsi.ip4_addr[2],
+ wfx_rsi.ip4_addr[3]);
/* Notify the Connectivity Manager - via the app */
wfx_rsi.dev_state |= WFX_RSI_ST_STA_DHCP_DONE;
wfx_ip_changed_notify(IP_STATUS_SUCCESS);
diff --git a/examples/platform/silabs/efr32/rs911x/rsi_if.c b/examples/platform/silabs/efr32/rs911x/rsi_if.c
index 3596b098b7a1ca..a08e2a2f292de1 100644
--- a/examples/platform/silabs/efr32/rs911x/rsi_if.c
+++ b/examples/platform/silabs/efr32/rs911x/rsi_if.c
@@ -142,7 +142,7 @@ int32_t wfx_rsi_get_ap_info(wfx_wifi_scan_result_t * ap)
uint8_t rssi;
ap->security = wfx_rsi.sec.security;
ap->chan = wfx_rsi.ap_chan;
- memcpy(&ap->bssid[0], &wfx_rsi.ap_mac.octet[0], BSSID_MAX_STR_LEN);
+ memcpy(&ap->bssid[0], &wfx_rsi.ap_mac.octet[0], BSSID_LEN);
status = rsi_wlan_get(RSI_RSSI, &rssi, sizeof(rssi));
if (status == RSI_SUCCESS)
{
@@ -493,7 +493,7 @@ static void wfx_rsi_save_ap_info() // translation
}
wfx_rsi.sec.security = WFX_SEC_UNSPECIFIED;
wfx_rsi.ap_chan = rsp.scan_info->rf_channel;
- memcpy(&wfx_rsi.ap_mac.octet[0], &rsp.scan_info->bssid[0], BSSID_MAX_STR_LEN);
+ memcpy(&wfx_rsi.ap_mac.octet[0], &rsp.scan_info->bssid[0], BSSID_LEN);
switch (rsp.scan_info->security_mode)
{
@@ -753,9 +753,9 @@ void ProcessEvent(WfxEvent_t inEvent)
strncpy(ap.ssid, (char *) scan->ssid, MIN(sizeof(ap.ssid), sizeof(scan->ssid)));
ap.security = scan->security_mode;
ap.rssi = (-1) * scan->rssi_val;
- configASSERT(sizeof(ap.bssid) >= BSSID_MAX_STR_LEN);
- configASSERT(sizeof(scan->bssid) >= BSSID_MAX_STR_LEN);
- memcpy(ap.bssid, scan->bssid, BSSID_MAX_STR_LEN);
+ configASSERT(sizeof(ap.bssid) >= BSSID_LEN);
+ configASSERT(sizeof(scan->bssid) >= BSSID_LEN);
+ memcpy(ap.bssid, scan->bssid, BSSID_LEN);
(*wfx_rsi.scan_cb)(&ap);
if (wfx_rsi.scan_ssid)
diff --git a/examples/platform/silabs/efr32/wf200/host_if.cpp b/examples/platform/silabs/efr32/wf200/host_if.cpp
index 041a1778421ed3..ac3ad07773d9d3 100644
--- a/examples/platform/silabs/efr32/wf200/host_if.cpp
+++ b/examples/platform/silabs/efr32/wf200/host_if.cpp
@@ -335,7 +335,7 @@ static void sl_wfx_scan_result_callback(sl_wfx_scan_result_ind_body_t * scan_res
}
ap->scan.chan = scan_result->channel;
ap->scan.rssi = scan_result->rcpi;
- memcpy(&ap->scan.bssid[0], &scan_result->mac[0], BSSID_MAX_STR_LEN);
+ memcpy(&ap->scan.bssid[0], &scan_result->mac[0], BSSID_LEN);
scan_count++;
}
}
diff --git a/examples/pump-app/pump-common/pump-app.zap b/examples/pump-app/pump-common/pump-app.zap
index c456f068835755..cb87c13835d08c 100644
--- a/examples/pump-app/pump-common/pump-app.zap
+++ b/examples/pump-app/pump-common/pump-app.zap
@@ -675,7 +675,7 @@
"storageOption": "External",
"singleton": 1,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
diff --git a/examples/pump-app/silabs/data_model/pump-thread-app.zap b/examples/pump-app/silabs/data_model/pump-thread-app.zap
index c338b8de8155af..358703c49600cf 100644
--- a/examples/pump-app/silabs/data_model/pump-thread-app.zap
+++ b/examples/pump-app/silabs/data_model/pump-thread-app.zap
@@ -675,7 +675,7 @@
"storageOption": "External",
"singleton": 1,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
diff --git a/examples/pump-app/silabs/data_model/pump-wifi-app.zap b/examples/pump-app/silabs/data_model/pump-wifi-app.zap
index c338b8de8155af..358703c49600cf 100644
--- a/examples/pump-app/silabs/data_model/pump-wifi-app.zap
+++ b/examples/pump-app/silabs/data_model/pump-wifi-app.zap
@@ -675,7 +675,7 @@
"storageOption": "External",
"singleton": 1,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
diff --git a/examples/pump-controller-app/pump-controller-common/pump-controller-app.zap b/examples/pump-controller-app/pump-controller-common/pump-controller-app.zap
index 168ddcd01592a5..040218e9083e23 100644
--- a/examples/pump-controller-app/pump-controller-common/pump-controller-app.zap
+++ b/examples/pump-controller-app/pump-controller-common/pump-controller-app.zap
@@ -675,7 +675,7 @@
"storageOption": "External",
"singleton": 1,
"bounded": 0,
- "defaultValue": "",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
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/zap/thermostat_matter_thread.zap b/examples/thermostat/nxp/zap/thermostat_matter_thread.zap
index 489e9e00ab44bf..8824bce22564b9 100644
--- a/examples/thermostat/nxp/zap/thermostat_matter_thread.zap
+++ b/examples/thermostat/nxp/zap/thermostat_matter_thread.zap
@@ -17,13 +17,6 @@
}
],
"package": [
- {
- "pathRelativity": "relativeToZap",
- "path": "../../../../src/app/zap-templates/app-templates.json",
- "type": "gen-templates-json",
- "category": "matter",
- "version": "chip-v1"
- },
{
"pathRelativity": "relativeToZap",
"path": "../../../../src/app/zap-templates/zcl/zcl.json",
@@ -31,6 +24,13 @@
"category": "matter",
"version": 1,
"description": "Matter SDK ZCL data"
+ },
+ {
+ "pathRelativity": "relativeToZap",
+ "path": "../../../../src/app/zap-templates/app-templates.json",
+ "type": "gen-templates-json",
+ "category": "matter",
+ "version": "chip-v1"
}
],
"endpointTypes": [
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/examples/window-app/common/window-app.zap b/examples/window-app/common/window-app.zap
index 5f689678cb9415..87d2ce831e4647 100644
--- a/examples/window-app/common/window-app.zap
+++ b/examples/window-app/common/window-app.zap
@@ -19,18 +19,18 @@
"package": [
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/zcl/zcl.json",
- "type": "zcl-properties",
+ "path": "../../../src/app/zap-templates/app-templates.json",
+ "type": "gen-templates-json",
"category": "matter",
- "version": 1,
- "description": "Matter SDK ZCL data"
+ "version": "chip-v1"
},
{
"pathRelativity": "relativeToZap",
- "path": "../../../src/app/zap-templates/app-templates.json",
- "type": "gen-templates-json",
+ "path": "../../../src/app/zap-templates/zcl/zcl.json",
+ "type": "zcl-properties",
"category": "matter",
- "version": "chip-v1"
+ "version": 1,
+ "description": "Matter SDK ZCL data"
}
],
"endpointTypes": [
diff --git a/integrations/docker/images/base/chip-build/version b/integrations/docker/images/base/chip-build/version
index a38d0c0f53441f..8a1624d292e305 100644
--- a/integrations/docker/images/base/chip-build/version
+++ b/integrations/docker/images/base/chip-build/version
@@ -1 +1 @@
-64 : [NXP] Add `--break-system-packages` to pip install
+65 : [nrfconnect] Update nRF Connect SDK version.
diff --git a/integrations/docker/images/chip-cert-bins/Dockerfile b/integrations/docker/images/chip-cert-bins/Dockerfile
index 5fe42c49dba935..60b0e00863d403 100644
--- a/integrations/docker/images/chip-cert-bins/Dockerfile
+++ b/integrations/docker/images/chip-cert-bins/Dockerfile
@@ -1,6 +1,6 @@
# Stage 1: Setup dependencies (based on chip-build).
-FROM ubuntu:24.04 as chip-build-cert
-LABEL org.opencontainers.image.source https://github.com/project-chip/connectedhomeip
+FROM ubuntu:24.04 AS chip-build-cert
+LABEL org.opencontainers.image.source=https://github.com/project-chip/connectedhomeip
ARG TARGETPLATFORM
# COMMITHASH defines the target commit to build from. May be passed in using --build-arg.
ARG COMMITHASH=c1ec2d777456924dcaa59b53351b00d73caf378f
@@ -123,11 +123,11 @@ RUN set -x \
software-properties-common \
&& add-apt-repository universe \
&& curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \
- && python3 get-pip.py \
+ && python3 get-pip.py --break-system-packages \
&& : # last line
RUN set -x \
- && pip3 install attrs coloredlogs PyGithub pygit future portpicker mobly click cxxfilt ghapi pandas tabulate \
+ && pip3 install attrs coloredlogs PyGithub pygit future portpicker mobly click cxxfilt ghapi pandas tabulate --break-system-packages \
&& : # last line
# build and install gn
@@ -162,7 +162,7 @@ RUN ./scripts/checkout_submodules.py --allow-changing-global-git-config --shallo
RUN bash scripts/bootstrap.sh
# Stage 2: Build.
-FROM chip-build-cert as chip-build-cert-bins
+FROM chip-build-cert AS chip-build-cert-bins
SHELL ["/bin/bash", "-c"]
@@ -260,7 +260,7 @@ RUN case ${TARGETPLATFORM} in \
RUN source scripts/activate.sh && scripts/build_python.sh -m platform -d true -i out/python_env
# Stage 3: Copy relevant cert bins to a minimal image to reduce size.
-FROM ubuntu:22.04
+FROM ubuntu:24.04
ENV TZ=Etc/UTC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update -y
diff --git a/integrations/docker/images/stage-2/chip-build-nrf-platform/Dockerfile b/integrations/docker/images/stage-2/chip-build-nrf-platform/Dockerfile
index 0ec2b78bca1782..57635bdfee1822 100644
--- a/integrations/docker/images/stage-2/chip-build-nrf-platform/Dockerfile
+++ b/integrations/docker/images/stage-2/chip-build-nrf-platform/Dockerfile
@@ -7,7 +7,7 @@ ARG VERSION=1
FROM ghcr.io/project-chip/chip-build:${VERSION} as build
LABEL org.opencontainers.image.source https://github.com/project-chip/connectedhomeip
# Compatible Nordic Connect SDK revision.
-ARG NCS_REVISION=v2.6.0
+ARG NCS_REVISION=v2.7.0
# Requirements to clone SDKs in temporary container
RUN set -x \
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/py_matter_yamltests/matter_yamltests/pseudo_clusters/clusters/discovery_commands.py b/scripts/py_matter_yamltests/matter_yamltests/pseudo_clusters/clusters/discovery_commands.py
index 17fa4f31e96a48..5cfcb6087cbddb 100644
--- a/scripts/py_matter_yamltests/matter_yamltests/pseudo_clusters/clusters/discovery_commands.py
+++ b/scripts/py_matter_yamltests/matter_yamltests/pseudo_clusters/clusters/discovery_commands.py
@@ -68,7 +68,8 @@
-
+
+
diff --git a/scripts/rules.matterlint b/scripts/rules.matterlint
index 335e37436be00c..b4af613c584c29 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";
@@ -100,6 +101,8 @@ load "../src/app/zap-templates/zcl/data-model/chip/unit-localization-cluster.xml
load "../src/app/zap-templates/zcl/data-model/chip/user-label-cluster.xml";
load "../src/app/zap-templates/zcl/data-model/chip/wake-on-lan-cluster.xml";
load "../src/app/zap-templates/zcl/data-model/chip/washer-controls-cluster.xml";
+load "../src/app/zap-templates/zcl/data-model/chip/water-heater-management-cluster.xml";
+load "../src/app/zap-templates/zcl/data-model/chip/water-heater-mode-cluster.xml";
load "../src/app/zap-templates/zcl/data-model/chip/wifi-network-diagnostics-cluster.xml";
load "../src/app/zap-templates/zcl/data-model/chip/wifi-network-management-cluster.xml";
load "../src/app/zap-templates/zcl/data-model/chip/window-covering.xml";
diff --git a/scripts/setup/requirements.build.txt b/scripts/setup/requirements.build.txt
index 82fe4cc08cea50..c9e8bad323bd85 100644
--- a/scripts/setup/requirements.build.txt
+++ b/scripts/setup/requirements.build.txt
@@ -1,8 +1,9 @@
# Minimal requirements for building stand-alone CHIP applications.
#
# The list of Python packages required to perform a minimal CHIP
-# application build should be kept as small as possible. Ideally,
-# core build scripts should depend only on the standard library.
+# application build should be kept as small as possible.
+
+# Ideally, core build scripts should depend only on the standard library.
# scripts/build
click
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/chiptest/__init__.py b/scripts/tests/chiptest/__init__.py
index d5a493b879d39b..a250bab52e9de4 100644
--- a/scripts/tests/chiptest/__init__.py
+++ b/scripts/tests/chiptest/__init__.py
@@ -188,6 +188,7 @@ def _GetDarwinFrameworkToolUnsupportedTests() -> Set[str]:
"TestIcdManagementCluster", # darwin-framework-tool does not support ICD registration
"TestUnitTestingClusterMei", # darwin-framework-tool does not currently support reading or subscribing to Events
"TestReadNoneSubscribeNone", # darwin-framework-tool does not supports those commands.
+ "TestDiagnosticLogsDownloadCommand", # test is flaky in darwin. Please see #32636
"Test_TC_ACE_1_6", # darwin-framework-tool does not support group commands.
"Test_TC_ACL_2_5", # darwin-framework-tool does not currently support reading or subscribing to Events
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/