diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index ff773c6f51e05d..4c8a11fd42f7f1 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -55,14 +55,13 @@ RUN curl https://raw.githubusercontent.com/restyled-io/restyler/master/bin/resty
RUN mkdir -p /opt/sdk/sdks/ \
&& chown -R $USERNAME:$USERNAME \
/opt/sdk/sdks/ `# NXP uses a patch_sdk script to change SDK files` \
- /opt/espressif/esp-idf `# $USERNAME needs to own the esp-idf and tools for the examples to build` \
- /opt/espressif/tools \
/opt/NordicSemiconductor/nrfconnect/ `# $USERNAME needs to own west configuration to build nRF Connect examples` \
- /opt/ubuntu-21.04-aarch64-sysroot/usr/ `# allow read/write access to header and libraries` \
- /opt/android/sdk `# allow licenses to be accepted` \
- /opt/ameba/ambd_sdk_with_chip_non_NDA/ `# AmebaD requires access to change build_info.h` \
- /opt/fsl-imx-xwayland/5.15-kirkstone/ \
- /opt/openocd \
+ $IDF_PATH `# $USERNAME needs to own the esp-idf and tools for the examples to build` \
+ $IDF_TOOLS_PATH \
+ $SYSROOT_AARCH64 `# allow read/write access to header and libraries` \
+ $ANDROID_HOME `# allow licenses to be accepted` \
+ $AMEBA_PATH `# AmebaD requires access to change build_info.h` \
+ $IMX_SDK_ROOT \
&& :
# Fix Tizen SDK paths for new user
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index f33e83f87b17fa..94ad9314b9a56c 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -14,7 +14,7 @@
"mounts": [
"source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind"
],
- "initializeCommand": ".devcontainer/build.sh --tag matter-dev-environment:local --version 20",
+ "initializeCommand": ".devcontainer/build.sh --tag matter-dev-environment:local --version 22",
"image": "matter-dev-environment:local",
"remoteUser": "vscode",
"customizations": {
diff --git a/.github/actions/checkout-submodules-and-bootstrap/action.yaml b/.github/actions/checkout-submodules-and-bootstrap/action.yaml
index d60a69ce6d62fd..892cf93716cb8d 100644
--- a/.github/actions/checkout-submodules-and-bootstrap/action.yaml
+++ b/.github/actions/checkout-submodules-and-bootstrap/action.yaml
@@ -26,17 +26,10 @@ runs:
uses: ./.github/actions/bootstrap-cache
- name: Bootstrap
uses: ./.github/actions/bootstrap
+ env:
+ PW_NO_CIPD_CACHE_DIR: Y
with:
platform: ${{ inputs.platform }}
- - name: Remove CIPD cache directory
- # If there is a bootstrap-cache miss, and bootstrap installs CIPD itself,
- # there is roughly 1.4GB that remains in this cache that is useless from
- # this point onwards.
- shell: bash
- continue-on-error: true
- run: |
- du -sh $HOME/.cipd-cache-dir/
- rm -rf $HOME/.cipd-cache-dir/ || echo "Removing cipd cache dir failed"
- name: Dump disk info after checkout submodule & Bootstrap
shell: bash
run: scripts/dump_diskspace_info.sh
diff --git a/.github/workflows/bloat_check.yaml b/.github/workflows/bloat_check.yaml
index e6f02432b16793..2a1dee179aa3e0 100644
--- a/.github/workflows/bloat_check.yaml
+++ b/.github/workflows/bloat_check.yaml
@@ -33,7 +33,7 @@ jobs:
runs-on: ubuntu-latest
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
steps:
- name: Checkout
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index bf6bc47597b6c3..588ded31e8cbf9 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -40,7 +40,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
volumes:
- "/tmp/log_output:/tmp/test_logs"
options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0
@@ -85,18 +85,22 @@ jobs:
# - name: Upload Code Coverage
# if: ${{ contains('main', env.BUILD_TYPE) }}
# run: bash <(curl -s https://codecov.io/bash)
- - name: Setup Build Without Detail Logging
+ - name: Set up Build Without Detail Logging
run: scripts/build/gn_gen.sh --args="chip_detail_logging=false"
- name: Run Build Without Detail Logging
run: scripts/run_in_build_env.sh "ninja -C ./out"
- - name: Setup Build Without Progress Logging
+ - name: Set up Build Without Progress Logging
run: scripts/build/gn_gen.sh --args="chip_detail_logging=false chip_progress_logging=false"
- name: Run Build Without Progress Logging
run: scripts/run_in_build_env.sh "ninja -C ./out"
- - name: Setup Build Without Error Logging
+ - name: Set up Build Without Error Logging
run: scripts/build/gn_gen.sh --args="chip_detail_logging=false chip_progress_logging=false chip_error_logging=false"
- name: Run Build Without Error Logging
run: scripts/run_in_build_env.sh "ninja -C ./out"
+ - name: Set up Build Without Logging
+ run: scripts/build/gn_gen.sh --args="chip_logging=false"
+ - name: Run Build Without Logging
+ run: scripts/run_in_build_env.sh "ninja -C ./out"
- name: Uploading core files
uses: actions/upload-artifact@v3
if: ${{ failure() && !env.ACT }}
@@ -131,7 +135,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
volumes:
- "/tmp/log_output:/tmp/test_logs"
options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0
@@ -279,7 +283,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
volumes:
- "/tmp/log_output:/tmp/test_logs"
options: --sysctl "net.ipv6.conf.all.disable_ipv6=0
@@ -332,6 +336,39 @@ jobs:
pip3 install -r src/setup_payload/python/requirements.txt
python3 src/setup_payload/tests/run_python_setup_payload_gen_test.py out/chip-tool
+ build_linux_python_lighting_device:
+ name: Build on Linux (python lighting-app)
+
+ runs-on: ubuntu-latest
+ if: github.actor != 'restyled-io[bot]'
+
+ container:
+ image: ghcr.io/project-chip/chip-build:22
+ volumes:
+ - "/tmp/log_output:/tmp/test_logs"
+ options: --sysctl "net.ipv6.conf.all.disable_ipv6=0
+ net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1"
+
+ steps:
+ - name: Dump GitHub context
+ env:
+ GITHUB_CONTEXT: ${{ toJSON(github) }}
+ run: echo "$GITHUB_CONTEXT"
+ - name: Dump Concurrency context
+ env:
+ CONCURRENCY_CONTEXT: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }}
+ run: echo "$CONCURRENCY_CONTEXT"
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Checkout submodules & Bootstrap
+ uses: ./.github/actions/checkout-submodules-and-bootstrap
+ with:
+ platform: linux
+
+ - name: Setup Build
+ run: |
+ scripts/build_python_device.sh --chip_detail_logging true
+
build_darwin:
name: Build on Darwin (clang, python_lib, simulated)
runs-on: macos-latest
@@ -414,7 +451,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
volumes:
- "/tmp/log_output:/tmp/test_logs"
options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0
diff --git a/.github/workflows/chef.yaml b/.github/workflows/chef.yaml
index 6767d78ea46cf3..2b5b34478b677f 100644
--- a/.github/workflows/chef.yaml
+++ b/.github/workflows/chef.yaml
@@ -33,7 +33,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
options: --user root
steps:
@@ -54,7 +54,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-esp32:21
+ image: ghcr.io/project-chip/chip-build-esp32:22
options: --user root
steps:
@@ -75,7 +75,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-nrf-platform:21
+ image: ghcr.io/project-chip/chip-build-nrf-platform:22
options: --user root
steps:
@@ -96,7 +96,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-telink:21
+ image: ghcr.io/project-chip/chip-build-telink:22
options: --user root
steps:
diff --git a/.github/workflows/cirque.yaml b/.github/workflows/cirque.yaml
index 25f6484d4bf2ad..c19e1dd911755c 100644
--- a/.github/workflows/cirque.yaml
+++ b/.github/workflows/cirque.yaml
@@ -40,7 +40,7 @@ jobs:
# need to run with privilege, which isn't supported by job.XXX.contaner
# https://github.com/actions/container-action/issues/2
# container:
- # image: ghcr.io/project-chip/chip-build-cirque:21
+ # image: ghcr.io/project-chip/chip-build-cirque:22
# volumes:
# - "/tmp:/tmp"
# - "/dev/pts:/dev/pts"
diff --git a/.github/workflows/darwin-tests.yaml b/.github/workflows/darwin-tests.yaml
index 887bd532cedf33..21f2a227be1a72 100644
--- a/.github/workflows/darwin-tests.yaml
+++ b/.github/workflows/darwin-tests.yaml
@@ -28,7 +28,7 @@ concurrency:
env:
CHIP_NO_LOG_TIMESTAMPS: true
-
+
jobs:
test_suites_chip_tool_darwin:
name: Test Suites - Darwin
@@ -38,6 +38,14 @@ jobs:
build_variant: [no-ble-asan-clang]
env:
BUILD_VARIANT: ${{matrix.build_variant}}
+
+ # We can't use the pigweed clang to build the Darwin framework once we start using
+ # Swift, because it does not handle CLANG_ENABLE_MODULES correctly.
+ #
+ # But the Xcode clang does not handle LSan correctly. Since we can't easily apply
+ # LSAN_OPTIONS to just everything except darwin-framework-tool, instead disable asan for
+ # it.
+ BUILD_VARIANT_FRAMEWORK_TOOL: no-ble
LSAN_OPTIONS: detect_leaks=1 malloc_context_size=40 suppressions=scripts/tests/chiptest/lsan-mac-suppressions.txt
if: github.actor != 'restyled-io[bot]'
@@ -83,7 +91,7 @@ jobs:
run: |
./scripts/run_in_build_env.sh \
"./scripts/build/build_examples.py \
- --target darwin-x64-darwin-framework-tool-${BUILD_VARIANT} \
+ --target darwin-x64-darwin-framework-tool-${BUILD_VARIANT_FRAMEWORK_TOOL} \
--target darwin-x64-all-clusters-${BUILD_VARIANT} \
--target darwin-x64-lock-${BUILD_VARIANT} \
--target darwin-x64-ota-provider-${BUILD_VARIANT} \
@@ -97,7 +105,7 @@ jobs:
run: |
./scripts/run_in_build_env.sh \
"./scripts/tests/run_test_suite.py \
- --chip-tool ./out/darwin-x64-darwin-framework-tool-${BUILD_VARIANT}/darwin-framework-tool \
+ --chip-tool ./out/darwin-x64-darwin-framework-tool-${BUILD_VARIANT_FRAMEWORK_TOOL}/darwin-framework-tool \
--target-skip-glob '{TestAccessControlConstraints}' \
run \
--iterations 1 \
@@ -114,7 +122,7 @@ jobs:
./scripts/run_in_build_env.sh \
"./scripts/tests/run_darwin_framework_ota_test.py \
run \
- --darwin-framework-tool ./out/darwin-x64-darwin-framework-tool-${BUILD_VARIANT}/darwin-framework-tool \
+ --darwin-framework-tool ./out/darwin-x64-darwin-framework-tool-${BUILD_VARIANT_FRAMEWORK_TOOL}/darwin-framework-tool \
--ota-requestor-app ./out/darwin-x64-ota-requestor-${BUILD_VARIANT}/chip-ota-requestor-app \
--ota-data-file /tmp/rawImage \
--ota-image-file /tmp/otaImage \
@@ -139,8 +147,8 @@ jobs:
uses: actions/upload-artifact@v3
if: ${{ failure() && !env.ACT }}
with:
- name: framework-build-log-darwin-${{ matrix.build_variant }}
- path: out/darwin-x64-darwin-framework-tool-${{ matrix.build_variant }}/darwin_framework_build.log
+ name: framework-build-log-darwin-${{BUILD_VARIANT_FRAMEWORK_TOOL}}
+ path: out/darwin-x64-darwin-framework-tool-${{BUILD_VARIANT_FRAMEWORK_TOOL}}/darwin_framework_build.log
- name: Uploading objdir for debugging
uses: actions/upload-artifact@v3
if: ${{ failure() && !env.ACT }}
diff --git a/.github/workflows/darwin.yaml b/.github/workflows/darwin.yaml
index 09ff0b2fce1925..8b7e44ef82ee00 100644
--- a/.github/workflows/darwin.yaml
+++ b/.github/workflows/darwin.yaml
@@ -112,7 +112,9 @@ jobs:
# but to instrument the code in the underlying libCHIP we need to pass CHIP_IS_UBSAN=YES
TEST_RUNNER_ASAN_OPTIONS=__CURRENT_VALUE__:detect_stack_use_after_return=1 xcodebuild test -target "Matter" -scheme "Matter Framework Tests" -sdk macosx -enableAddressSanitizer YES -enableUndefinedBehaviorSanitizer YES OTHER_CFLAGS='${inherited} -Werror -Wconversion' CHIP_IS_UBSAN=YES CHIP_IS_BLE=NO GCC_PREPROCESSOR_DEFINITIONS='${inherited} MTR_NO_AVAILABILITY=1'> >(tee /tmp/darwin/framework-tests/darwin-tests-asan.log) 2> >(tee /tmp/darwin/framework-tests/darwin-tests-asan-err.log >&2)
# And the same thing, but with MTR_PER_CONTROLLER_STORAGE_ENABLED turned on.
- TEST_RUNNER_ASAN_OPTIONS=__CURRENT_VALUE__:detect_stack_use_after_return=1 xcodebuild test -target "Matter" -scheme "Matter Framework Tests" -sdk macosx -enableAddressSanitizer YES -enableUndefinedBehaviorSanitizer YES OTHER_CFLAGS='${inherited} -Werror -Wconversion' CHIP_IS_UBSAN=YES CHIP_IS_BLE=NO GCC_PREPROCESSOR_DEFINITIONS='${inherited} MTR_NO_AVAILABILITY=1 MTR_PER_CONTROLLER_STORAGE_ENABLED=1' > >(tee /tmp/darwin/framework-tests/darwin-tests-asan-provisional.log) 2> >(tee /tmp/darwin/framework-tests/darwin-tests-asan-provisional-err.log >&2)
+ TEST_RUNNER_ASAN_OPTIONS=__CURRENT_VALUE__:detect_stack_use_after_return=1 xcodebuild test -target "Matter" -scheme "Matter Framework Tests" -sdk macosx -enableAddressSanitizer YES -enableUndefinedBehaviorSanitizer YES OTHER_CFLAGS='${inherited} -Werror -Wconversion' CHIP_IS_UBSAN=YES CHIP_IS_BLE=NO GCC_PREPROCESSOR_DEFINITIONS='${inherited} MTR_NO_AVAILABILITY=1 MTR_PER_CONTROLLER_STORAGE_ENABLED=1' > >(tee /tmp/darwin/framework-tests/darwin-tests-asan-controller-storage.log) 2> >(tee /tmp/darwin/framework-tests/darwin-tests-asan-controller-storage-err.log >&2)
+ # And the same thing, but with MTR_ENABLE_PROVISIONAL also turned on.
+ TEST_RUNNER_ASAN_OPTIONS=__CURRENT_VALUE__:detect_stack_use_after_return=1 xcodebuild test -target "Matter" -scheme "Matter Framework Tests" -sdk macosx -enableAddressSanitizer YES -enableUndefinedBehaviorSanitizer YES OTHER_CFLAGS='${inherited} -Werror -Wconversion' CHIP_IS_UBSAN=YES CHIP_IS_BLE=NO GCC_PREPROCESSOR_DEFINITIONS='${inherited} MTR_NO_AVAILABILITY=1 MTR_PER_CONTROLLER_STORAGE_ENABLED=1 MTR_ENABLE_PROVISIONAL=1' > >(tee /tmp/darwin/framework-tests/darwin-tests-asan-provisional.log) 2> >(tee /tmp/darwin/framework-tests/darwin-tests-asan-provisional-err.log >&2)
# And the same thing, but with MTR_NO_AVAILABILITY not turned on. This requires -Wno-unguarded-availability-new to avoid availability errors.
TEST_RUNNER_ASAN_OPTIONS=__CURRENT_VALUE__:detect_stack_use_after_return=1 xcodebuild test -target "Matter" -scheme "Matter Framework Tests" -sdk macosx -enableAddressSanitizer YES -enableUndefinedBehaviorSanitizer YES OTHER_CFLAGS='${inherited} -Werror -Wconversion -Wno-unguarded-availability-new' CHIP_IS_UBSAN=YES CHIP_IS_BLE=NO GCC_PREPROCESSOR_DEFINITIONS='${inherited}' > >(tee /tmp/darwin/framework-tests/darwin-tests-asan-with-availability-annotations.log) 2> >(tee /tmp/darwin/framework-tests/darwin-tests-asan-with-availability-annotations-err.log >&2)
# -enableThreadSanitizer instruments the code in Matter.framework,
diff --git a/.github/workflows/doxygen.yaml b/.github/workflows/doxygen.yaml
index efc82b13c13f9f..4e4e2abf319891 100644
--- a/.github/workflows/doxygen.yaml
+++ b/.github/workflows/doxygen.yaml
@@ -81,7 +81,7 @@ jobs:
runs-on: ubuntu-latest
container:
- image: ghcr.io/project-chip/chip-build-doxygen:21
+ image: ghcr.io/project-chip/chip-build-doxygen:22
if: github.actor != 'restyled-io[bot]'
diff --git a/.github/workflows/examples-ameba.yaml b/.github/workflows/examples-ameba.yaml
index 2e8e9465d90dca..42afb3ee37b1e7 100644
--- a/.github/workflows/examples-ameba.yaml
+++ b/.github/workflows/examples-ameba.yaml
@@ -36,7 +36,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-ameba:21
+ image: ghcr.io/project-chip/chip-build-ameba:22
options: --user root
steps:
diff --git a/.github/workflows/examples-asr.yaml b/.github/workflows/examples-asr.yaml
index 2257c9ed54a62a..7bb7e790595f10 100644
--- a/.github/workflows/examples-asr.yaml
+++ b/.github/workflows/examples-asr.yaml
@@ -34,7 +34,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-asr:21
+ image: ghcr.io/project-chip/chip-build-asr:22
options: --user root
steps:
diff --git a/.github/workflows/examples-bouffalolab.yaml b/.github/workflows/examples-bouffalolab.yaml
index 6564a304ee0fe8..53a43c267251c6 100644
--- a/.github/workflows/examples-bouffalolab.yaml
+++ b/.github/workflows/examples-bouffalolab.yaml
@@ -35,7 +35,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-bouffalolab:21
+ image: ghcr.io/project-chip/chip-build-bouffalolab:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
steps:
diff --git a/.github/workflows/examples-cc13x2x7_26x2x7.yaml b/.github/workflows/examples-cc13x2x7_26x2x7.yaml
index e7548e6f5413d5..4229f9800f2df8 100644
--- a/.github/workflows/examples-cc13x2x7_26x2x7.yaml
+++ b/.github/workflows/examples-cc13x2x7_26x2x7.yaml
@@ -36,7 +36,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-ti:21
+ image: ghcr.io/project-chip/chip-build-ti:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
steps:
diff --git a/.github/workflows/examples-cc32xx.yaml b/.github/workflows/examples-cc32xx.yaml
index 1d0d65c30110fb..5a77c801447b6e 100644
--- a/.github/workflows/examples-cc32xx.yaml
+++ b/.github/workflows/examples-cc32xx.yaml
@@ -37,7 +37,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-ti:21
+ image: ghcr.io/project-chip/chip-build-ti:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
steps:
@@ -57,7 +57,7 @@ jobs:
run: |
scripts/run_in_build_env.sh "\
./scripts/build/build_examples.py \
- --target cc32xx-lock build \
+ --target cc32xx-lock --target cc32xx-air-purifier build \
--copy-artifacts-to out/artifacts \
"
- name: Get lock app size stats
@@ -67,6 +67,13 @@ jobs:
out/artifacts/cc32xx-lock/chip-CC3235SF_LAUNCHXL-lock-example.out \
/tmp/bloat_reports/
+ - name: Get air purifier app size stats
+ run: |
+ .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \
+ cc32xx CC3235SF_LAUNCHXL air-purifier \
+ out/artifacts/cc32xx-air-purifier/chip-CC3235SF_LAUNCHXL-air-purifier-example.out \
+ /tmp/bloat_reports/
+
- name: Uploading Size Reports
uses: ./.github/actions/upload-size-reports
if: ${{ !env.ACT }}
diff --git a/.github/workflows/examples-efr32.yaml b/.github/workflows/examples-efr32.yaml
index ee7159475b14d1..899ac288dc1c70 100644
--- a/.github/workflows/examples-efr32.yaml
+++ b/.github/workflows/examples-efr32.yaml
@@ -38,7 +38,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-efr32:21
+ image: ghcr.io/project-chip/chip-build-efr32:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
steps:
diff --git a/.github/workflows/examples-esp32.yaml b/.github/workflows/examples-esp32.yaml
index 8fbf75f9ebea37..f1b8ff3b6f20a7 100644
--- a/.github/workflows/examples-esp32.yaml
+++ b/.github/workflows/examples-esp32.yaml
@@ -34,7 +34,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-esp32:21
+ image: ghcr.io/project-chip/chip-build-esp32:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
@@ -130,7 +130,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-esp32:21
+ image: ghcr.io/project-chip/chip-build-esp32:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
diff --git a/.github/workflows/examples-infineon.yaml b/.github/workflows/examples-infineon.yaml
index b7f5e201291522..7fc006fe8f6698 100644
--- a/.github/workflows/examples-infineon.yaml
+++ b/.github/workflows/examples-infineon.yaml
@@ -35,7 +35,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-infineon:21
+ image: ghcr.io/project-chip/chip-build-infineon:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
steps:
diff --git a/.github/workflows/examples-k32w.yaml b/.github/workflows/examples-k32w.yaml
index df88c5a9dabaac..541106d618e2d5 100644
--- a/.github/workflows/examples-k32w.yaml
+++ b/.github/workflows/examples-k32w.yaml
@@ -37,7 +37,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-k32w:21
+ image: ghcr.io/project-chip/chip-build-k32w:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
steps:
diff --git a/.github/workflows/examples-linux-arm.yaml b/.github/workflows/examples-linux-arm.yaml
index 371ecac04d11a7..4645b4e897d3ff 100644
--- a/.github/workflows/examples-linux-arm.yaml
+++ b/.github/workflows/examples-linux-arm.yaml
@@ -34,7 +34,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-crosscompile:21
+ image: ghcr.io/project-chip/chip-build-crosscompile:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
@@ -59,6 +59,7 @@ jobs:
--target linux-arm64-chip-cert-clang \
--target linux-arm64-all-clusters-clang \
--target linux-arm64-chip-tool-ipv6only-clang \
+ --target linux-arm64-chip-tool-nodeps-ipv6only \
--target linux-arm64-lock-clang \
--target linux-arm64-minmdns-clang \
--target linux-arm64-light-rpc-ipv6only-clang \
diff --git a/.github/workflows/examples-linux-imx.yaml b/.github/workflows/examples-linux-imx.yaml
index 4508d39da3f438..e34148a8ff0a91 100644
--- a/.github/workflows/examples-linux-imx.yaml
+++ b/.github/workflows/examples-linux-imx.yaml
@@ -34,7 +34,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-imx:21
+ image: ghcr.io/project-chip/chip-build-imx:22
steps:
- name: Checkout
diff --git a/.github/workflows/examples-linux-standalone.yaml b/.github/workflows/examples-linux-standalone.yaml
index d6740787696105..8661b99d253b5f 100644
--- a/.github/workflows/examples-linux-standalone.yaml
+++ b/.github/workflows/examples-linux-standalone.yaml
@@ -34,7 +34,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
@@ -186,6 +186,16 @@ jobs:
"./scripts/build/build_examples.py \
--target linux-x64-contact-sensor-no-ble-with-ui \
build"
+ - name: Build example Air Purifier
+ run: |
+ ./scripts/run_in_build_env.sh \
+ "./scripts/build/build_examples.py \
+ --target linux-x64-air-purifier \
+ build"
+ .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \
+ linux debug air-purifier-app \
+ out/linux-x64-air-purifier/chip-air-purifier-app \
+ /tmp/bloat_reports/
- name: Uploading Size Reports
uses: ./.github/actions/upload-size-reports
if: ${{ !env.ACT }}
diff --git a/.github/workflows/examples-mbed.yaml b/.github/workflows/examples-mbed.yaml
index cfd022219b3cf4..a73d825ee444e8 100644
--- a/.github/workflows/examples-mbed.yaml
+++ b/.github/workflows/examples-mbed.yaml
@@ -40,7 +40,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-mbed-os:21
+ image: ghcr.io/project-chip/chip-build-mbed-os:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
diff --git a/.github/workflows/examples-mw320.yaml b/.github/workflows/examples-mw320.yaml
index a879dc16e34e50..b5658efdcdf687 100644
--- a/.github/workflows/examples-mw320.yaml
+++ b/.github/workflows/examples-mw320.yaml
@@ -37,7 +37,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
steps:
diff --git a/.github/workflows/examples-nrfconnect.yaml b/.github/workflows/examples-nrfconnect.yaml
index 5d05fb34f286ad..b1cf4cd87279f3 100644
--- a/.github/workflows/examples-nrfconnect.yaml
+++ b/.github/workflows/examples-nrfconnect.yaml
@@ -37,7 +37,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-nrf-platform:21
+ image: ghcr.io/project-chip/chip-build-nrf-platform:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
diff --git a/.github/workflows/examples-openiotsdk.yaml b/.github/workflows/examples-openiotsdk.yaml
index 4fd20ce854f31b..de63249ee89d6a 100644
--- a/.github/workflows/examples-openiotsdk.yaml
+++ b/.github/workflows/examples-openiotsdk.yaml
@@ -38,7 +38,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-openiotsdk:21
+ image: ghcr.io/project-chip/chip-build-openiotsdk:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
options: --privileged
diff --git a/.github/workflows/examples-qpg.yaml b/.github/workflows/examples-qpg.yaml
index 2fcb50ae6a339f..3590b33a7c6829 100644
--- a/.github/workflows/examples-qpg.yaml
+++ b/.github/workflows/examples-qpg.yaml
@@ -37,7 +37,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
steps:
diff --git a/.github/workflows/examples-stm32.yaml b/.github/workflows/examples-stm32.yaml
index 5c8189cbe01711..dce5de01d786d9 100644
--- a/.github/workflows/examples-stm32.yaml
+++ b/.github/workflows/examples-stm32.yaml
@@ -38,7 +38,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
steps:
@@ -68,4 +68,3 @@ jobs:
if: ${{ !env.ACT }}
with:
platform-name: stm32
-
diff --git a/.github/workflows/examples-telink.yaml b/.github/workflows/examples-telink.yaml
index f3e5cfb59e2d88..225ddf16fd190b 100644
--- a/.github/workflows/examples-telink.yaml
+++ b/.github/workflows/examples-telink.yaml
@@ -36,7 +36,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-telink:21
+ image: ghcr.io/project-chip/chip-build-telink:22
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
diff --git a/.github/workflows/examples-tizen.yaml b/.github/workflows/examples-tizen.yaml
index 1e375b1ff0ea91..f6ca3bb793dc87 100644
--- a/.github/workflows/examples-tizen.yaml
+++ b/.github/workflows/examples-tizen.yaml
@@ -34,7 +34,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-tizen:21
+ image: ghcr.io/project-chip/chip-build-tizen:22
options: --user root
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
@@ -55,7 +55,7 @@ jobs:
--enable-flashbundle \
--target tizen-arm-all-clusters \
--target tizen-arm-chip-tool-ubsan \
- --target tizen-arm-light \
+ --target tizen-arm-light-with-ui \
build \
--copy-artifacts-to out/artifacts \
"
diff --git a/.github/workflows/full-android.yaml b/.github/workflows/full-android.yaml
index 319cce82a3c217..a227bdd6e16d08 100644
--- a/.github/workflows/full-android.yaml
+++ b/.github/workflows/full-android.yaml
@@ -36,7 +36,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-android:21
+ image: ghcr.io/project-chip/chip-build-android:22
volumes:
- "/tmp/log_output:/tmp/test_logs"
diff --git a/.github/workflows/fuzzing-build.yaml b/.github/workflows/fuzzing-build.yaml
index 42d8134470ba2b..21ae6619fe0e73 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:21
+ image: ghcr.io/project-chip/chip-build:22
volumes:
- "/tmp/log_output:/tmp/test_logs"
diff --git a/.github/workflows/java-tests.yaml b/.github/workflows/java-tests.yaml
index f4711ca5bfb9ff..fe27fe9cdd4eb1 100644
--- a/.github/workflows/java-tests.yaml
+++ b/.github/workflows/java-tests.yaml
@@ -40,7 +40,7 @@ jobs:
runs-on: ubuntu-latest
container:
- image: ghcr.io/project-chip/chip-build-java:21
+ image: ghcr.io/project-chip/chip-build-java:22
options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0
net.ipv4.conf.all.forwarding=0 net.ipv6.conf.all.forwarding=0"
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 941598cc6d7b65..b70ac09cb8ad5b 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -29,7 +29,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
steps:
- name: Checkout
diff --git a/.github/workflows/minimal-build.yaml b/.github/workflows/minimal-build.yaml
index a6c95979f200fe..269692c1461410 100644
--- a/.github/workflows/minimal-build.yaml
+++ b/.github/workflows/minimal-build.yaml
@@ -31,7 +31,7 @@ jobs:
runs-on: ubuntu-latest
container:
- image: ghcr.io/project-chip/chip-build-minimal:21
+ image: ghcr.io/project-chip/chip-build-minimal:22
steps:
- name: Checkout
diff --git a/.github/workflows/qemu.yaml b/.github/workflows/qemu.yaml
index b16d073224d0af..ac677a83d61468 100644
--- a/.github/workflows/qemu.yaml
+++ b/.github/workflows/qemu.yaml
@@ -38,7 +38,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-esp32-qemu:21
+ image: ghcr.io/project-chip/chip-build-esp32-qemu:22
volumes:
- "/tmp/log_output:/tmp/test_logs"
@@ -76,7 +76,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-tizen-qemu:21
+ image: ghcr.io/project-chip/chip-build-tizen-qemu:22
volumes:
- "/tmp/log_output:/tmp/test_logs"
diff --git a/.github/workflows/release_artifacts.yaml b/.github/workflows/release_artifacts.yaml
index f0c816125f6190..9baca19da32835 100644
--- a/.github/workflows/release_artifacts.yaml
+++ b/.github/workflows/release_artifacts.yaml
@@ -32,7 +32,7 @@ jobs:
runs-on: ubuntu-latest
container:
- image: ghcr.io/project-chip/chip-build-esp32:21
+ image: ghcr.io/project-chip/chip-build-esp32:22
steps:
- name: Checkout
@@ -68,7 +68,7 @@ jobs:
runs-on: ubuntu-latest
container:
- image: ghcr.io/project-chip/chip-build-efr32:21
+ image: ghcr.io/project-chip/chip-build-efr32:22
steps:
- name: Checkout
uses: actions/checkout@v4
diff --git a/.github/workflows/smoketest-android.yaml b/.github/workflows/smoketest-android.yaml
index 6b493cbb990627..ee0fe3400830ab 100644
--- a/.github/workflows/smoketest-android.yaml
+++ b/.github/workflows/smoketest-android.yaml
@@ -37,7 +37,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-android:21
+ image: ghcr.io/project-chip/chip-build-android:22
volumes:
- "/tmp/log_output:/tmp/test_logs"
diff --git a/.github/workflows/tag-releases.yaml b/.github/workflows/tag-releases.yaml
new file mode 100644
index 00000000000000..cdeb8778ab10f3
--- /dev/null
+++ b/.github/workflows/tag-releases.yaml
@@ -0,0 +1,52 @@
+# Copyright (c) 2020-2023 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+name: "Tag Releases"
+
+on:
+ workflow_dispatch:
+ # inputs:
+ # draft_release:
+ # description: 'Create Draft'
+ # required: true
+ # default: true
+ # type: boolean
+ # branch:
+ # description: 'Branch'
+ # required: false
+ # type: string
+jobs:
+ tag_main_release:
+ name: Tag Current Release
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Install gh tool
+ run: |
+ type -p curl >/dev/null || (sudo apt update && sudo apt install curl -y)
+ curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
+ && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
+ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
+ && sudo apt update \
+ && sudo apt install gh -y
+
+ - name: Tag Release & Generate Notes
+ env:
+ GH_TOKEN: ${{ github.token }}
+ run: |
+ export BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)
+ echo "Tagging against branch: $BRANCH_NAME"
+ ./scripts/tagging/tag_new_release.sh --generate-notes --target "$BRANCH_NAME" -d # Note this is a draft for now.
+
+
diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml
index bb0a781f8b566c..d6c580e643e9ff 100644
--- a/.github/workflows/tests.yaml
+++ b/.github/workflows/tests.yaml
@@ -47,7 +47,7 @@ jobs:
runs-on: ubuntu-latest
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0
net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1"
@@ -85,7 +85,7 @@ jobs:
#
run: |
./scripts/run_in_build_env.sh \
- "./scripts/py_matter_idl/matter_idl/xml_parser.py \
+ "./scripts/py_matter_idl/matter_idl/zapxml_parser.py \
--no-print \
--log-level info \
src/app/zap-templates/zcl/data-model/chip/global-attributes.xml \
@@ -402,7 +402,7 @@ jobs:
runs-on: ubuntu-latest
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0
net.ipv4.conf.all.forwarding=0 net.ipv6.conf.all.forwarding=0"
@@ -468,6 +468,7 @@ jobs:
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 --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RVCCLEANM_1_2.py" --script-args "--int-arg PIXIT_ENDPOINT:1 --storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --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 --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RVCRUNM_1_2.py" --script-args "--int-arg PIXIT_ENDPOINT:1 --storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --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 --script "src/python_testing/TestMatterTestingSupport.py" --script-args "--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 --script "src/python_testing/TestConformanceSupport.py" --script-args "--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 --app out/linux-x64-lock-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-lock-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_DRLK_2_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values --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 --app out/linux-x64-lock-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-lock-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_DRLK_2_3.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values --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 --app out/linux-x64-lock-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-lock-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_DRLK_2_12.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
diff --git a/.github/workflows/unit_integration_test.yaml b/.github/workflows/unit_integration_test.yaml
index 9ae5f2df18b295..9a365cb09c2438 100644
--- a/.github/workflows/unit_integration_test.yaml
+++ b/.github/workflows/unit_integration_test.yaml
@@ -37,7 +37,7 @@ jobs:
runs-on: ubuntu-latest
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
volumes:
- "/tmp/log_output:/tmp/test_logs"
options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1"
diff --git a/.github/workflows/zap_regeneration.yaml b/.github/workflows/zap_regeneration.yaml
index 5e50d26365b2d0..8ccd058de07b87 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:21
+ image: ghcr.io/project-chip/chip-build:22
defaults:
run:
shell: sh
diff --git a/.github/workflows/zap_templates.yaml b/.github/workflows/zap_templates.yaml
index e84a8f6bc3e076..a83069e9468d28 100644
--- a/.github/workflows/zap_templates.yaml
+++ b/.github/workflows/zap_templates.yaml
@@ -32,7 +32,7 @@ jobs:
runs-on: ubuntu-20.04
container:
- image: ghcr.io/project-chip/chip-build:21
+ image: ghcr.io/project-chip/chip-build:22
defaults:
run:
shell: sh
diff --git a/.gitmodules b/.gitmodules
index 28bdba881cb8b2..6683ee97ecb02e 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -62,7 +62,7 @@
platforms = k32w
[submodule "third_party/openthread/ot-nxp"]
path = third_party/openthread/ot-nxp
- url = https://github.com/openthread/ot-nxp.git
+ url = https://github.com/NXP/ot-nxp.git
platforms = k32w
[submodule "third_party/openthread/ot-qorvo"]
path = third_party/openthread/ot-qorvo
diff --git a/.restyled.yaml b/.restyled.yaml
index 06180a098228e9..aeedbacd16240c 100644
--- a/.restyled.yaml
+++ b/.restyled.yaml
@@ -76,6 +76,7 @@ exclude:
- "examples/platform/nxp/k32w/k32w0/scripts/demo_generated_certs/**/*"
- "integrations/cloudbuild/*.yaml" # uglier long command line content
- "scripts/run_codegen_targets.sh" # shellharden breaks for loops over command outputs
+ - "scripts/tagging/tag_new_release.sh" # shellharden breaks parameter passing
- "src/darwin/Framework/CHIP/zap-generated/*" # already clang-formatted by our zap tooling
- "zzz_generated/**/*" # already clang-formatted by our zap tooling
- "src/controller/java/generated/java/**/*" # not formatted: generated files
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 7524bf25d83ec2..bfac435030bb4f 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -115,7 +115,9 @@
"condition_variable": "cpp",
"numeric": "cpp",
"random": "cpp",
- "thread": "cpp"
+ "thread": "cpp",
+ "variant": "cpp",
+ "any": "cpp"
},
// Configure paths or glob patterns to exclude from file watching.
"files.watcherExclude": {
diff --git a/SPECIFICATION_VERSION b/SPECIFICATION_VERSION
new file mode 100644
index 00000000000000..26aaba0e86632e
--- /dev/null
+++ b/SPECIFICATION_VERSION
@@ -0,0 +1 @@
+1.2.0
diff --git a/build_overrides/nxp_sdk.gni b/build_overrides/nxp_sdk.gni
new file mode 100644
index 00000000000000..0fb6234c7d5aaf
--- /dev/null
+++ b/build_overrides/nxp_sdk.gni
@@ -0,0 +1,18 @@
+# Copyright (c) 2020 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.
+
+declare_args() {
+ # Root directory for NXP SDKs.
+ nxp_sdk_build_root = "//third_party/nxp"
+}
diff --git a/config/esp32/components/chip/Kconfig b/config/esp32/components/chip/Kconfig
index 00bfed5df9b124..43a766b7dbf8dd 100644
--- a/config/esp32/components/chip/Kconfig
+++ b/config/esp32/components/chip/Kconfig
@@ -96,6 +96,22 @@ menu "CHIP Core"
help
Link the application against CHIP interactive shell.
+ config CHIP_SHELL_CMD_LINE_BUF_MAX_LENGTH
+ int "Maximum command line buffer length of the chip shell"
+ depends on ENABLE_CHIP_SHELL
+ default 256
+ help
+ Maximum command line buffer length of the chip shell. The command strings might be received
+ incompletely in the command handlers if they are longer than this buffer length.
+
+ config CHIP_SHELL_CMD_LINE_ARG_MAX_COUNT
+ int "Maximum command line arguments count of the chip shell"
+ depends on ENABLE_CHIP_SHELL
+ default 32
+ help
+ Maximum command line arguments count of the chip shell. The command arguments might be ignored
+ if they are more than this count.
+
config ENABLE_CHIP_CONTROLLER_BUILD
bool "Enable chip-controller build"
default n
diff --git a/config/nrfconnect/chip-module/Kconfig.features b/config/nrfconnect/chip-module/Kconfig.features
index 522b52f8b7fe3d..9b5a1e7aee9029 100644
--- a/config/nrfconnect/chip-module/Kconfig.features
+++ b/config/nrfconnect/chip-module/Kconfig.features
@@ -267,4 +267,13 @@ choice CHIP_LAST_FABRIC_REMOVED_ACTION
endchoice
+config CHIP_LAST_FABRIC_REMOVED_ACTION_DELAY
+ int "After removing the last fabric wait defined time [in milliseconds] to perform an action"
+ depends on !CHIP_LAST_FABRIC_REMOVED_NONE
+ default 500
+ help
+ After removing the last fabric the device will wait for the defined time and then perform
+ an action chosen by the CHIP_LAST_FABRIC_REMOVED_ACTION option. This schedule will allow for
+ avoiding race conditions before the device removes non-volatile data.
+
endif # CHIP
diff --git a/config/telink/chip-module/CMakeLists.txt b/config/telink/chip-module/CMakeLists.txt
index 6a1a2393b8627a..e9d506e538f131 100644
--- a/config/telink/chip-module/CMakeLists.txt
+++ b/config/telink/chip-module/CMakeLists.txt
@@ -160,6 +160,14 @@ else()
unset(GLOBAL_DTC_OVERLAY_FILE)
endif()
+if(EXISTS "${CHIP_ROOT}/src/platform/telink/${FLASH_SIZE}_flash.overlay")
+ set(FLASH_DTC_OVERLAY_FILE "${CHIP_ROOT}/src/platform/telink/${FLASH_SIZE}_flash.overlay")
+ message(STATUS "Flash memory size is set to: " ${FLASH_SIZE} "b")
+else()
+ set(FLASH_DTC_OVERLAY_FILE "${CHIP_ROOT}/src/platform/telink/2m_flash.overlay")
+ message(STATUS "Flash memory size is set to: 2mb")
+endif()
+
if(EXISTS "${CHIP_ROOT}/config/telink/app/bootloader.conf")
set(GLOBAL_BOOTLOADER_CONF_OVERLAY_FILE "${CHIP_ROOT}/config/telink/app/bootloader.conf")
else()
@@ -177,7 +185,7 @@ if (CONFIG_BOOTLOADER_MCUBOOT)
add_custom_target(build_mcuboot ALL
COMMAND
west build -b ${BOARD} -d build_mcuboot ${ZEPHYR_BASE}/../bootloader/mcuboot/boot/zephyr
- -- -DOVERLAY_CONFIG=${GLOBAL_BOOTLOADER_CONF_OVERLAY_FILE} -DDTC_OVERLAY_FILE="${GLOBAL_DTC_OVERLAY_FILE};${USB_BOOT_DTC_OVERLAY_FILE}"
+ -- -DOVERLAY_CONFIG=${GLOBAL_BOOTLOADER_CONF_OVERLAY_FILE} -DDTC_OVERLAY_FILE="${GLOBAL_DTC_OVERLAY_FILE};${FLASH_DTC_OVERLAY_FILE};${USB_BOOT_DTC_OVERLAY_FILE}"
COMMAND
cp ${PROJECT_BINARY_DIR}/../modules/chip-module/build_mcuboot/zephyr/zephyr.bin ${PROJECT_BINARY_DIR}/zephyr.mcuboot.bin
)
diff --git a/config/tizen/chip-gn/platform/BUILD.gn b/config/tizen/chip-gn/platform/BUILD.gn
index 7d2f25e9bcf4f8..bea16af373fd15 100644
--- a/config/tizen/chip-gn/platform/BUILD.gn
+++ b/config/tizen/chip-gn/platform/BUILD.gn
@@ -20,6 +20,10 @@ import("${chip_root}/config/tizen/chip-gn/args.gni")
import("${build_root}/config/linux/pkg_config.gni")
import("${chip_root}/src/platform/device.gni")
+pkg_config("capi-system-peripheral-io") {
+ packages = [ "capi-system-peripheral-io" ]
+}
+
pkg_config("dlog") {
packages = [ "dlog" ]
}
@@ -69,6 +73,7 @@ source_set("tizen") {
":glib",
":capi-appfw-preference",
":capi-system-info",
+ ":capi-system-peripheral-io",
]
if (chip_mdns == "platform") {
diff --git a/credentials/development/commissioner_dut/struct_dac_ext_key_usage_dig_sig_wrong/test_case_vector.json b/credentials/development/commissioner_dut/struct_dac_ext_key_usage_dig_sig_wrong/test_case_vector.json
index 212a0ac5f3935d..9fe2a05cdd2a71 100644
--- a/credentials/development/commissioner_dut/struct_dac_ext_key_usage_dig_sig_wrong/test_case_vector.json
+++ b/credentials/development/commissioner_dut/struct_dac_ext_key_usage_dig_sig_wrong/test_case_vector.json
@@ -1,5 +1,5 @@
{
- "description": "DAC Test Vector: Certificate Key Usage extension diginalSignature field is wrong (not present for DAC and present for PAI, which is OK as optional)",
+ "description": "DAC Test Vector: Certificate Key Usage extension digitalSignature field is wrong (not present for DAC and present for PAI, which is OK as optional)",
"is_success_case": "false",
"dac_cert": "308201cd30820174a0030201020208611516cb5e8ce57b300a06082a8648ce3d04030230303118301606035504030c0f4d617474657220546573742050414931143012060a2b0601040182a27c02010c04464646313020170d3232303932333030303030305a180f39393939313233313233353935395a30463118301606035504030c0f4d617474657220546573742044414331143012060a2b0601040182a27c02010c044646463131143012060a2b0601040182a27c02020c04383030303059301306072a8648ce3d020106082a8648ce3d0301070342000445b50fdfe1cc48523ea80ea86773611d507fd6d7df96b97a00e65118e908b2e8de80de34522efa043671c42648b8d1ad5d4d497f2b68bb275a7d5ef5cc977439a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020520301d0603551d0e04160414f3bc17e68fbb09ff2a77f7f06499b32b91d74d01301f0603551d23041830168014a66e9305a0a0bdfe507e29ae9e2e0fa9ed61c920300a06082a8648ce3d040302034700304402205352aed11ca8a49ab9fd1221cde5ef90a993f78af55480afce070ee92888069802202e40e6757b97f9a55aa6a7b2048b20a3537a27876b111e0eb2b321724d92ecfc",
"pai_cert": "308201bd30820164a00302010202085ced6956be8aa63b300a06082a8648ce3d04030230303118301606035504030c0f4d617474657220546573742050414131143012060a2b0601040182a27c02010c04464646313020170d3232303932333030303030305a180f39393939313233313233353935395a30303118301606035504030c0f4d617474657220546573742050414931143012060a2b0601040182a27c02010c04464646313059301306072a8648ce3d020106082a8648ce3d03010703420004cf18213b48c9bf7301785414ccde69bd6ac7212ccae0f41fd4d67b3b658d36f60a60978ab7522b3899c815fe374795e7a994d6d11ebfc2403210599fb778e97da366306430120603551d130101ff040830060101ff020100300e0603551d0f0101ff040403020106301d0603551d0e04160414a66e9305a0a0bdfe507e29ae9e2e0fa9ed61c920301f0603551d230418301680146afd22771f511fecbf1641976710dcdc31a1717e300a06082a8648ce3d040302034700304402205ce2d4931c0f16df3ee2d7b7c0566e103aff4d5a975c139ca926a781da50a3f002205e56862b0376d06f4379519b19e3731f21aa287292816baffe1570031aa50656",
diff --git a/credentials/development/commissioner_dut/struct_pai_ext_key_usage_dig_sig_wrong/test_case_vector.json b/credentials/development/commissioner_dut/struct_pai_ext_key_usage_dig_sig_wrong/test_case_vector.json
index e922c6bdd8adb3..d24649ef06d780 100644
--- a/credentials/development/commissioner_dut/struct_pai_ext_key_usage_dig_sig_wrong/test_case_vector.json
+++ b/credentials/development/commissioner_dut/struct_pai_ext_key_usage_dig_sig_wrong/test_case_vector.json
@@ -1,5 +1,5 @@
{
- "description": "PAI Test Vector: Certificate Key Usage extension diginalSignature field is wrong (not present for DAC and present for PAI, which is OK as optional)",
+ "description": "PAI Test Vector: Certificate Key Usage extension digitalSignature field is wrong (not present for DAC and present for PAI, which is OK as optional)",
"is_success_case": "true",
"dac_cert": "308201ce30820174a0030201020208568288cb4b319ee2300a06082a8648ce3d04030230303118301606035504030c0f4d617474657220546573742050414931143012060a2b0601040182a27c02010c04464646313020170d3232303932333030303030305a180f39393939313233313233353935395a30463118301606035504030c0f4d617474657220546573742044414331143012060a2b0601040182a27c02010c044646463131143012060a2b0601040182a27c02020c04383030303059301306072a8648ce3d020106082a8648ce3d0301070342000491d6c7888cf88fe930493409a59e9bffcb7da6dfe8a24fef4366368171c407d4ab2cadc2a4d3aedf78f86034b510644795e8d60503f3393024102ef1bb3445d6a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414ce4916a3fb7cca300ed9b27bcfa6c52b32ace0ee301f0603551d230418301680146501d5f9b760746c421ffa03f40ee1233d87bad3300a06082a8648ce3d04030203480030450220273649bfb1b74c74a583f18b43dc0e998c8187b0862d4d8b7ecd4a38d76db1a90221009f8f26312ef21f1525ab3b1872c2601acb73543b97aba395111c4604b388d1a4",
"pai_cert": "308201bf30820164a00302010202085067032f9c6011dc300a06082a8648ce3d04030230303118301606035504030c0f4d617474657220546573742050414131143012060a2b0601040182a27c02010c04464646313020170d3232303932333030303030305a180f39393939313233313233353935395a30303118301606035504030c0f4d617474657220546573742050414931143012060a2b0601040182a27c02010c04464646313059301306072a8648ce3d020106082a8648ce3d0301070342000407e035085865ff28c03934454eaa22dc1c4f36c0844f1d7c7ffaaeacfba0e777efa63547f59a4384448841476d9955f943372f43aa7d498c128dac0b3ac5b362a366306430120603551d130101ff040830060101ff020100300e0603551d0f0101ff040403020186301d0603551d0e041604146501d5f9b760746c421ffa03f40ee1233d87bad3301f0603551d230418301680146afd22771f511fecbf1641976710dcdc31a1717e300a06082a8648ce3d0403020349003046022100c4cc07bb7c45d705406ff6d3b7ee858cec34822d97ded78593387bd708a0f219022100b5a010d2b5695dcee2ce4f4f3fe7fb0765671b4c29a556fc773575002c5c4235",
diff --git a/credentials/development/gen_commissioner_dut_test_plan_table.py b/credentials/development/gen_commissioner_dut_test_plan_table.py
index d8887a2f86f331..fb3ca49087e0b7 100755
--- a/credentials/development/gen_commissioner_dut_test_plan_table.py
+++ b/credentials/development/gen_commissioner_dut_test_plan_table.py
@@ -79,7 +79,7 @@ def main():
success_cases = []
failure_cases = []
- for p in os.listdir(cert_path):
+ for p in sorted(os.listdir(cert_path)):
if p in skip_cases:
continue
path = str(os.path.join(cert_path, p, 'test_case_vector.json'))
diff --git a/data_model/README.md b/data_model/README.md
new file mode 100644
index 00000000000000..ada763cd7f2804
--- /dev/null
+++ b/data_model/README.md
@@ -0,0 +1,27 @@
+## Contents
+
+This folder contains a machine-readable representation of matter clusters.
+
+The XML files inside `clusters` are generated by a `scraper` script out of the
+original specification `AsciiDoc` files.
+
+## How to update
+
+The matter specification is not currently public. As such, as script exists to
+update the spec XML files, however this is not done automatically.
+
+You will require access to the following tools locally:
+
+- `scraper`. A binary copy generally available
+ [here](https://github.com/csa-data-model/projects/tree/main/DM-Editor/bin/1.2.0/scrape)
+- Specification repository checkout from
+ https://github.com/CHIP-Specifications/connectedhomeip-spec
+
+Example usage:
+
+```sh
+./scripts/spec_xml/generate_spec_xml.py \
+ --scraper ~/Downloads/scrape-adoc-linux \
+ --spec-root ~/work/connectedhomeip-spec \
+ --output-dir data_model
+```
diff --git a/data_model/clusters/ACL-Cluster.xml b/data_model/clusters/ACL-Cluster.xml
new file mode 100644
index 00000000000000..2cbcbd01c9a11a
--- /dev/null
+++ b/data_model/clusters/ACL-Cluster.xml
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/AccountLogin.xml b/data_model/clusters/AccountLogin.xml
new file mode 100644
index 00000000000000..4add6f4189d279
--- /dev/null
+++ b/data_model/clusters/AccountLogin.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/AdminCommissioningCluster.xml b/data_model/clusters/AdminCommissioningCluster.xml
new file mode 100644
index 00000000000000..b2cffacf87e121
--- /dev/null
+++ b/data_model/clusters/AdminCommissioningCluster.xml
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/AirQuality.xml b/data_model/clusters/AirQuality.xml
new file mode 100644
index 00000000000000..dcaf38bc586cf5
--- /dev/null
+++ b/data_model/clusters/AirQuality.xml
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/AlarmBase.xml b/data_model/clusters/AlarmBase.xml
new file mode 100644
index 00000000000000..b169d4fe9be24a
--- /dev/null
+++ b/data_model/clusters/AlarmBase.xml
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ApplicationBasic.xml b/data_model/clusters/ApplicationBasic.xml
new file mode 100644
index 00000000000000..48ce9673675e1d
--- /dev/null
+++ b/data_model/clusters/ApplicationBasic.xml
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ApplicationLauncher.xml b/data_model/clusters/ApplicationLauncher.xml
new file mode 100644
index 00000000000000..91ebf6b5937446
--- /dev/null
+++ b/data_model/clusters/ApplicationLauncher.xml
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/AudioOutput.xml b/data_model/clusters/AudioOutput.xml
new file mode 100644
index 00000000000000..8ace3342ce2132
--- /dev/null
+++ b/data_model/clusters/AudioOutput.xml
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/BallastConfiguration.xml b/data_model/clusters/BallastConfiguration.xml
new file mode 100644
index 00000000000000..a6d553ddcc6ead
--- /dev/null
+++ b/data_model/clusters/BallastConfiguration.xml
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/BasicInformationCluster.xml b/data_model/clusters/BasicInformationCluster.xml
new file mode 100644
index 00000000000000..ae4e6f6661a820
--- /dev/null
+++ b/data_model/clusters/BasicInformationCluster.xml
@@ -0,0 +1,331 @@
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Binding-Cluster.xml b/data_model/clusters/Binding-Cluster.xml
new file mode 100644
index 00000000000000..02b2219fcd0331
--- /dev/null
+++ b/data_model/clusters/Binding-Cluster.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/BooleanSensorConfiguration.xml b/data_model/clusters/BooleanSensorConfiguration.xml
new file mode 100644
index 00000000000000..7321a70113087f
--- /dev/null
+++ b/data_model/clusters/BooleanSensorConfiguration.xml
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/BooleanState.xml b/data_model/clusters/BooleanState.xml
new file mode 100644
index 00000000000000..5b298075fbaefc
--- /dev/null
+++ b/data_model/clusters/BooleanState.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Channel.xml b/data_model/clusters/Channel.xml
new file mode 100644
index 00000000000000..3227cf9a5a446e
--- /dev/null
+++ b/data_model/clusters/Channel.xml
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ColorControl.xml b/data_model/clusters/ColorControl.xml
new file mode 100644
index 00000000000000..142e1a58ab7a67
--- /dev/null
+++ b/data_model/clusters/ColorControl.xml
@@ -0,0 +1,1023 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ConcentrationMeasurement.xml b/data_model/clusters/ConcentrationMeasurement.xml
new file mode 100644
index 00000000000000..ad239e700eacf9
--- /dev/null
+++ b/data_model/clusters/ConcentrationMeasurement.xml
@@ -0,0 +1,252 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ContentAppObserver.xml b/data_model/clusters/ContentAppObserver.xml
new file mode 100644
index 00000000000000..05d19307fc59ac
--- /dev/null
+++ b/data_model/clusters/ContentAppObserver.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ContentControl.xml b/data_model/clusters/ContentControl.xml
new file mode 100644
index 00000000000000..3642777b46a76d
--- /dev/null
+++ b/data_model/clusters/ContentControl.xml
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ContentLauncher.xml b/data_model/clusters/ContentLauncher.xml
new file mode 100644
index 00000000000000..32b47a77c233a3
--- /dev/null
+++ b/data_model/clusters/ContentLauncher.xml
@@ -0,0 +1,297 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/DemandResponseLoadControl.xml b/data_model/clusters/DemandResponseLoadControl.xml
new file mode 100644
index 00000000000000..caa967bb9edb1e
--- /dev/null
+++ b/data_model/clusters/DemandResponseLoadControl.xml
@@ -0,0 +1,479 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Descriptor-Cluster.xml b/data_model/clusters/Descriptor-Cluster.xml
new file mode 100644
index 00000000000000..956fb411e91a22
--- /dev/null
+++ b/data_model/clusters/Descriptor-Cluster.xml
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/DeviceEnergyManagement.xml b/data_model/clusters/DeviceEnergyManagement.xml
new file mode 100644
index 00000000000000..f1c5c37d1ade35
--- /dev/null
+++ b/data_model/clusters/DeviceEnergyManagement.xml
@@ -0,0 +1,507 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/DiagnosticLogsCluster.xml b/data_model/clusters/DiagnosticLogsCluster.xml
new file mode 100644
index 00000000000000..2fb6fc298ac7b5
--- /dev/null
+++ b/data_model/clusters/DiagnosticLogsCluster.xml
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/DiagnosticsEthernet.xml b/data_model/clusters/DiagnosticsEthernet.xml
new file mode 100644
index 00000000000000..0ceb98841a7793
--- /dev/null
+++ b/data_model/clusters/DiagnosticsEthernet.xml
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/DiagnosticsGeneral.xml b/data_model/clusters/DiagnosticsGeneral.xml
new file mode 100644
index 00000000000000..ea4ce75cd549d9
--- /dev/null
+++ b/data_model/clusters/DiagnosticsGeneral.xml
@@ -0,0 +1,335 @@
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/DiagnosticsSoftware.xml b/data_model/clusters/DiagnosticsSoftware.xml
new file mode 100644
index 00000000000000..4a4d5508be51d5
--- /dev/null
+++ b/data_model/clusters/DiagnosticsSoftware.xml
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/DiagnosticsThread.xml b/data_model/clusters/DiagnosticsThread.xml
new file mode 100644
index 00000000000000..2f8e97b150ffc2
--- /dev/null
+++ b/data_model/clusters/DiagnosticsThread.xml
@@ -0,0 +1,691 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/DiagnosticsWiFi.xml b/data_model/clusters/DiagnosticsWiFi.xml
new file mode 100644
index 00000000000000..ce0d8ae0e59c0f
--- /dev/null
+++ b/data_model/clusters/DiagnosticsWiFi.xml
@@ -0,0 +1,257 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/DishwasherAlarm.xml b/data_model/clusters/DishwasherAlarm.xml
new file mode 100644
index 00000000000000..487a522a661af7
--- /dev/null
+++ b/data_model/clusters/DishwasherAlarm.xml
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/DoorLock.xml b/data_model/clusters/DoorLock.xml
new file mode 100644
index 00000000000000..a0c5f9e63be3d7
--- /dev/null
+++ b/data_model/clusters/DoorLock.xml
@@ -0,0 +1,2296 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-Attributes.xml b/data_model/clusters/EVSE-Attributes.xml
new file mode 100644
index 00000000000000..70cada7e3a902e
--- /dev/null
+++ b/data_model/clusters/EVSE-Attributes.xml
@@ -0,0 +1,45 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-Classification.xml b/data_model/clusters/EVSE-Classification.xml
new file mode 100644
index 00000000000000..6230a083a794e7
--- /dev/null
+++ b/data_model/clusters/EVSE-Classification.xml
@@ -0,0 +1,45 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-ClusterID.xml b/data_model/clusters/EVSE-ClusterID.xml
new file mode 100644
index 00000000000000..071dbf680e7514
--- /dev/null
+++ b/data_model/clusters/EVSE-ClusterID.xml
@@ -0,0 +1,45 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-Commands.xml b/data_model/clusters/EVSE-Commands.xml
new file mode 100644
index 00000000000000..f170a002aab7ac
--- /dev/null
+++ b/data_model/clusters/EVSE-Commands.xml
@@ -0,0 +1,45 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-DataTypes.xml b/data_model/clusters/EVSE-DataTypes.xml
new file mode 100644
index 00000000000000..ec95fd5c8a4eac
--- /dev/null
+++ b/data_model/clusters/EVSE-DataTypes.xml
@@ -0,0 +1,45 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-Definitions.xml b/data_model/clusters/EVSE-Definitions.xml
new file mode 100644
index 00000000000000..5d07abc25605cb
--- /dev/null
+++ b/data_model/clusters/EVSE-Definitions.xml
@@ -0,0 +1,45 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-Dependencies.xml b/data_model/clusters/EVSE-Dependencies.xml
new file mode 100644
index 00000000000000..1797d04b915b7b
--- /dev/null
+++ b/data_model/clusters/EVSE-Dependencies.xml
@@ -0,0 +1,45 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-Events.xml b/data_model/clusters/EVSE-Events.xml
new file mode 100644
index 00000000000000..75c8a89274da20
--- /dev/null
+++ b/data_model/clusters/EVSE-Events.xml
@@ -0,0 +1,45 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-Features.xml b/data_model/clusters/EVSE-Features.xml
new file mode 100644
index 00000000000000..ff1feadf386690
--- /dev/null
+++ b/data_model/clusters/EVSE-Features.xml
@@ -0,0 +1,45 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-RevisionHistory.xml b/data_model/clusters/EVSE-RevisionHistory.xml
new file mode 100644
index 00000000000000..def04a641bf6f7
--- /dev/null
+++ b/data_model/clusters/EVSE-RevisionHistory.xml
@@ -0,0 +1,45 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ElectricalEnergyMeasurement.xml b/data_model/clusters/ElectricalEnergyMeasurement.xml
new file mode 100644
index 00000000000000..0047f948298a95
--- /dev/null
+++ b/data_model/clusters/ElectricalEnergyMeasurement.xml
@@ -0,0 +1,322 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ElectricalPowerMeasurement.xml b/data_model/clusters/ElectricalPowerMeasurement.xml
new file mode 100644
index 00000000000000..0839bd569c8eb7
--- /dev/null
+++ b/data_model/clusters/ElectricalPowerMeasurement.xml
@@ -0,0 +1,356 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/EnergyCalendar.xml b/data_model/clusters/EnergyCalendar.xml
new file mode 100644
index 00000000000000..058019da1e9f8c
--- /dev/null
+++ b/data_model/clusters/EnergyCalendar.xml
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/EnergyPreference.xml b/data_model/clusters/EnergyPreference.xml
new file mode 100644
index 00000000000000..710ab52291b85a
--- /dev/null
+++ b/data_model/clusters/EnergyPreference.xml
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/EnergyPrice.xml b/data_model/clusters/EnergyPrice.xml
new file mode 100644
index 00000000000000..8be42c25061937
--- /dev/null
+++ b/data_model/clusters/EnergyPrice.xml
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/FanControl.xml b/data_model/clusters/FanControl.xml
new file mode 100644
index 00000000000000..121f954055bcfe
--- /dev/null
+++ b/data_model/clusters/FanControl.xml
@@ -0,0 +1,296 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/FlowMeasurement.xml b/data_model/clusters/FlowMeasurement.xml
new file mode 100644
index 00000000000000..66ad022c2c64ef
--- /dev/null
+++ b/data_model/clusters/FlowMeasurement.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/GeneralCommissioningCluster.xml b/data_model/clusters/GeneralCommissioningCluster.xml
new file mode 100644
index 00000000000000..a25cdfc6ac934e
--- /dev/null
+++ b/data_model/clusters/GeneralCommissioningCluster.xml
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Group-Key-Management-Cluster.xml b/data_model/clusters/Group-Key-Management-Cluster.xml
new file mode 100644
index 00000000000000..78db5376ebef14
--- /dev/null
+++ b/data_model/clusters/Group-Key-Management-Cluster.xml
@@ -0,0 +1,232 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Groups.xml b/data_model/clusters/Groups.xml
new file mode 100644
index 00000000000000..175c9caf26a435
--- /dev/null
+++ b/data_model/clusters/Groups.xml
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Identify.xml b/data_model/clusters/Identify.xml
new file mode 100644
index 00000000000000..cc9bf06b474eca
--- /dev/null
+++ b/data_model/clusters/Identify.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/IlluminanceMeasurement.xml b/data_model/clusters/IlluminanceMeasurement.xml
new file mode 100644
index 00000000000000..c9be9fa6879293
--- /dev/null
+++ b/data_model/clusters/IlluminanceMeasurement.xml
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/KeypadInput.xml b/data_model/clusters/KeypadInput.xml
new file mode 100644
index 00000000000000..81f16ec0830aef
--- /dev/null
+++ b/data_model/clusters/KeypadInput.xml
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Label-Cluster-FixedLabel.xml b/data_model/clusters/Label-Cluster-FixedLabel.xml
new file mode 100644
index 00000000000000..7087883e611edb
--- /dev/null
+++ b/data_model/clusters/Label-Cluster-FixedLabel.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Label-Cluster-Label.xml b/data_model/clusters/Label-Cluster-Label.xml
new file mode 100644
index 00000000000000..6b29c2cf44caad
--- /dev/null
+++ b/data_model/clusters/Label-Cluster-Label.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Label-Cluster-UserLabel.xml b/data_model/clusters/Label-Cluster-UserLabel.xml
new file mode 100644
index 00000000000000..e9d8dda4610b4f
--- /dev/null
+++ b/data_model/clusters/Label-Cluster-UserLabel.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/LaundryDryerControls.xml b/data_model/clusters/LaundryDryerControls.xml
new file mode 100644
index 00000000000000..70c985ae3fde74
--- /dev/null
+++ b/data_model/clusters/LaundryDryerControls.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/LaundryWasherControls.xml b/data_model/clusters/LaundryWasherControls.xml
new file mode 100644
index 00000000000000..1e033da5dd88ab
--- /dev/null
+++ b/data_model/clusters/LaundryWasherControls.xml
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/LevelControl.xml b/data_model/clusters/LevelControl.xml
new file mode 100644
index 00000000000000..7716ce228b3fad
--- /dev/null
+++ b/data_model/clusters/LevelControl.xml
@@ -0,0 +1,305 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/LocalizationConfiguration.xml b/data_model/clusters/LocalizationConfiguration.xml
new file mode 100644
index 00000000000000..2b1297fb8f8e0e
--- /dev/null
+++ b/data_model/clusters/LocalizationConfiguration.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/LocalizationTimeFormat.xml b/data_model/clusters/LocalizationTimeFormat.xml
new file mode 100644
index 00000000000000..9c0ffa062fec58
--- /dev/null
+++ b/data_model/clusters/LocalizationTimeFormat.xml
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/LocalizationUnit.xml b/data_model/clusters/LocalizationUnit.xml
new file mode 100644
index 00000000000000..8a5179dafb0aff
--- /dev/null
+++ b/data_model/clusters/LocalizationUnit.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/LowPower.xml b/data_model/clusters/LowPower.xml
new file mode 100644
index 00000000000000..f8ee432eef58a7
--- /dev/null
+++ b/data_model/clusters/LowPower.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/MediaInput.xml b/data_model/clusters/MediaInput.xml
new file mode 100644
index 00000000000000..8b6f4008f372f6
--- /dev/null
+++ b/data_model/clusters/MediaInput.xml
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/MediaPlayback.xml b/data_model/clusters/MediaPlayback.xml
new file mode 100644
index 00000000000000..21001d287f6120
--- /dev/null
+++ b/data_model/clusters/MediaPlayback.xml
@@ -0,0 +1,248 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Messages.xml b/data_model/clusters/Messages.xml
new file mode 100644
index 00000000000000..71e522a92a959d
--- /dev/null
+++ b/data_model/clusters/Messages.xml
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/MicrowaveOvenControl.xml b/data_model/clusters/MicrowaveOvenControl.xml
new file mode 100644
index 00000000000000..e97821db771a77
--- /dev/null
+++ b/data_model/clusters/MicrowaveOvenControl.xml
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ModeBase.xml b/data_model/clusters/ModeBase.xml
new file mode 100644
index 00000000000000..258708ba96908b
--- /dev/null
+++ b/data_model/clusters/ModeBase.xml
@@ -0,0 +1,176 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ModeSelect.xml b/data_model/clusters/ModeSelect.xml
new file mode 100644
index 00000000000000..2fff860458f0e5
--- /dev/null
+++ b/data_model/clusters/ModeSelect.xml
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Mode_Dishwasher.xml b/data_model/clusters/Mode_Dishwasher.xml
new file mode 100644
index 00000000000000..22d0fab7897696
--- /dev/null
+++ b/data_model/clusters/Mode_Dishwasher.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Mode_EVSE.xml b/data_model/clusters/Mode_EVSE.xml
new file mode 100644
index 00000000000000..d52139252d014d
--- /dev/null
+++ b/data_model/clusters/Mode_EVSE.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Mode_Laundry.xml b/data_model/clusters/Mode_Laundry.xml
new file mode 100644
index 00000000000000..63108a01aa876b
--- /dev/null
+++ b/data_model/clusters/Mode_Laundry.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Mode_LaundryWasher.xml b/data_model/clusters/Mode_LaundryWasher.xml
new file mode 100644
index 00000000000000..96190a4009850c
--- /dev/null
+++ b/data_model/clusters/Mode_LaundryWasher.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Mode_MicrowaveOven.xml b/data_model/clusters/Mode_MicrowaveOven.xml
new file mode 100644
index 00000000000000..d1ac9458d71af8
--- /dev/null
+++ b/data_model/clusters/Mode_MicrowaveOven.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Mode_Oven.xml b/data_model/clusters/Mode_Oven.xml
new file mode 100644
index 00000000000000..56a369dd425572
--- /dev/null
+++ b/data_model/clusters/Mode_Oven.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Mode_RVCClean.xml b/data_model/clusters/Mode_RVCClean.xml
new file mode 100644
index 00000000000000..b82c26501f1196
--- /dev/null
+++ b/data_model/clusters/Mode_RVCClean.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Mode_RVCRun.xml b/data_model/clusters/Mode_RVCRun.xml
new file mode 100644
index 00000000000000..f1b8b58c69e068
--- /dev/null
+++ b/data_model/clusters/Mode_RVCRun.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Mode_Refrigerator.xml b/data_model/clusters/Mode_Refrigerator.xml
new file mode 100644
index 00000000000000..cf6a65721e0efd
--- /dev/null
+++ b/data_model/clusters/Mode_Refrigerator.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Mode_WaterHeater.xml b/data_model/clusters/Mode_WaterHeater.xml
new file mode 100644
index 00000000000000..535eb4d22dd7c7
--- /dev/null
+++ b/data_model/clusters/Mode_WaterHeater.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/NetworkCommissioningCluster.xml b/data_model/clusters/NetworkCommissioningCluster.xml
new file mode 100644
index 00000000000000..0e6703b896380a
--- /dev/null
+++ b/data_model/clusters/NetworkCommissioningCluster.xml
@@ -0,0 +1,511 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/NetworkIdentityManagement.xml b/data_model/clusters/NetworkIdentityManagement.xml
new file mode 100644
index 00000000000000..9ce28aa194426b
--- /dev/null
+++ b/data_model/clusters/NetworkIdentityManagement.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/OTASoftwareUpdate.xml b/data_model/clusters/OTASoftwareUpdate.xml
new file mode 100644
index 00000000000000..2c87e6aa1039c9
--- /dev/null
+++ b/data_model/clusters/OTASoftwareUpdate.xml
@@ -0,0 +1,60 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/OccupancySensing.xml b/data_model/clusters/OccupancySensing.xml
new file mode 100644
index 00000000000000..1dd5cbe6156865
--- /dev/null
+++ b/data_model/clusters/OccupancySensing.xml
@@ -0,0 +1,181 @@
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/OnOff.xml b/data_model/clusters/OnOff.xml
new file mode 100644
index 00000000000000..3c79220ecd67fc
--- /dev/null
+++ b/data_model/clusters/OnOff.xml
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/OperationalCredentialCluster.xml b/data_model/clusters/OperationalCredentialCluster.xml
new file mode 100644
index 00000000000000..a5d25d07d57ecc
--- /dev/null
+++ b/data_model/clusters/OperationalCredentialCluster.xml
@@ -0,0 +1,320 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/OperationalState.xml b/data_model/clusters/OperationalState.xml
new file mode 100644
index 00000000000000..5e969ff0793b5a
--- /dev/null
+++ b/data_model/clusters/OperationalState.xml
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/OperationalState_Oven.xml b/data_model/clusters/OperationalState_Oven.xml
new file mode 100644
index 00000000000000..785b72498b326d
--- /dev/null
+++ b/data_model/clusters/OperationalState_Oven.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/OperationalState_RVC.xml b/data_model/clusters/OperationalState_RVC.xml
new file mode 100644
index 00000000000000..3a2fa80b2857e2
--- /dev/null
+++ b/data_model/clusters/OperationalState_RVC.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/PowerSourceCluster.xml b/data_model/clusters/PowerSourceCluster.xml
new file mode 100644
index 00000000000000..f7b5da82ce20fc
--- /dev/null
+++ b/data_model/clusters/PowerSourceCluster.xml
@@ -0,0 +1,1064 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/PowerSourceConfigurationCluster.xml b/data_model/clusters/PowerSourceConfigurationCluster.xml
new file mode 100644
index 00000000000000..d186842379aaf6
--- /dev/null
+++ b/data_model/clusters/PowerSourceConfigurationCluster.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/PressureMeasurement.xml b/data_model/clusters/PressureMeasurement.xml
new file mode 100644
index 00000000000000..70093485639090
--- /dev/null
+++ b/data_model/clusters/PressureMeasurement.xml
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/PumpConfigurationControl.xml b/data_model/clusters/PumpConfigurationControl.xml
new file mode 100644
index 00000000000000..095004ff01bf7e
--- /dev/null
+++ b/data_model/clusters/PumpConfigurationControl.xml
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/RefrigeratorAlarm.xml b/data_model/clusters/RefrigeratorAlarm.xml
new file mode 100644
index 00000000000000..5c2ea3c6853c20
--- /dev/null
+++ b/data_model/clusters/RefrigeratorAlarm.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ResourceMonitoring.xml b/data_model/clusters/ResourceMonitoring.xml
new file mode 100644
index 00000000000000..e5a178a5700f8c
--- /dev/null
+++ b/data_model/clusters/ResourceMonitoring.xml
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Scenes.xml b/data_model/clusters/Scenes.xml
new file mode 100644
index 00000000000000..07a15de02bc7a4
--- /dev/null
+++ b/data_model/clusters/Scenes.xml
@@ -0,0 +1,521 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/SmokeCOAlarm.xml b/data_model/clusters/SmokeCOAlarm.xml
new file mode 100644
index 00000000000000..d24f696e3a3384
--- /dev/null
+++ b/data_model/clusters/SmokeCOAlarm.xml
@@ -0,0 +1,303 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Switch.xml b/data_model/clusters/Switch.xml
new file mode 100644
index 00000000000000..141b32e782969d
--- /dev/null
+++ b/data_model/clusters/Switch.xml
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/TargetNavigator.xml b/data_model/clusters/TargetNavigator.xml
new file mode 100644
index 00000000000000..3a49e7b5c6c838
--- /dev/null
+++ b/data_model/clusters/TargetNavigator.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/TemperatureControl.xml b/data_model/clusters/TemperatureControl.xml
new file mode 100644
index 00000000000000..f457238bab1d8a
--- /dev/null
+++ b/data_model/clusters/TemperatureControl.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/TemperatureMeasurement.xml b/data_model/clusters/TemperatureMeasurement.xml
new file mode 100644
index 00000000000000..e1603fd3358bc3
--- /dev/null
+++ b/data_model/clusters/TemperatureMeasurement.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Thermostat.xml b/data_model/clusters/Thermostat.xml
new file mode 100644
index 00000000000000..704d3a21a1df9a
--- /dev/null
+++ b/data_model/clusters/Thermostat.xml
@@ -0,0 +1,913 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ThermostatUserInterfaceConfiguration.xml b/data_model/clusters/ThermostatUserInterfaceConfiguration.xml
new file mode 100644
index 00000000000000..6c8d1d920e6ef7
--- /dev/null
+++ b/data_model/clusters/ThermostatUserInterfaceConfiguration.xml
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ThreadBorderRouterDiagnostics.xml b/data_model/clusters/ThreadBorderRouterDiagnostics.xml
new file mode 100644
index 00000000000000..20215e275d2f00
--- /dev/null
+++ b/data_model/clusters/ThreadBorderRouterDiagnostics.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/TimeSync.xml b/data_model/clusters/TimeSync.xml
new file mode 100644
index 00000000000000..c7ad7b0032aaf7
--- /dev/null
+++ b/data_model/clusters/TimeSync.xml
@@ -0,0 +1,200 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Timer.xml b/data_model/clusters/Timer.xml
new file mode 100644
index 00000000000000..f4e37a2b60ceb6
--- /dev/null
+++ b/data_model/clusters/Timer.xml
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ValveConfigurationControl.xml b/data_model/clusters/ValveConfigurationControl.xml
new file mode 100644
index 00000000000000..74ed2f4df40597
--- /dev/null
+++ b/data_model/clusters/ValveConfigurationControl.xml
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/WakeOnLAN.xml b/data_model/clusters/WakeOnLAN.xml
new file mode 100644
index 00000000000000..eede336182e6dc
--- /dev/null
+++ b/data_model/clusters/WakeOnLAN.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/WaterContentMeasurement.xml b/data_model/clusters/WaterContentMeasurement.xml
new file mode 100644
index 00000000000000..8b1ff6a9a049bc
--- /dev/null
+++ b/data_model/clusters/WaterContentMeasurement.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/WaterHeaterManagement.xml b/data_model/clusters/WaterHeaterManagement.xml
new file mode 100644
index 00000000000000..c55c6a1e09bf09
--- /dev/null
+++ b/data_model/clusters/WaterHeaterManagement.xml
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/WiFiPerDeviceCredentials.xml b/data_model/clusters/WiFiPerDeviceCredentials.xml
new file mode 100644
index 00000000000000..807ea27c64053b
--- /dev/null
+++ b/data_model/clusters/WiFiPerDeviceCredentials.xml
@@ -0,0 +1,58 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/WindowCovering.xml b/data_model/clusters/WindowCovering.xml
new file mode 100644
index 00000000000000..7eefe853c91d0a
--- /dev/null
+++ b/data_model/clusters/WindowCovering.xml
@@ -0,0 +1,694 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/bridge-clusters-Actions.xml b/data_model/clusters/bridge-clusters-Actions.xml
new file mode 100644
index 00000000000000..f9b17944739dca
--- /dev/null
+++ b/data_model/clusters/bridge-clusters-Actions.xml
@@ -0,0 +1,378 @@
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/bridge-clusters-BridgedDeviceBasicInformation.xml b/data_model/clusters/bridge-clusters-BridgedDeviceBasicInformation.xml
new file mode 100644
index 00000000000000..038d7a7f4112c5
--- /dev/null
+++ b/data_model/clusters/bridge-clusters-BridgedDeviceBasicInformation.xml
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/energy_management.xml b/data_model/clusters/energy_management.xml
new file mode 100644
index 00000000000000..792560796cdd4d
--- /dev/null
+++ b/data_model/clusters/energy_management.xml
@@ -0,0 +1,58 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/network_infrastructure.xml b/data_model/clusters/network_infrastructure.xml
new file mode 100644
index 00000000000000..181ee350003454
--- /dev/null
+++ b/data_model/clusters/network_infrastructure.xml
@@ -0,0 +1,62 @@
+
+
+
\ No newline at end of file
diff --git a/data_model/spec_sha b/data_model/spec_sha
new file mode 100644
index 00000000000000..c8cdb81dba2809
--- /dev/null
+++ b/data_model/spec_sha
@@ -0,0 +1 @@
+6be044cb0a9bb333b70ccf9f70074afeb440b3cb
diff --git a/docs/examples/index.md b/docs/examples/index.md
index e5144f81885039..c6d211bcaeee9d 100644
--- a/docs/examples/index.md
+++ b/docs/examples/index.md
@@ -303,7 +303,7 @@ window-app/**/README
resource-monitoring-app/**/README
```
-## Air Quality Sensor example
+## RVC example
```{toctree}
:glob:
@@ -311,3 +311,12 @@ resource-monitoring-app/**/README
rvc-app/README
```
+
+## Air Purifier Example
+
+```{toctree}
+:glob:
+:maxdepth: 1
+
+air-purifier-app/**/README
+```
diff --git a/docs/guides/nrfconnect_factory_data_configuration.md b/docs/guides/nrfconnect_factory_data_configuration.md
index 1cc4bf01adccfb..d30a12f1e82025 100644
--- a/docs/guides/nrfconnect_factory_data_configuration.md
+++ b/docs/guides/nrfconnect_factory_data_configuration.md
@@ -247,7 +247,7 @@ To use this script, complete the following steps:
b. Add output file path:
```
- -o
+ -o
```
c. Generate SPAKE2 verifier using one of the following methods:
@@ -357,7 +357,7 @@ $ python scripts/tools/nrfconnect/generate_nrfconnect_chip_factory_data.py \
--passcode 20202021 \
--product_finish "matte" \
--product_color "black" \
---out "build.json"' \
+--out "build.json" \
--schema "scripts/tools/nrfconnect/nrfconnect_factory_data.schema"
```
diff --git a/docs/guides/nxp_rw61x_ota_software_update.md b/docs/guides/nxp_rw61x_ota_software_update.md
new file mode 100644
index 00000000000000..c3bd5227a054ed
--- /dev/null
+++ b/docs/guides/nxp_rw61x_ota_software_update.md
@@ -0,0 +1,268 @@
+# Matter Over-The-Air Software Update with NXP RW61x example applications
+
+## Overview
+
+The OTA Requestor feature enables the device to be informed of, download and
+apply a software update from an OTA Provider.
+
+This section explains how to perform an OTA Software Update with NXP RW61x
+example applications. Throughout this guide, the all-clusters application is
+used as an example.
+
+In general, the Over-The-Air Software Update process consists of the following
+steps :
+
+- The OTA Requestor queries an update image from the OTA Provider which
+ responds according to its availability.
+- The update image is received in blocks and stored in the external flash of
+ the device.
+- Once the update image is fully downloaded, the bootloader is notified and
+ the device resets applying the update in test-mode.
+- If the test is successful, the update is applied permanently. Otherwise, the
+ bootloader reverts back to the primary application, preventing any
+ downgrade.
+
+### Flash Memory Layout
+
+The RW61x Flash is divided into different regions as follow :
+
+- Bootloader : MCUBoot resides at the base of the flash and occupies 0x20000
+ (128 kB).
+- Primary application partition : The example application which would be run
+ by the bootloader (active application). The size reserved for this partition
+ is 4.4 MB.
+- Secondary application partition : Update image received with the OTA
+ (candidate application). The size reserved for the partition is 4.4 MB.
+
+Notes :
+
+- The CPU1/CPU2 firmware are embedded in the CPU3 example application.
+- The sizes of the primary and secondary applications are provided as an
+ example (currently 4.4 MB is reserved for each partition). The size can be
+ changed by modifying the `m_app_max_sectors` value in the linker script of
+ the application (`RW610_flash.ld`).
+
+### MCUBoot Bootloader
+
+MCUBoot is an open-source secure bootloader used by RW61x to apply the
+self-upgrade. For more details, please refer to the
+[MCUBoot documentation](https://github.com/mcu-tools/mcuboot/blob/main/docs/design.md).
+
+In our use case, the bootloader runs the application residing in the primary
+partition. In order to run the OTA update image, the bootloader will swap the
+content of the primary and the secondary partitions. This type of upgrade is
+called swap-move and is the default upgrade configured by MCUBoot.
+
+## OTA Software Update process for RW61x example application
+
+### Flashing the bootloader
+
+In order for the device to perform the software update, the MCUBoot bootloader
+must be flashed first at the base of the flash. A step-by-step guide is given
+below.
+
+- It is recommended to start with erasing the external flash of the device,
+ for this JLink from Segger can be used. It can be downloaded and installed
+ from https://www.segger.com/products/debug-probes/j-link. Once installed,
+ JLink can be run using the command line :
+
+```
+$ JLink
+```
+
+Run the following commands :
+
+```
+J-Link > connect
+Device> ? # you will be presented with a dialog -> select `RW612`
+Please specify target interface:
+J) JTAG (Default)
+S) SWD
+T) cJTAG
+TIF> S
+Specify target interface speed [kHz]. : 4000 kHz
+Speed> #
+J-Link > exec EnableEraseAllFlashBanks
+J-Link > erase 0x8000000, 0x88a0000
+```
+
+- Using MCUXPresso, import the `mcuboot_opensource` demo example from the SDK
+ previously downloaded.
+ ![mcuboot_demo](../../examples/platform/nxp/rt/rw61x/doc/images/mcuboot_demo.PNG)
+- Before building the demo example, it should be specified that the
+ application to be run by the bootloader is monolithic. As a result, only one
+ image will be upgraded by the bootloader. This can be done by defining
+ `MONOLITHIC_APP` as 1 in the settings of the `mcuboot_opensource` project :
+
+```
+Right click on the Project -> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCU C Compiler -> Preprocessor -> Add "MONOLITHIC_APP=1" in the Defined Symbols
+```
+
+![rw610_mcuboot_monolithic](../../examples/platform/nxp/rt/rw61x/doc/images/mcuboot_monolithic_app.PNG)
+
+- Build the demo example project and program it to the target board.
+- To run the flashed demo, either press the reset button of the device or use
+ the debugger IDE of MCUXpresso. If it runs successfully, the following logs
+ will be displayed on the terminal :
+
+```
+hello sbl.
+Bootloader Version 1.9.0
+Primary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
+Secondary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
+Boot source: none
+Swap type: none
+erasing trailer; fa_id=2
+Unable to find bootable image
+```
+
+Note : By default, mcuboot application considers the primary and secondary
+partitions to be the size of 4.4 MB. If the size is to be changed, the partition
+addresses should be modified in the flash_partitioning.h accordingly. For more
+information about the flash partitioning with mcuboot, please refer to the
+dedicated readme.txt located in
+"`SDK_RW612/boards/rdrw612bga/ota_examples/mcuboot_opensource/`".
+
+### Generating and flashing the signed application image
+
+After flashing the bootloader, the application can be programmed to the board.
+The image must have the following format :
+
+- Header : contains general information about the image (version, size,
+ magic...)
+- Code of the application : generated binary
+- Trailer : contains metadata needed by the bootloader such as the image
+ signature, the upgrade type, the swap status...
+
+The all-clusters application can be generated using the instructions from the
+[README.md 'Building'](../../examples/all-clusters-app/nxp/rt/rw61x/README.md#building)
+section. The application is automatically linked to be executed from the primary
+image partition, taking into consideration the offset imposed by mcuboot.
+
+The resulting executable file found in out/debug/chip-rw61x-all-cluster-example
+needs to be converted into raw binary format as shown below.
+
+```
+arm-none-eabi-objcopy -R .flash_config -R .NVM -O binary chip-rw61x-all-cluster-example chip-rw61x-all-cluster-example.bin
+```
+
+To sign the image and wrap the raw binary of the application with the header and
+trailer, "`imgtool`" is provided in the SDK and can be found in
+"`/middleware/mcuboot_opensource/scripts/`".
+
+The following commands can be run (make sure to replace the /path/to/file/binary
+with the adequate files):
+
+```
+user@ubuntu: cd ~/Desktop/SDK_RW612/middleware/mcuboot_opensource/scripts
+
+user@ubuntu: python3 imgtool.py sign --key ~/Desktop/SDK_RW612/boards/rdrw612bga/ota_examples/mcuboot_opensource/keys/sign-rsa2048-priv.pem --align 4 --header-size 0x1000 --pad-header --slot-size 0x440000 --max-sectors 1088 --version "1.0" ~/Desktop/connectedhomeip/examples/all-clusters-app/nxp/rt/rw61x/out/debug/chip-rw61x-all-cluster-example.bin ~/Desktop/connectedhomeip/examples/all-clusters-app/nxp/rt/rw61x/out/debug/chip-rw61x-all-cluster-example_SIGNED.bin
+```
+
+Notes :
+
+- If internal SDK is used instead, the key can be found in :
+ "`~/Desktop/SDK_RW612/middleware/mcuboot_opensource/boot/nxp_mcux_sdk/keys/sign-rsa2048-priv.pem`".
+- The arguments `slot-size` and `max-sectors` should be adjusted to the size
+ of the partitions reserved for the primary and the secondary applications.
+ (By default the size considered is 4.4 MB)
+- In this example, the image is signed with the private key provided by the
+ SDK as an example
+ (`/path_to_sdk/middleware/mcuboot_opensource/boot/nxp_mcux_sdk/keys/sign-rsa2048-priv.pem`),
+ MCUBoot is built with its corresponding public key which would be used to
+ verify the integrity of the image. It is possible to generate a new pair of
+ keys using the following commands. This procedure should be done prior to
+ building the mcuboot application.
+
+- To generate the private key :
+
+```
+user@ubuntu: python3 imgtool.py keygen -k priv_key.pem -t rsa-2048
+```
+
+- To extract the public key :
+
+```
+user@ubuntu: python3 imgtool.py getpub -k priv_key.pem
+```
+
+- The extracted public key can then be copied to the
+ `/path_to_sdk/middleware/mcuboot_opensource/boot/nxp_mcux_sdk/keys/sign-rsa2048-pub.c`,
+ given as a value to the rsa_pub_key[] array.
+
+The resulting output is the signed binary of the application version "1.0".
+
+JLink can be used to flash the application at the address 0x8020000, using the
+command :
+
+```
+J-Link > loadbin chip-rw61x-all-cluster-example_SIGNED.bin 0x8020000
+```
+
+The bootloader should then be able to jump directly to the start of the
+application and run it.
+
+### Generating the OTA Update Image
+
+To generate the OTA update image the same procedure can be followed from the
+[Generating and flashing the signed application image](#generating-and-flashing-the-signed-application-image)
+sub-section, replacing the "--version "1.0"" argument with "--version "2.0""
+(recent version of the update).
+
+When the signed binary of the update is generated, the file should be converted
+into OTA format. To do so, the ota_image_tool is provided in the repo and can be
+used to convert a binary file into an .ota file.
+
+```
+user@ubuntu:~/connectedhomeip$ : ./src/app/ota_image_tool.py create -v 0xDEAD -p 0xBEEF -vn 2 -vs "2.0" -da sha256 chip-rw61x-all-cluster-example_SIGNED.bin chip-rw61x-all-cluster-example.ota
+```
+
+The generated OTA file can be used to perform the OTA Software Update. The
+instructions below describe the procedure step-by-step.
+
+### Performing the OTA Software Update
+
+Setup example :
+
+- [Chip-tool](../../examples/chip-tool/README.md) application running on the
+ RPi.
+- OTA Provider application built on the same RPi (as explained below).
+- RW61x board programmed with the example application (with the instructions
+ above).
+
+Before starting the OTA process, the Linux OTA Provider application can be built
+on the RPi (if not already present in the pre-installed apps) :
+
+```
+user@ubuntu:~/connectedhomeip$ : ./scripts/examples/gn_build_example.sh examples/ota-provider-app/linux out/ota-provider-app chip_config_network_layer_ble=false
+
+user@ubuntu:~/connectedhomeip$ : rm -rf /tmp/chip_*
+user@ubuntu:~/connectedhomeip$ : ./out/ota-provider-app/chip-ota-provider-app -f chip-rw61x-all-cluster-example.ota
+```
+
+The OTA Provider should first be provisioned with chip-tool by assigning it the
+node id 1, and then granted the ACL entries :
+
+```
+user@ubuntu:~/connectedhomeip$ : ./out/chip-tool-app/chip-tool pairing onnetwork 1 20202021
+user@ubuntu:~/connectedhomeip$ : ./out/chip-tool-app/chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets": null}, {"fabricIndex": 1, "privilege": 3, "authMode": 2, "subjects": null, "targets": null}]' 1 0
+```
+
+The second step is to provision the device with the node id 2 using ble-wifi or
+ble-thread commissioning. For example :
+
+```
+user@ubuntu:~/connectedhomeip$ : ./out/chip-tool-app/chip-tool pairing ble-wifi 2 WIFI_SSID WIFI_PASSWORD 20202021 3840
+```
+
+Once commissioned, the OTA process can be initiated with the
+"announce-ota-provider" command using chip-tool (the given numbers refer
+respectively to [ProviderNodeId][vendorid] [AnnouncementReason][endpoint]
+[node-id][endpoint-id]) :
+
+```
+user@ubuntu:~/connectedhomeip$ : ./out/chip-tool-app/chip-tool otasoftwareupdaterequestor announce-otaprovider 1 0 0 0 2 0
+```
+
+When the full update image is downloaded and stored, the bootloader will be
+notified and the device will reboot with the update image.
diff --git a/examples/air-purifier-app/air-purifier-common/BUILD.gn b/examples/air-purifier-app/air-purifier-common/BUILD.gn
new file mode 100755
index 00000000000000..9715f88e65f2b3
--- /dev/null
+++ b/examples/air-purifier-app/air-purifier-common/BUILD.gn
@@ -0,0 +1,24 @@
+# Copyright (c) 2020 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.
+
+import("//build_overrides/chip.gni")
+import("${chip_root}/src/app/chip_data_model.gni")
+
+chip_data_model("air-purifier-common") {
+ zap_file = "air-purifier-app.zap"
+
+ zap_pregenerated_dir =
+ "${chip_root}/zzz_generated/air-purifier-app/zap-generated"
+ is_server = true
+}
diff --git a/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter b/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter
new file mode 100644
index 00000000000000..1f912fcd64e643
--- /dev/null
+++ b/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter
@@ -0,0 +1,2360 @@
+// This IDL was generated automatically by ZAP.
+// It is for view/code review purposes only.
+
+/** Attributes and commands for putting a device into Identification mode (e.g. flashing a light). */
+server cluster Identify = 3 {
+ enum EffectIdentifierEnum : enum8 {
+ kBlink = 0;
+ kBreathe = 1;
+ kOkay = 2;
+ kChannelChange = 11;
+ kFinishEffect = 254;
+ kStopEffect = 255;
+ }
+
+ enum EffectVariantEnum : enum8 {
+ kDefault = 0;
+ }
+
+ enum IdentifyTypeEnum : enum8 {
+ kNone = 0;
+ kLightOutput = 1;
+ kVisibleIndicator = 2;
+ kAudibleBeep = 3;
+ kDisplay = 4;
+ kActuator = 5;
+ }
+
+ attribute int16u identifyTime = 0;
+ readonly attribute IdentifyTypeEnum identifyType = 1;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct IdentifyRequest {
+ int16u identifyTime = 0;
+ }
+
+ request struct TriggerEffectRequest {
+ EffectIdentifierEnum effectIdentifier = 0;
+ EffectVariantEnum effectVariant = 1;
+ }
+
+ command access(invoke: manage) Identify(IdentifyRequest): DefaultSuccess = 0;
+ command access(invoke: manage) TriggerEffect(TriggerEffectRequest): DefaultSuccess = 64;
+}
+
+/** The Descriptor Cluster is meant to replace the support from the Zigbee Device Object (ZDO) for describing a node, its endpoints and clusters. */
+server cluster Descriptor = 29 {
+ bitmap Feature : bitmap32 {
+ kTagList = 0x1;
+ }
+
+ struct DeviceTypeStruct {
+ devtype_id deviceType = 0;
+ int16u revision = 1;
+ }
+
+ struct SemanticTagStruct {
+ nullable vendor_id mfgCode = 0;
+ enum8 namespaceID = 1;
+ enum8 tag = 2;
+ optional nullable char_string label = 3;
+ }
+
+ readonly attribute DeviceTypeStruct deviceTypeList[] = 0;
+ readonly attribute cluster_id serverList[] = 1;
+ readonly attribute cluster_id clientList[] = 2;
+ readonly attribute endpoint_no partsList[] = 3;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** The Access Control Cluster exposes a data model view of a
+ Node's Access Control List (ACL), which codifies the rules used to manage
+ and enforce Access Control for the Node's endpoints and their associated
+ cluster instances. */
+server cluster AccessControl = 31 {
+ enum AccessControlEntryAuthModeEnum : enum8 {
+ kPASE = 1;
+ kCASE = 2;
+ kGroup = 3;
+ }
+
+ enum AccessControlEntryPrivilegeEnum : enum8 {
+ kView = 1;
+ kProxyView = 2;
+ kOperate = 3;
+ kManage = 4;
+ kAdminister = 5;
+ }
+
+ enum ChangeTypeEnum : enum8 {
+ kChanged = 0;
+ kAdded = 1;
+ kRemoved = 2;
+ }
+
+ struct AccessControlTargetStruct {
+ nullable cluster_id cluster = 0;
+ nullable endpoint_no endpoint = 1;
+ nullable devtype_id deviceType = 2;
+ }
+
+ fabric_scoped struct AccessControlEntryStruct {
+ fabric_sensitive AccessControlEntryPrivilegeEnum privilege = 1;
+ fabric_sensitive AccessControlEntryAuthModeEnum authMode = 2;
+ nullable fabric_sensitive int64u subjects[] = 3;
+ nullable fabric_sensitive AccessControlTargetStruct targets[] = 4;
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_scoped struct AccessControlExtensionStruct {
+ fabric_sensitive octet_string<128> data = 1;
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) AccessControlEntryChanged = 0 {
+ nullable node_id adminNodeID = 1;
+ nullable int16u adminPasscodeID = 2;
+ ChangeTypeEnum changeType = 3;
+ nullable AccessControlEntryStruct latestValue = 4;
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) AccessControlExtensionChanged = 1 {
+ nullable node_id adminNodeID = 1;
+ nullable int16u adminPasscodeID = 2;
+ ChangeTypeEnum changeType = 3;
+ nullable AccessControlExtensionStruct latestValue = 4;
+ fabric_idx fabricIndex = 254;
+ }
+
+ attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
+ attribute access(read: administer, write: administer) AccessControlExtensionStruct extension[] = 1;
+ readonly attribute int16u subjectsPerAccessControlEntry = 2;
+ readonly attribute int16u targetsPerAccessControlEntry = 3;
+ readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
+ Commissioning and operational determination of Node characteristics, such as Vendor ID, Product ID and serial number,
+ which apply to the whole Node. Also allows setting user device information such as location. */
+server cluster BasicInformation = 40 {
+ enum ColorEnum : enum8 {
+ kBlack = 0;
+ kNavy = 1;
+ kGreen = 2;
+ kTeal = 3;
+ kMaroon = 4;
+ kPurple = 5;
+ kOlive = 6;
+ kGray = 7;
+ kBlue = 8;
+ kLime = 9;
+ kAqua = 10;
+ kRed = 11;
+ kFuchsia = 12;
+ kYellow = 13;
+ kWhite = 14;
+ kNickel = 15;
+ kChrome = 16;
+ kBrass = 17;
+ kCopper = 18;
+ kSilver = 19;
+ kGold = 20;
+ }
+
+ enum ProductFinishEnum : enum8 {
+ kOther = 0;
+ kMatte = 1;
+ kSatin = 2;
+ kPolished = 3;
+ kRugged = 4;
+ kFabric = 5;
+ }
+
+ struct CapabilityMinimaStruct {
+ int16u caseSessionsPerFabric = 0;
+ int16u subscriptionsPerFabric = 1;
+ }
+
+ struct ProductAppearanceStruct {
+ ProductFinishEnum finish = 0;
+ nullable ColorEnum primaryColor = 1;
+ }
+
+ critical event StartUp = 0 {
+ int32u softwareVersion = 0;
+ }
+
+ critical event ShutDown = 1 {
+ }
+
+ info event Leave = 2 {
+ fabric_idx fabricIndex = 0;
+ }
+
+ info event ReachableChanged = 3 {
+ boolean reachableNewValue = 0;
+ }
+
+ readonly attribute int16u dataModelRevision = 0;
+ readonly attribute char_string<32> vendorName = 1;
+ readonly attribute vendor_id vendorID = 2;
+ readonly attribute char_string<32> productName = 3;
+ readonly attribute int16u productID = 4;
+ attribute access(write: manage) char_string<32> nodeLabel = 5;
+ attribute access(write: administer) char_string<2> location = 6;
+ readonly attribute int16u hardwareVersion = 7;
+ readonly attribute char_string<64> hardwareVersionString = 8;
+ readonly attribute int32u softwareVersion = 9;
+ readonly attribute char_string<64> softwareVersionString = 10;
+ readonly attribute char_string<16> manufacturingDate = 11;
+ readonly attribute char_string<32> partNumber = 12;
+ readonly attribute long_char_string<256> productURL = 13;
+ readonly attribute char_string<64> productLabel = 14;
+ readonly attribute char_string<32> serialNumber = 15;
+ attribute access(write: manage) boolean localConfigDisabled = 16;
+ readonly attribute char_string<32> uniqueID = 18;
+ readonly attribute CapabilityMinimaStruct capabilityMinima = 19;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** Provides an interface for providing OTA software updates */
+client cluster OtaSoftwareUpdateProvider = 41 {
+ enum ApplyUpdateActionEnum : enum8 {
+ kProceed = 0;
+ kAwaitNextAction = 1;
+ kDiscontinue = 2;
+ }
+
+ enum DownloadProtocolEnum : enum8 {
+ kBDXSynchronous = 0;
+ kBDXAsynchronous = 1;
+ kHTTPS = 2;
+ kVendorSpecific = 3;
+ }
+
+ enum StatusEnum : enum8 {
+ kUpdateAvailable = 0;
+ kBusy = 1;
+ kNotAvailable = 2;
+ kDownloadProtocolNotSupported = 3;
+ }
+
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct QueryImageRequest {
+ vendor_id vendorID = 0;
+ int16u productID = 1;
+ int32u softwareVersion = 2;
+ DownloadProtocolEnum protocolsSupported[] = 3;
+ optional int16u hardwareVersion = 4;
+ optional char_string<2> location = 5;
+ optional boolean requestorCanConsent = 6;
+ optional octet_string<512> metadataForProvider = 7;
+ }
+
+ response struct QueryImageResponse = 1 {
+ StatusEnum status = 0;
+ optional int32u delayedActionTime = 1;
+ optional char_string<256> imageURI = 2;
+ optional int32u softwareVersion = 3;
+ optional char_string<64> softwareVersionString = 4;
+ optional octet_string<32> updateToken = 5;
+ optional boolean userConsentNeeded = 6;
+ optional octet_string<512> metadataForRequestor = 7;
+ }
+
+ request struct ApplyUpdateRequestRequest {
+ octet_string<32> updateToken = 0;
+ int32u newVersion = 1;
+ }
+
+ response struct ApplyUpdateResponse = 3 {
+ ApplyUpdateActionEnum action = 0;
+ int32u delayedActionTime = 1;
+ }
+
+ request struct NotifyUpdateAppliedRequest {
+ octet_string<32> updateToken = 0;
+ int32u softwareVersion = 1;
+ }
+
+ /** Determine availability of a new Software Image */
+ command QueryImage(QueryImageRequest): QueryImageResponse = 0;
+ /** Determine next action to take for a downloaded Software Image */
+ command ApplyUpdateRequest(ApplyUpdateRequestRequest): ApplyUpdateResponse = 2;
+ /** Notify OTA Provider that an update was applied */
+ command NotifyUpdateApplied(NotifyUpdateAppliedRequest): DefaultSuccess = 4;
+}
+
+/** Provides an interface for downloading and applying OTA software updates */
+server cluster OtaSoftwareUpdateRequestor = 42 {
+ enum AnnouncementReasonEnum : enum8 {
+ kSimpleAnnouncement = 0;
+ kUpdateAvailable = 1;
+ kUrgentUpdateAvailable = 2;
+ }
+
+ enum ChangeReasonEnum : enum8 {
+ kUnknown = 0;
+ kSuccess = 1;
+ kFailure = 2;
+ kTimeOut = 3;
+ kDelayByProvider = 4;
+ }
+
+ enum UpdateStateEnum : enum8 {
+ kUnknown = 0;
+ kIdle = 1;
+ kQuerying = 2;
+ kDelayedOnQuery = 3;
+ kDownloading = 4;
+ kApplying = 5;
+ kDelayedOnApply = 6;
+ kRollingBack = 7;
+ kDelayedOnUserConsent = 8;
+ }
+
+ fabric_scoped struct ProviderLocation {
+ node_id providerNodeID = 1;
+ endpoint_no endpoint = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
+ info event StateTransition = 0 {
+ UpdateStateEnum previousState = 0;
+ UpdateStateEnum newState = 1;
+ ChangeReasonEnum reason = 2;
+ nullable int32u targetSoftwareVersion = 3;
+ }
+
+ critical event VersionApplied = 1 {
+ int32u softwareVersion = 0;
+ int16u productID = 1;
+ }
+
+ info event DownloadError = 2 {
+ int32u softwareVersion = 0;
+ int64u bytesDownloaded = 1;
+ nullable int8u progressPercent = 2;
+ nullable int64s platformCode = 3;
+ }
+
+ attribute ProviderLocation defaultOTAProviders[] = 0;
+ readonly attribute boolean updatePossible = 1;
+ readonly attribute UpdateStateEnum updateState = 2;
+ readonly attribute nullable int8u updateStateProgress = 3;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct AnnounceOTAProviderRequest {
+ node_id providerNodeID = 0;
+ vendor_id vendorID = 1;
+ AnnouncementReasonEnum announcementReason = 2;
+ optional octet_string<512> metadataForNode = 3;
+ endpoint_no endpoint = 4;
+ }
+
+ command AnnounceOTAProvider(AnnounceOTAProviderRequest): DefaultSuccess = 0;
+}
+
+/** This cluster is used to manage global aspects of the Commissioning flow. */
+server cluster GeneralCommissioning = 48 {
+ enum CommissioningErrorEnum : enum8 {
+ kOK = 0;
+ kValueOutsideRange = 1;
+ kInvalidAuthentication = 2;
+ kNoFailSafe = 3;
+ kBusyWithOtherAdmin = 4;
+ }
+
+ enum RegulatoryLocationTypeEnum : enum8 {
+ kIndoor = 0;
+ kOutdoor = 1;
+ kIndoorOutdoor = 2;
+ }
+
+ struct BasicCommissioningInfo {
+ int16u failSafeExpiryLengthSeconds = 0;
+ int16u maxCumulativeFailsafeSeconds = 1;
+ }
+
+ attribute access(write: administer) int64u breadcrumb = 0;
+ readonly attribute BasicCommissioningInfo basicCommissioningInfo = 1;
+ readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
+ readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
+ readonly attribute boolean supportsConcurrentConnection = 4;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct ArmFailSafeRequest {
+ int16u expiryLengthSeconds = 0;
+ int64u breadcrumb = 1;
+ }
+
+ request struct SetRegulatoryConfigRequest {
+ RegulatoryLocationTypeEnum newRegulatoryConfig = 0;
+ char_string countryCode = 1;
+ int64u breadcrumb = 2;
+ }
+
+ response struct ArmFailSafeResponse = 1 {
+ CommissioningErrorEnum errorCode = 0;
+ char_string debugText = 1;
+ }
+
+ response struct SetRegulatoryConfigResponse = 3 {
+ CommissioningErrorEnum errorCode = 0;
+ char_string debugText = 1;
+ }
+
+ response struct CommissioningCompleteResponse = 5 {
+ CommissioningErrorEnum errorCode = 0;
+ char_string debugText = 1;
+ }
+
+ command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
+ command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
+ fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+}
+
+/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
+server cluster NetworkCommissioning = 49 {
+ enum NetworkCommissioningStatusEnum : enum8 {
+ kSuccess = 0;
+ kOutOfRange = 1;
+ kBoundsExceeded = 2;
+ kNetworkIDNotFound = 3;
+ kDuplicateNetworkID = 4;
+ kNetworkNotFound = 5;
+ kRegulatoryError = 6;
+ kAuthFailure = 7;
+ kUnsupportedSecurity = 8;
+ kOtherConnectionFailure = 9;
+ kIPV6Failed = 10;
+ kIPBindFailed = 11;
+ kUnknownError = 12;
+ }
+
+ enum WiFiBandEnum : enum8 {
+ k2G4 = 0;
+ k3G65 = 1;
+ k5G = 2;
+ k6G = 3;
+ k60G = 4;
+ k1G = 5;
+ }
+
+ bitmap Feature : bitmap32 {
+ kWiFiNetworkInterface = 0x1;
+ kThreadNetworkInterface = 0x2;
+ kEthernetNetworkInterface = 0x4;
+ }
+
+ bitmap ThreadCapabilitiesBitmap : bitmap16 {
+ kIsBorderRouterCapable = 0x1;
+ kIsRouterCapable = 0x2;
+ kIsSleepyEndDeviceCapable = 0x4;
+ kIsFullThreadDevice = 0x8;
+ kIsSynchronizedSleepyEndDeviceCapable = 0x10;
+ }
+
+ bitmap WiFiSecurityBitmap : bitmap8 {
+ kUnencrypted = 0x1;
+ kWEP = 0x2;
+ kWPAPersonal = 0x4;
+ kWPA2Personal = 0x8;
+ kWPA3Personal = 0x10;
+ }
+
+ struct NetworkInfoStruct {
+ octet_string<32> networkID = 0;
+ boolean connected = 1;
+ }
+
+ struct ThreadInterfaceScanResultStruct {
+ int16u panId = 0;
+ int64u extendedPanId = 1;
+ char_string<16> networkName = 2;
+ int16u channel = 3;
+ int8u version = 4;
+ octet_string<8> extendedAddress = 5;
+ int8s rssi = 6;
+ int8u lqi = 7;
+ }
+
+ struct WiFiInterfaceScanResultStruct {
+ WiFiSecurityBitmap security = 0;
+ octet_string<32> ssid = 1;
+ octet_string<6> bssid = 2;
+ int16u channel = 3;
+ WiFiBandEnum wiFiBand = 4;
+ int8s rssi = 5;
+ }
+
+ readonly attribute access(read: administer) int8u maxNetworks = 0;
+ readonly attribute access(read: administer) NetworkInfoStruct networks[] = 1;
+ readonly attribute int8u scanMaxTimeSeconds = 2;
+ readonly attribute int8u connectMaxTimeSeconds = 3;
+ attribute access(write: administer) boolean interfaceEnabled = 4;
+ readonly attribute access(read: administer) nullable NetworkCommissioningStatusEnum lastNetworkingStatus = 5;
+ readonly attribute access(read: administer) nullable octet_string<32> lastNetworkID = 6;
+ readonly attribute access(read: administer) nullable int32s lastConnectErrorValue = 7;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct ScanNetworksRequest {
+ optional nullable octet_string<32> ssid = 0;
+ optional int64u breadcrumb = 1;
+ }
+
+ request struct AddOrUpdateWiFiNetworkRequest {
+ octet_string<32> ssid = 0;
+ octet_string<64> credentials = 1;
+ optional int64u breadcrumb = 2;
+ }
+
+ request struct AddOrUpdateThreadNetworkRequest {
+ octet_string<254> operationalDataset = 0;
+ optional int64u breadcrumb = 1;
+ }
+
+ request struct RemoveNetworkRequest {
+ octet_string<32> networkID = 0;
+ optional int64u breadcrumb = 1;
+ }
+
+ request struct ConnectNetworkRequest {
+ octet_string<32> networkID = 0;
+ optional int64u breadcrumb = 1;
+ }
+
+ request struct ReorderNetworkRequest {
+ octet_string<32> networkID = 0;
+ int8u networkIndex = 1;
+ optional int64u breadcrumb = 2;
+ }
+
+ response struct ScanNetworksResponse = 1 {
+ NetworkCommissioningStatusEnum networkingStatus = 0;
+ optional char_string debugText = 1;
+ optional WiFiInterfaceScanResultStruct wiFiScanResults[] = 2;
+ optional ThreadInterfaceScanResultStruct threadScanResults[] = 3;
+ }
+
+ response struct NetworkConfigResponse = 5 {
+ NetworkCommissioningStatusEnum networkingStatus = 0;
+ optional char_string<512> debugText = 1;
+ optional int8u networkIndex = 2;
+ }
+
+ response struct ConnectNetworkResponse = 7 {
+ NetworkCommissioningStatusEnum networkingStatus = 0;
+ optional char_string debugText = 1;
+ nullable int32s errorValue = 2;
+ }
+
+ command access(invoke: administer) ScanNetworks(ScanNetworksRequest): ScanNetworksResponse = 0;
+ command access(invoke: administer) AddOrUpdateWiFiNetwork(AddOrUpdateWiFiNetworkRequest): NetworkConfigResponse = 2;
+ command access(invoke: administer) AddOrUpdateThreadNetwork(AddOrUpdateThreadNetworkRequest): NetworkConfigResponse = 3;
+ command access(invoke: administer) RemoveNetwork(RemoveNetworkRequest): NetworkConfigResponse = 4;
+ command access(invoke: administer) ConnectNetwork(ConnectNetworkRequest): ConnectNetworkResponse = 6;
+ command access(invoke: administer) ReorderNetwork(ReorderNetworkRequest): NetworkConfigResponse = 8;
+}
+
+/** The cluster provides commands for retrieving unstructured diagnostic logs from a Node that may be used to aid in diagnostics. */
+server cluster DiagnosticLogs = 50 {
+ enum IntentEnum : enum8 {
+ kEndUserSupport = 0;
+ kNetworkDiag = 1;
+ kCrashLogs = 2;
+ }
+
+ enum StatusEnum : enum8 {
+ kSuccess = 0;
+ kExhausted = 1;
+ kNoLogs = 2;
+ kBusy = 3;
+ kDenied = 4;
+ }
+
+ enum TransferProtocolEnum : enum8 {
+ kResponsePayload = 0;
+ kBDX = 1;
+ }
+
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct RetrieveLogsRequestRequest {
+ IntentEnum intent = 0;
+ TransferProtocolEnum requestedProtocol = 1;
+ optional char_string<32> transferFileDesignator = 2;
+ }
+
+ command RetrieveLogsRequest(RetrieveLogsRequestRequest): RetrieveLogsResponse = 0;
+}
+
+/** The General Diagnostics Cluster, along with other diagnostics clusters, provide a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */
+server cluster GeneralDiagnostics = 51 {
+ enum BootReasonEnum : enum8 {
+ kUnspecified = 0;
+ kPowerOnReboot = 1;
+ kBrownOutReset = 2;
+ kSoftwareWatchdogReset = 3;
+ kHardwareWatchdogReset = 4;
+ kSoftwareUpdateCompleted = 5;
+ kSoftwareReset = 6;
+ }
+
+ enum HardwareFaultEnum : enum8 {
+ kUnspecified = 0;
+ kRadio = 1;
+ kSensor = 2;
+ kResettableOverTemp = 3;
+ kNonResettableOverTemp = 4;
+ kPowerSource = 5;
+ kVisualDisplayFault = 6;
+ kAudioOutputFault = 7;
+ kUserInterfaceFault = 8;
+ kNonVolatileMemoryError = 9;
+ kTamperDetected = 10;
+ }
+
+ enum InterfaceTypeEnum : enum8 {
+ kUnspecified = 0;
+ kWiFi = 1;
+ kEthernet = 2;
+ kCellular = 3;
+ kThread = 4;
+ }
+
+ enum NetworkFaultEnum : enum8 {
+ kUnspecified = 0;
+ kHardwareFailure = 1;
+ kNetworkJammed = 2;
+ kConnectionFailed = 3;
+ }
+
+ enum RadioFaultEnum : enum8 {
+ kUnspecified = 0;
+ kWiFiFault = 1;
+ kCellularFault = 2;
+ kThreadFault = 3;
+ kNFCFault = 4;
+ kBLEFault = 5;
+ kEthernetFault = 6;
+ }
+
+ struct NetworkInterface {
+ char_string<32> name = 0;
+ boolean isOperational = 1;
+ nullable boolean offPremiseServicesReachableIPv4 = 2;
+ nullable boolean offPremiseServicesReachableIPv6 = 3;
+ octet_string<8> hardwareAddress = 4;
+ octet_string IPv4Addresses[] = 5;
+ octet_string IPv6Addresses[] = 6;
+ InterfaceTypeEnum type = 7;
+ }
+
+ critical event HardwareFaultChange = 0 {
+ HardwareFaultEnum current[] = 0;
+ HardwareFaultEnum previous[] = 1;
+ }
+
+ critical event RadioFaultChange = 1 {
+ RadioFaultEnum current[] = 0;
+ RadioFaultEnum previous[] = 1;
+ }
+
+ critical event NetworkFaultChange = 2 {
+ NetworkFaultEnum current[] = 0;
+ NetworkFaultEnum previous[] = 1;
+ }
+
+ critical event BootReason = 3 {
+ BootReasonEnum bootReason = 0;
+ }
+
+ readonly attribute NetworkInterface networkInterfaces[] = 0;
+ readonly attribute int16u rebootCount = 1;
+ readonly attribute int64u upTime = 2;
+ readonly attribute int32u totalOperationalHours = 3;
+ readonly attribute BootReasonEnum bootReason = 4;
+ readonly attribute HardwareFaultEnum activeHardwareFaults[] = 5;
+ readonly attribute RadioFaultEnum activeRadioFaults[] = 6;
+ readonly attribute NetworkFaultEnum activeNetworkFaults[] = 7;
+ readonly attribute boolean testEventTriggersEnabled = 8;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct TestEventTriggerRequest {
+ octet_string<16> enableKey = 0;
+ int64u eventTrigger = 1;
+ }
+
+ command access(invoke: manage) TestEventTrigger(TestEventTriggerRequest): DefaultSuccess = 0;
+}
+
+/** Commands to trigger a Node to allow a new Administrator to commission it. */
+server cluster AdministratorCommissioning = 60 {
+ enum CommissioningWindowStatusEnum : enum8 {
+ kWindowNotOpen = 0;
+ kEnhancedWindowOpen = 1;
+ kBasicWindowOpen = 2;
+ }
+
+ enum StatusCode : enum8 {
+ kBusy = 2;
+ kPAKEParameterError = 3;
+ kWindowNotOpen = 4;
+ }
+
+ bitmap Feature : bitmap32 {
+ kBasic = 0x1;
+ }
+
+ readonly attribute CommissioningWindowStatusEnum windowStatus = 0;
+ readonly attribute nullable fabric_idx adminFabricIndex = 1;
+ readonly attribute nullable vendor_id adminVendorId = 2;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct OpenCommissioningWindowRequest {
+ int16u commissioningTimeout = 0;
+ octet_string PAKEPasscodeVerifier = 1;
+ int16u discriminator = 2;
+ int32u iterations = 3;
+ octet_string<32> salt = 4;
+ }
+
+ request struct OpenBasicCommissioningWindowRequest {
+ int16u commissioningTimeout = 0;
+ }
+
+ timed command access(invoke: administer) OpenCommissioningWindow(OpenCommissioningWindowRequest): DefaultSuccess = 0;
+ timed command access(invoke: administer) OpenBasicCommissioningWindow(OpenBasicCommissioningWindowRequest): DefaultSuccess = 1;
+ timed command access(invoke: administer) RevokeCommissioning(): DefaultSuccess = 2;
+}
+
+/** This cluster is used to add or remove Operational Credentials on a Commissionee or Node, as well as manage the associated Fabrics. */
+server cluster OperationalCredentials = 62 {
+ enum CertificateChainTypeEnum : enum8 {
+ kDACCertificate = 1;
+ kPAICertificate = 2;
+ }
+
+ enum NodeOperationalCertStatusEnum : enum8 {
+ kOK = 0;
+ kInvalidPublicKey = 1;
+ kInvalidNodeOpId = 2;
+ kInvalidNOC = 3;
+ kMissingCsr = 4;
+ kTableFull = 5;
+ kInvalidAdminSubject = 6;
+ kFabricConflict = 9;
+ kLabelConflict = 10;
+ kInvalidFabricIndex = 11;
+ }
+
+ fabric_scoped struct FabricDescriptorStruct {
+ octet_string<65> rootPublicKey = 1;
+ vendor_id vendorID = 2;
+ fabric_id fabricID = 3;
+ node_id nodeID = 4;
+ char_string<32> label = 5;
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_scoped struct NOCStruct {
+ fabric_sensitive octet_string noc = 1;
+ nullable fabric_sensitive octet_string icac = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
+ readonly attribute access(read: administer) NOCStruct NOCs[] = 0;
+ readonly attribute FabricDescriptorStruct fabrics[] = 1;
+ readonly attribute int8u supportedFabrics = 2;
+ readonly attribute int8u commissionedFabrics = 3;
+ readonly attribute octet_string trustedRootCertificates[] = 4;
+ readonly attribute int8u currentFabricIndex = 5;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct AttestationRequestRequest {
+ octet_string<32> attestationNonce = 0;
+ }
+
+ request struct CertificateChainRequestRequest {
+ CertificateChainTypeEnum certificateType = 0;
+ }
+
+ request struct CSRRequestRequest {
+ octet_string<32> CSRNonce = 0;
+ optional boolean isForUpdateNOC = 1;
+ }
+
+ request struct AddNOCRequest {
+ octet_string<400> NOCValue = 0;
+ optional octet_string<400> ICACValue = 1;
+ octet_string<16> IPKValue = 2;
+ int64u caseAdminSubject = 3;
+ vendor_id adminVendorId = 4;
+ }
+
+ request struct UpdateNOCRequest {
+ octet_string NOCValue = 0;
+ optional octet_string ICACValue = 1;
+ }
+
+ request struct UpdateFabricLabelRequest {
+ char_string<32> label = 0;
+ }
+
+ request struct RemoveFabricRequest {
+ fabric_idx fabricIndex = 0;
+ }
+
+ request struct AddTrustedRootCertificateRequest {
+ octet_string rootCACertificate = 0;
+ }
+
+ response struct AttestationResponse = 1 {
+ octet_string<900> attestationElements = 0;
+ octet_string<64> attestationSignature = 1;
+ }
+
+ response struct CertificateChainResponse = 3 {
+ octet_string<600> certificate = 0;
+ }
+
+ response struct CSRResponse = 5 {
+ octet_string NOCSRElements = 0;
+ octet_string attestationSignature = 1;
+ }
+
+ response struct NOCResponse = 8 {
+ NodeOperationalCertStatusEnum statusCode = 0;
+ optional fabric_idx fabricIndex = 1;
+ optional char_string<128> debugText = 2;
+ }
+
+ command access(invoke: administer) AttestationRequest(AttestationRequestRequest): AttestationResponse = 0;
+ command access(invoke: administer) CertificateChainRequest(CertificateChainRequestRequest): CertificateChainResponse = 2;
+ command access(invoke: administer) CSRRequest(CSRRequestRequest): CSRResponse = 4;
+ command access(invoke: administer) AddNOC(AddNOCRequest): NOCResponse = 6;
+ fabric command access(invoke: administer) UpdateNOC(UpdateNOCRequest): NOCResponse = 7;
+ fabric command access(invoke: administer) UpdateFabricLabel(UpdateFabricLabelRequest): NOCResponse = 9;
+ command access(invoke: administer) RemoveFabric(RemoveFabricRequest): NOCResponse = 10;
+ command access(invoke: administer) AddTrustedRootCertificate(AddTrustedRootCertificateRequest): DefaultSuccess = 11;
+}
+
+/** The Group Key Management Cluster is the mechanism by which group keys are managed. */
+server cluster GroupKeyManagement = 63 {
+ enum GroupKeySecurityPolicyEnum : enum8 {
+ kTrustFirst = 0;
+ kCacheAndSync = 1;
+ }
+
+ bitmap Feature : bitmap32 {
+ kCacheAndSync = 0x1;
+ }
+
+ fabric_scoped struct GroupInfoMapStruct {
+ group_id groupId = 1;
+ endpoint_no endpoints[] = 2;
+ optional char_string<16> groupName = 3;
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_scoped struct GroupKeyMapStruct {
+ group_id groupId = 1;
+ int16u groupKeySetID = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
+ struct GroupKeySetStruct {
+ int16u groupKeySetID = 0;
+ GroupKeySecurityPolicyEnum groupKeySecurityPolicy = 1;
+ nullable octet_string<16> epochKey0 = 2;
+ nullable epoch_us epochStartTime0 = 3;
+ nullable octet_string<16> epochKey1 = 4;
+ nullable epoch_us epochStartTime1 = 5;
+ nullable octet_string<16> epochKey2 = 6;
+ nullable epoch_us epochStartTime2 = 7;
+ }
+
+ attribute access(write: manage) GroupKeyMapStruct groupKeyMap[] = 0;
+ readonly attribute GroupInfoMapStruct groupTable[] = 1;
+ readonly attribute int16u maxGroupsPerFabric = 2;
+ readonly attribute int16u maxGroupKeysPerFabric = 3;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct KeySetWriteRequest {
+ GroupKeySetStruct groupKeySet = 0;
+ }
+
+ request struct KeySetReadRequest {
+ int16u groupKeySetID = 0;
+ }
+
+ request struct KeySetRemoveRequest {
+ int16u groupKeySetID = 0;
+ }
+
+ response struct KeySetReadResponse = 2 {
+ GroupKeySetStruct groupKeySet = 0;
+ }
+
+ response struct KeySetReadAllIndicesResponse = 5 {
+ int16u groupKeySetIDs[] = 0;
+ }
+
+ fabric command access(invoke: administer) KeySetWrite(KeySetWriteRequest): DefaultSuccess = 0;
+ fabric command access(invoke: administer) KeySetRead(KeySetReadRequest): KeySetReadResponse = 1;
+ fabric command access(invoke: administer) KeySetRemove(KeySetRemoveRequest): DefaultSuccess = 3;
+ fabric command access(invoke: administer) KeySetReadAllIndices(): KeySetReadAllIndicesResponse = 4;
+}
+
+/** Attributes for reporting air quality classification */
+server cluster AirQuality = 91 {
+ enum AirQualityEnum : enum8 {
+ kUnknown = 0;
+ kGood = 1;
+ kFair = 2;
+ kModerate = 3;
+ kPoor = 4;
+ kVeryPoor = 5;
+ kExtremelyPoor = 6;
+ }
+
+ bitmap Feature : bitmap32 {
+ kFair = 0x1;
+ kModerate = 0x2;
+ kVeryPoor = 0x4;
+ kExtremelyPoor = 0x8;
+ }
+
+ readonly attribute AirQualityEnum airQuality = 0;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** Attributes and commands for monitoring HEPA filters in a device */
+server cluster HepaFilterMonitoring = 113 {
+ enum ChangeIndicationEnum : enum8 {
+ kOK = 0;
+ kWarning = 1;
+ kCritical = 2;
+ }
+
+ enum DegradationDirectionEnum : enum8 {
+ kUp = 0;
+ kDown = 1;
+ }
+
+ enum ProductIdentifierTypeEnum : enum8 {
+ kUPC = 0;
+ kGTIN8 = 1;
+ kEAN = 2;
+ kGTIN14 = 3;
+ kOEM = 4;
+ }
+
+ bitmap Feature : bitmap32 {
+ kCondition = 0x1;
+ kWarning = 0x2;
+ kReplacementProductList = 0x4;
+ }
+
+ struct ReplacementProductStruct {
+ ProductIdentifierTypeEnum productIdentifierType = 0;
+ char_string<20> productIdentifierValue = 1;
+ }
+
+ readonly attribute percent condition = 0;
+ readonly attribute DegradationDirectionEnum degradationDirection = 1;
+ readonly attribute ChangeIndicationEnum changeIndication = 2;
+ readonly attribute boolean inPlaceIndicator = 3;
+ attribute nullable epoch_s lastChangedTime = 4;
+ readonly attribute ReplacementProductStruct replacementProductList[] = 5;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ command ResetCondition(): DefaultSuccess = 0;
+}
+
+/** Attributes and commands for monitoring activated carbon filters in a device */
+server cluster ActivatedCarbonFilterMonitoring = 114 {
+ enum ChangeIndicationEnum : enum8 {
+ kOK = 0;
+ kWarning = 1;
+ kCritical = 2;
+ }
+
+ enum DegradationDirectionEnum : enum8 {
+ kUp = 0;
+ kDown = 1;
+ }
+
+ enum ProductIdentifierTypeEnum : enum8 {
+ kUPC = 0;
+ kGTIN8 = 1;
+ kEAN = 2;
+ kGTIN14 = 3;
+ kOEM = 4;
+ }
+
+ bitmap Feature : bitmap32 {
+ kCondition = 0x1;
+ kWarning = 0x2;
+ kReplacementProductList = 0x4;
+ }
+
+ struct ReplacementProductStruct {
+ ProductIdentifierTypeEnum productIdentifierType = 0;
+ char_string<20> productIdentifierValue = 1;
+ }
+
+ readonly attribute percent condition = 0;
+ readonly attribute DegradationDirectionEnum degradationDirection = 1;
+ readonly attribute ChangeIndicationEnum changeIndication = 2;
+ readonly attribute boolean inPlaceIndicator = 3;
+ attribute nullable epoch_s lastChangedTime = 4;
+ readonly attribute ReplacementProductStruct replacementProductList[] = 5;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ command ResetCondition(): DefaultSuccess = 0;
+}
+
+/** An interface for controlling a fan in a heating/cooling system. */
+provisional server cluster FanControl = 514 {
+ enum AirflowDirectionEnum : enum8 {
+ kForward = 0;
+ kReverse = 1;
+ }
+
+ enum FanModeEnum : enum8 {
+ kOff = 0;
+ kLow = 1;
+ kMedium = 2;
+ kHigh = 3;
+ kOn = 4;
+ kAuto = 5;
+ kSmart = 6;
+ }
+
+ enum FanModeSequenceEnum : enum8 {
+ kOffLowMedHigh = 0;
+ kOffLowHigh = 1;
+ kOffLowMedHighAuto = 2;
+ kOffLowHighAuto = 3;
+ kOffOnAuto = 4;
+ kOffOn = 5;
+ }
+
+ enum StepDirectionEnum : enum8 {
+ kIncrease = 0;
+ kDecrease = 1;
+ }
+
+ bitmap Feature : bitmap32 {
+ kMultiSpeed = 0x1;
+ kAuto = 0x2;
+ kRocking = 0x4;
+ kWind = 0x8;
+ kStep = 0x10;
+ kAirflowDirection = 0x20;
+ }
+
+ bitmap RockBitmap : bitmap8 {
+ kRockLeftRight = 0x1;
+ kRockUpDown = 0x2;
+ kRockRound = 0x4;
+ }
+
+ bitmap WindBitmap : bitmap8 {
+ kSleepWind = 0x1;
+ kNaturalWind = 0x2;
+ }
+
+ attribute FanModeEnum fanMode = 0;
+ attribute FanModeSequenceEnum fanModeSequence = 1;
+ attribute nullable percent percentSetting = 2;
+ readonly attribute percent percentCurrent = 3;
+ readonly attribute int8u speedMax = 4;
+ attribute nullable int8u speedSetting = 5;
+ readonly attribute int8u speedCurrent = 6;
+ readonly attribute RockBitmap rockSupport = 7;
+ attribute RockBitmap rockSetting = 8;
+ readonly attribute WindBitmap windSupport = 9;
+ attribute WindBitmap windSetting = 10;
+ attribute AirflowDirectionEnum airflowDirection = 11;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct StepRequest {
+ StepDirectionEnum direction = 0;
+ optional boolean wrap = 1;
+ optional boolean lowestOff = 2;
+ }
+
+ command Step(StepRequest): DefaultSuccess = 0;
+}
+
+/** Attributes and commands for configuring the measurement of temperature, and reporting temperature measurements. */
+server cluster TemperatureMeasurement = 1026 {
+ readonly attribute nullable temperature measuredValue = 0;
+ readonly attribute nullable temperature minMeasuredValue = 1;
+ readonly attribute nullable temperature maxMeasuredValue = 2;
+ readonly attribute temperature tolerance = 3;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** Attributes and commands for configuring the measurement of relative humidity, and reporting relative humidity measurements. */
+server cluster RelativeHumidityMeasurement = 1029 {
+ readonly attribute nullable int16u measuredValue = 0;
+ readonly attribute nullable int16u minMeasuredValue = 1;
+ readonly attribute nullable int16u maxMeasuredValue = 2;
+ readonly attribute int16u tolerance = 3;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** Attributes for reporting carbon monoxide concentration measurements */
+server cluster CarbonMonoxideConcentrationMeasurement = 1036 {
+ enum LevelValueEnum : enum8 {
+ kUnknown = 0;
+ kLow = 1;
+ kMedium = 2;
+ kHigh = 3;
+ kCritical = 4;
+ }
+
+ enum MeasurementMediumEnum : enum8 {
+ kAir = 0;
+ kWater = 1;
+ kSoil = 2;
+ }
+
+ enum MeasurementUnitEnum : enum8 {
+ kPPM = 0;
+ kPPB = 1;
+ kPPT = 2;
+ kMGM3 = 3;
+ kUGM3 = 4;
+ kNGM3 = 5;
+ kPM3 = 6;
+ kBQM3 = 7;
+ }
+
+ bitmap Feature : bitmap32 {
+ kNumericMeasurement = 0x1;
+ kLevelIndication = 0x2;
+ kMediumLevel = 0x4;
+ kCriticalLevel = 0x8;
+ kPeakMeasurement = 0x10;
+ kAverageMeasurement = 0x20;
+ }
+
+ readonly attribute nullable single measuredValue = 0;
+ readonly attribute nullable single minMeasuredValue = 1;
+ readonly attribute nullable single maxMeasuredValue = 2;
+ readonly attribute nullable single peakMeasuredValue = 3;
+ readonly attribute elapsed_s peakMeasuredValueWindow = 4;
+ readonly attribute nullable single averageMeasuredValue = 5;
+ readonly attribute elapsed_s averageMeasuredValueWindow = 6;
+ readonly attribute single uncertainty = 7;
+ readonly attribute MeasurementUnitEnum measurementUnit = 8;
+ readonly attribute MeasurementMediumEnum measurementMedium = 9;
+ readonly attribute LevelValueEnum levelValue = 10;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** Attributes for reporting carbon dioxide concentration measurements */
+server cluster CarbonDioxideConcentrationMeasurement = 1037 {
+ enum LevelValueEnum : enum8 {
+ kUnknown = 0;
+ kLow = 1;
+ kMedium = 2;
+ kHigh = 3;
+ kCritical = 4;
+ }
+
+ enum MeasurementMediumEnum : enum8 {
+ kAir = 0;
+ kWater = 1;
+ kSoil = 2;
+ }
+
+ enum MeasurementUnitEnum : enum8 {
+ kPPM = 0;
+ kPPB = 1;
+ kPPT = 2;
+ kMGM3 = 3;
+ kUGM3 = 4;
+ kNGM3 = 5;
+ kPM3 = 6;
+ kBQM3 = 7;
+ }
+
+ bitmap Feature : bitmap32 {
+ kNumericMeasurement = 0x1;
+ kLevelIndication = 0x2;
+ kMediumLevel = 0x4;
+ kCriticalLevel = 0x8;
+ kPeakMeasurement = 0x10;
+ kAverageMeasurement = 0x20;
+ }
+
+ readonly attribute nullable single measuredValue = 0;
+ readonly attribute nullable single minMeasuredValue = 1;
+ readonly attribute nullable single maxMeasuredValue = 2;
+ readonly attribute nullable single peakMeasuredValue = 3;
+ readonly attribute elapsed_s peakMeasuredValueWindow = 4;
+ readonly attribute nullable single averageMeasuredValue = 5;
+ readonly attribute elapsed_s averageMeasuredValueWindow = 6;
+ readonly attribute single uncertainty = 7;
+ readonly attribute MeasurementUnitEnum measurementUnit = 8;
+ readonly attribute MeasurementMediumEnum measurementMedium = 9;
+ readonly attribute LevelValueEnum levelValue = 10;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** Attributes for reporting nitrogen dioxide concentration measurements */
+server cluster NitrogenDioxideConcentrationMeasurement = 1043 {
+ enum LevelValueEnum : enum8 {
+ kUnknown = 0;
+ kLow = 1;
+ kMedium = 2;
+ kHigh = 3;
+ kCritical = 4;
+ }
+
+ enum MeasurementMediumEnum : enum8 {
+ kAir = 0;
+ kWater = 1;
+ kSoil = 2;
+ }
+
+ enum MeasurementUnitEnum : enum8 {
+ kPPM = 0;
+ kPPB = 1;
+ kPPT = 2;
+ kMGM3 = 3;
+ kUGM3 = 4;
+ kNGM3 = 5;
+ kPM3 = 6;
+ kBQM3 = 7;
+ }
+
+ bitmap Feature : bitmap32 {
+ kNumericMeasurement = 0x1;
+ kLevelIndication = 0x2;
+ kMediumLevel = 0x4;
+ kCriticalLevel = 0x8;
+ kPeakMeasurement = 0x10;
+ kAverageMeasurement = 0x20;
+ }
+
+ readonly attribute nullable single measuredValue = 0;
+ readonly attribute nullable single minMeasuredValue = 1;
+ readonly attribute nullable single maxMeasuredValue = 2;
+ readonly attribute nullable single peakMeasuredValue = 3;
+ readonly attribute elapsed_s peakMeasuredValueWindow = 4;
+ readonly attribute nullable single averageMeasuredValue = 5;
+ readonly attribute elapsed_s averageMeasuredValueWindow = 6;
+ readonly attribute single uncertainty = 7;
+ readonly attribute MeasurementUnitEnum measurementUnit = 8;
+ readonly attribute MeasurementMediumEnum measurementMedium = 9;
+ readonly attribute LevelValueEnum levelValue = 10;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** Attributes for reporting ozone concentration measurements */
+server cluster OzoneConcentrationMeasurement = 1045 {
+ enum LevelValueEnum : enum8 {
+ kUnknown = 0;
+ kLow = 1;
+ kMedium = 2;
+ kHigh = 3;
+ kCritical = 4;
+ }
+
+ enum MeasurementMediumEnum : enum8 {
+ kAir = 0;
+ kWater = 1;
+ kSoil = 2;
+ }
+
+ enum MeasurementUnitEnum : enum8 {
+ kPPM = 0;
+ kPPB = 1;
+ kPPT = 2;
+ kMGM3 = 3;
+ kUGM3 = 4;
+ kNGM3 = 5;
+ kPM3 = 6;
+ kBQM3 = 7;
+ }
+
+ bitmap Feature : bitmap32 {
+ kNumericMeasurement = 0x1;
+ kLevelIndication = 0x2;
+ kMediumLevel = 0x4;
+ kCriticalLevel = 0x8;
+ kPeakMeasurement = 0x10;
+ kAverageMeasurement = 0x20;
+ }
+
+ readonly attribute nullable single measuredValue = 0;
+ readonly attribute nullable single minMeasuredValue = 1;
+ readonly attribute nullable single maxMeasuredValue = 2;
+ readonly attribute nullable single peakMeasuredValue = 3;
+ readonly attribute elapsed_s peakMeasuredValueWindow = 4;
+ readonly attribute nullable single averageMeasuredValue = 5;
+ readonly attribute elapsed_s averageMeasuredValueWindow = 6;
+ readonly attribute single uncertainty = 7;
+ readonly attribute MeasurementUnitEnum measurementUnit = 8;
+ readonly attribute MeasurementMediumEnum measurementMedium = 9;
+ readonly attribute LevelValueEnum levelValue = 10;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** Attributes for reporting PM2.5 concentration measurements */
+server cluster Pm25ConcentrationMeasurement = 1066 {
+ enum LevelValueEnum : enum8 {
+ kUnknown = 0;
+ kLow = 1;
+ kMedium = 2;
+ kHigh = 3;
+ kCritical = 4;
+ }
+
+ enum MeasurementMediumEnum : enum8 {
+ kAir = 0;
+ kWater = 1;
+ kSoil = 2;
+ }
+
+ enum MeasurementUnitEnum : enum8 {
+ kPPM = 0;
+ kPPB = 1;
+ kPPT = 2;
+ kMGM3 = 3;
+ kUGM3 = 4;
+ kNGM3 = 5;
+ kPM3 = 6;
+ kBQM3 = 7;
+ }
+
+ bitmap Feature : bitmap32 {
+ kNumericMeasurement = 0x1;
+ kLevelIndication = 0x2;
+ kMediumLevel = 0x4;
+ kCriticalLevel = 0x8;
+ kPeakMeasurement = 0x10;
+ kAverageMeasurement = 0x20;
+ }
+
+ readonly attribute nullable single measuredValue = 0;
+ readonly attribute nullable single minMeasuredValue = 1;
+ readonly attribute nullable single maxMeasuredValue = 2;
+ readonly attribute nullable single peakMeasuredValue = 3;
+ readonly attribute elapsed_s peakMeasuredValueWindow = 4;
+ readonly attribute nullable single averageMeasuredValue = 5;
+ readonly attribute elapsed_s averageMeasuredValueWindow = 6;
+ readonly attribute single uncertainty = 7;
+ readonly attribute MeasurementUnitEnum measurementUnit = 8;
+ readonly attribute MeasurementMediumEnum measurementMedium = 9;
+ readonly attribute LevelValueEnum levelValue = 10;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** Attributes for reporting formaldehyde concentration measurements */
+server cluster FormaldehydeConcentrationMeasurement = 1067 {
+ enum LevelValueEnum : enum8 {
+ kUnknown = 0;
+ kLow = 1;
+ kMedium = 2;
+ kHigh = 3;
+ kCritical = 4;
+ }
+
+ enum MeasurementMediumEnum : enum8 {
+ kAir = 0;
+ kWater = 1;
+ kSoil = 2;
+ }
+
+ enum MeasurementUnitEnum : enum8 {
+ kPPM = 0;
+ kPPB = 1;
+ kPPT = 2;
+ kMGM3 = 3;
+ kUGM3 = 4;
+ kNGM3 = 5;
+ kPM3 = 6;
+ kBQM3 = 7;
+ }
+
+ bitmap Feature : bitmap32 {
+ kNumericMeasurement = 0x1;
+ kLevelIndication = 0x2;
+ kMediumLevel = 0x4;
+ kCriticalLevel = 0x8;
+ kPeakMeasurement = 0x10;
+ kAverageMeasurement = 0x20;
+ }
+
+ readonly attribute nullable single measuredValue = 0;
+ readonly attribute nullable single minMeasuredValue = 1;
+ readonly attribute nullable single maxMeasuredValue = 2;
+ readonly attribute nullable single peakMeasuredValue = 3;
+ readonly attribute elapsed_s peakMeasuredValueWindow = 4;
+ readonly attribute nullable single averageMeasuredValue = 5;
+ readonly attribute elapsed_s averageMeasuredValueWindow = 6;
+ readonly attribute single uncertainty = 7;
+ readonly attribute MeasurementUnitEnum measurementUnit = 8;
+ readonly attribute MeasurementMediumEnum measurementMedium = 9;
+ readonly attribute LevelValueEnum levelValue = 10;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** Attributes for reporting PM1 concentration measurements */
+server cluster Pm1ConcentrationMeasurement = 1068 {
+ enum LevelValueEnum : enum8 {
+ kUnknown = 0;
+ kLow = 1;
+ kMedium = 2;
+ kHigh = 3;
+ kCritical = 4;
+ }
+
+ enum MeasurementMediumEnum : enum8 {
+ kAir = 0;
+ kWater = 1;
+ kSoil = 2;
+ }
+
+ enum MeasurementUnitEnum : enum8 {
+ kPPM = 0;
+ kPPB = 1;
+ kPPT = 2;
+ kMGM3 = 3;
+ kUGM3 = 4;
+ kNGM3 = 5;
+ kPM3 = 6;
+ kBQM3 = 7;
+ }
+
+ bitmap Feature : bitmap32 {
+ kNumericMeasurement = 0x1;
+ kLevelIndication = 0x2;
+ kMediumLevel = 0x4;
+ kCriticalLevel = 0x8;
+ kPeakMeasurement = 0x10;
+ kAverageMeasurement = 0x20;
+ }
+
+ readonly attribute nullable single measuredValue = 0;
+ readonly attribute nullable single minMeasuredValue = 1;
+ readonly attribute nullable single maxMeasuredValue = 2;
+ readonly attribute nullable single peakMeasuredValue = 3;
+ readonly attribute elapsed_s peakMeasuredValueWindow = 4;
+ readonly attribute nullable single averageMeasuredValue = 5;
+ readonly attribute elapsed_s averageMeasuredValueWindow = 6;
+ readonly attribute single uncertainty = 7;
+ readonly attribute MeasurementUnitEnum measurementUnit = 8;
+ readonly attribute MeasurementMediumEnum measurementMedium = 9;
+ readonly attribute LevelValueEnum levelValue = 10;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** Attributes for reporting PM10 concentration measurements */
+server cluster Pm10ConcentrationMeasurement = 1069 {
+ enum LevelValueEnum : enum8 {
+ kUnknown = 0;
+ kLow = 1;
+ kMedium = 2;
+ kHigh = 3;
+ kCritical = 4;
+ }
+
+ enum MeasurementMediumEnum : enum8 {
+ kAir = 0;
+ kWater = 1;
+ kSoil = 2;
+ }
+
+ enum MeasurementUnitEnum : enum8 {
+ kPPM = 0;
+ kPPB = 1;
+ kPPT = 2;
+ kMGM3 = 3;
+ kUGM3 = 4;
+ kNGM3 = 5;
+ kPM3 = 6;
+ kBQM3 = 7;
+ }
+
+ bitmap Feature : bitmap32 {
+ kNumericMeasurement = 0x1;
+ kLevelIndication = 0x2;
+ kMediumLevel = 0x4;
+ kCriticalLevel = 0x8;
+ kPeakMeasurement = 0x10;
+ kAverageMeasurement = 0x20;
+ }
+
+ readonly attribute nullable single measuredValue = 0;
+ readonly attribute nullable single minMeasuredValue = 1;
+ readonly attribute nullable single maxMeasuredValue = 2;
+ readonly attribute nullable single peakMeasuredValue = 3;
+ readonly attribute elapsed_s peakMeasuredValueWindow = 4;
+ readonly attribute nullable single averageMeasuredValue = 5;
+ readonly attribute elapsed_s averageMeasuredValueWindow = 6;
+ readonly attribute single uncertainty = 7;
+ readonly attribute MeasurementUnitEnum measurementUnit = 8;
+ readonly attribute MeasurementMediumEnum measurementMedium = 9;
+ readonly attribute LevelValueEnum levelValue = 10;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** Attributes for reporting total volatile organic compounds concentration measurements */
+server cluster TotalVolatileOrganicCompoundsConcentrationMeasurement = 1070 {
+ enum LevelValueEnum : enum8 {
+ kUnknown = 0;
+ kLow = 1;
+ kMedium = 2;
+ kHigh = 3;
+ kCritical = 4;
+ }
+
+ enum MeasurementMediumEnum : enum8 {
+ kAir = 0;
+ kWater = 1;
+ kSoil = 2;
+ }
+
+ enum MeasurementUnitEnum : enum8 {
+ kPPM = 0;
+ kPPB = 1;
+ kPPT = 2;
+ kMGM3 = 3;
+ kUGM3 = 4;
+ kNGM3 = 5;
+ kPM3 = 6;
+ kBQM3 = 7;
+ }
+
+ bitmap Feature : bitmap32 {
+ kNumericMeasurement = 0x1;
+ kLevelIndication = 0x2;
+ kMediumLevel = 0x4;
+ kCriticalLevel = 0x8;
+ kPeakMeasurement = 0x10;
+ kAverageMeasurement = 0x20;
+ }
+
+ readonly attribute nullable single measuredValue = 0;
+ readonly attribute nullable single minMeasuredValue = 1;
+ readonly attribute nullable single maxMeasuredValue = 2;
+ readonly attribute nullable single peakMeasuredValue = 3;
+ readonly attribute elapsed_s peakMeasuredValueWindow = 4;
+ readonly attribute nullable single averageMeasuredValue = 5;
+ readonly attribute elapsed_s averageMeasuredValueWindow = 6;
+ readonly attribute single uncertainty = 7;
+ readonly attribute MeasurementUnitEnum measurementUnit = 8;
+ readonly attribute MeasurementMediumEnum measurementMedium = 9;
+ readonly attribute LevelValueEnum levelValue = 10;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+/** Attributes for reporting radon concentration measurements */
+server cluster RadonConcentrationMeasurement = 1071 {
+ enum LevelValueEnum : enum8 {
+ kUnknown = 0;
+ kLow = 1;
+ kMedium = 2;
+ kHigh = 3;
+ kCritical = 4;
+ }
+
+ enum MeasurementMediumEnum : enum8 {
+ kAir = 0;
+ kWater = 1;
+ kSoil = 2;
+ }
+
+ enum MeasurementUnitEnum : enum8 {
+ kPPM = 0;
+ kPPB = 1;
+ kPPT = 2;
+ kMGM3 = 3;
+ kUGM3 = 4;
+ kNGM3 = 5;
+ kPM3 = 6;
+ kBQM3 = 7;
+ }
+
+ bitmap Feature : bitmap32 {
+ kNumericMeasurement = 0x1;
+ kLevelIndication = 0x2;
+ kMediumLevel = 0x4;
+ kCriticalLevel = 0x8;
+ kPeakMeasurement = 0x10;
+ kAverageMeasurement = 0x20;
+ }
+
+ readonly attribute nullable single measuredValue = 0;
+ readonly attribute nullable single minMeasuredValue = 1;
+ readonly attribute nullable single maxMeasuredValue = 2;
+ readonly attribute nullable single peakMeasuredValue = 3;
+ readonly attribute elapsed_s peakMeasuredValueWindow = 4;
+ readonly attribute nullable single averageMeasuredValue = 5;
+ readonly attribute elapsed_s averageMeasuredValueWindow = 6;
+ readonly attribute single uncertainty = 7;
+ readonly attribute MeasurementUnitEnum measurementUnit = 8;
+ readonly attribute MeasurementMediumEnum measurementMedium = 9;
+ readonly attribute LevelValueEnum levelValue = 10;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
+endpoint 0 {
+ device type ma_rootdevice = 22, version 1;
+
+ binding cluster OtaSoftwareUpdateProvider;
+
+ server cluster Descriptor {
+ callback attribute deviceTypeList;
+ callback attribute serverList;
+ callback attribute clientList;
+ callback attribute partsList;
+ ram attribute featureMap default = 0;
+ callback attribute clusterRevision default = 1;
+ }
+
+ server cluster AccessControl {
+ emits event AccessControlEntryChanged;
+ emits event AccessControlExtensionChanged;
+ callback attribute acl;
+ callback attribute extension;
+ callback attribute subjectsPerAccessControlEntry;
+ callback attribute targetsPerAccessControlEntry;
+ callback attribute accessControlEntriesPerFabric;
+ callback attribute attributeList;
+ ram attribute featureMap default = 0;
+ callback attribute clusterRevision default = 1;
+ }
+
+ server cluster BasicInformation {
+ emits event StartUp;
+ emits event ShutDown;
+ emits event Leave;
+ callback attribute dataModelRevision default = 10;
+ callback attribute vendorName;
+ callback attribute vendorID;
+ callback attribute productName;
+ callback attribute productID;
+ persist attribute nodeLabel;
+ callback attribute location default = "XX";
+ callback attribute hardwareVersion default = 0;
+ callback attribute hardwareVersionString;
+ callback attribute softwareVersion default = 0;
+ callback attribute softwareVersionString;
+ callback attribute manufacturingDate default = "20210614123456ZZ";
+ callback attribute partNumber;
+ callback attribute productURL;
+ callback attribute productLabel;
+ callback attribute serialNumber;
+ persist attribute localConfigDisabled default = 0;
+ callback attribute uniqueID;
+ callback attribute capabilityMinima;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 1;
+ }
+
+ server cluster OtaSoftwareUpdateRequestor {
+ emits event StateTransition;
+ emits event VersionApplied;
+ emits event DownloadError;
+ callback attribute defaultOTAProviders;
+ ram attribute updatePossible default = 1;
+ ram attribute updateState default = 0;
+ ram attribute updateStateProgress default = 0;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 1;
+
+ handle command AnnounceOTAProvider;
+ }
+
+ server cluster GeneralCommissioning {
+ ram attribute breadcrumb default = 0x0000000000000000;
+ callback attribute basicCommissioningInfo;
+ callback attribute regulatoryConfig default = 0;
+ callback attribute locationCapability default = 0;
+ callback attribute supportsConcurrentConnection default = 1;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 0x0001;
+
+ handle command ArmFailSafe;
+ handle command ArmFailSafeResponse;
+ handle command SetRegulatoryConfig;
+ handle command SetRegulatoryConfigResponse;
+ handle command CommissioningComplete;
+ handle command CommissioningCompleteResponse;
+ }
+
+ server cluster NetworkCommissioning {
+ ram attribute maxNetworks;
+ callback attribute networks;
+ ram attribute scanMaxTimeSeconds;
+ ram attribute connectMaxTimeSeconds;
+ ram attribute interfaceEnabled;
+ ram attribute lastNetworkingStatus;
+ ram attribute lastNetworkID;
+ ram attribute lastConnectErrorValue;
+ ram attribute featureMap default = 1;
+ ram attribute clusterRevision default = 0x0001;
+
+ handle command ScanNetworks;
+ handle command ScanNetworksResponse;
+ handle command AddOrUpdateWiFiNetwork;
+ handle command AddOrUpdateThreadNetwork;
+ handle command RemoveNetwork;
+ handle command NetworkConfigResponse;
+ handle command ConnectNetwork;
+ handle command ConnectNetworkResponse;
+ handle command ReorderNetwork;
+ }
+
+ server cluster DiagnosticLogs {
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 1;
+
+ handle command RetrieveLogsRequest;
+ }
+
+ server cluster GeneralDiagnostics {
+ emits event BootReason;
+ callback attribute networkInterfaces;
+ callback attribute rebootCount default = 0x0000;
+ callback attribute upTime default = 0x0000000000000000;
+ callback attribute totalOperationalHours default = 0x00000000;
+ callback attribute bootReason;
+ callback attribute activeHardwareFaults;
+ callback attribute activeRadioFaults;
+ callback attribute activeNetworkFaults;
+ callback attribute testEventTriggersEnabled default = false;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 0x0001;
+
+ handle command TestEventTrigger;
+ }
+
+ server cluster AdministratorCommissioning {
+ callback attribute windowStatus default = 0;
+ callback attribute adminFabricIndex default = 1;
+ callback attribute adminVendorId default = 0;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 0x0001;
+
+ handle command OpenCommissioningWindow;
+ handle command OpenBasicCommissioningWindow;
+ handle command RevokeCommissioning;
+ }
+
+ server cluster OperationalCredentials {
+ callback attribute NOCs;
+ callback attribute fabrics;
+ callback attribute supportedFabrics;
+ callback attribute commissionedFabrics;
+ callback attribute trustedRootCertificates;
+ callback attribute currentFabricIndex;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 0x0001;
+
+ handle command AttestationRequest;
+ handle command AttestationResponse;
+ handle command CertificateChainRequest;
+ handle command CertificateChainResponse;
+ handle command CSRRequest;
+ handle command CSRResponse;
+ handle command AddNOC;
+ handle command UpdateNOC;
+ handle command NOCResponse;
+ handle command UpdateFabricLabel;
+ handle command RemoveFabric;
+ handle command AddTrustedRootCertificate;
+ }
+
+ server cluster GroupKeyManagement {
+ callback attribute groupKeyMap;
+ callback attribute groupTable;
+ callback attribute maxGroupsPerFabric;
+ callback attribute maxGroupKeysPerFabric;
+ callback attribute featureMap default = 0;
+ callback attribute clusterRevision default = 1;
+
+ handle command KeySetWrite;
+ handle command KeySetRead;
+ handle command KeySetReadResponse;
+ handle command KeySetRemove;
+ handle command KeySetReadAllIndices;
+ handle command KeySetReadAllIndicesResponse;
+ }
+}
+endpoint 1 {
+ device type ma_air_purifier = 45, version 1;
+
+
+ server cluster Identify {
+ ram attribute identifyTime default = 0x0;
+ ram attribute identifyType default = 0x0;
+ callback attribute generatedCommandList default = 0;
+ callback attribute acceptedCommandList default = 0;
+ callback attribute eventList;
+ callback attribute attributeList default = 0;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 2;
+
+ handle command Identify;
+ handle command TriggerEffect;
+ }
+
+ server cluster Descriptor {
+ callback attribute deviceTypeList default = 0;
+ callback attribute serverList default = 0;
+ callback attribute clientList default = 0;
+ callback attribute partsList default = 0;
+ callback attribute generatedCommandList default = 0;
+ callback attribute acceptedCommandList default = 0;
+ callback attribute eventList;
+ callback attribute attributeList default = 0;
+ ram attribute featureMap default = 0;
+ callback attribute clusterRevision default = 1;
+ }
+
+ server cluster HepaFilterMonitoring {
+ callback attribute condition default = 100;
+ callback attribute degradationDirection default = 1;
+ callback attribute changeIndication default = 0;
+ callback attribute inPlaceIndicator default = 1;
+ callback attribute lastChangedTime;
+ callback attribute replacementProductList;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap default = 0;
+ ram attribute clusterRevision default = 1;
+
+ handle command ResetCondition;
+ }
+
+ server cluster ActivatedCarbonFilterMonitoring {
+ callback attribute condition default = 100;
+ callback attribute degradationDirection default = 1;
+ callback attribute changeIndication default = 0;
+ callback attribute inPlaceIndicator default = 1;
+ callback attribute lastChangedTime;
+ callback attribute replacementProductList;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap default = 0;
+ ram attribute clusterRevision default = 1;
+
+ handle command ResetCondition;
+ }
+
+ server cluster FanControl {
+ ram attribute fanMode default = 0;
+ ram attribute fanModeSequence default = 2;
+ ram attribute percentSetting default = 0;
+ ram attribute percentCurrent default = 0;
+ ram attribute speedMax default = 10;
+ ram attribute speedSetting default = 0;
+ ram attribute speedCurrent default = 0;
+ ram attribute rockSupport default = 0x01;
+ ram attribute rockSetting default = 0x00;
+ ram attribute windSupport default = 0x03;
+ ram attribute windSetting default = 0x00;
+ ram attribute airflowDirection default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ ram attribute featureMap default = 63;
+ ram attribute clusterRevision default = 4;
+
+ handle command Step;
+ }
+}
+endpoint 2 {
+ device type ma_air_quality_sensor = 44, version 1;
+
+
+ server cluster Identify {
+ ram attribute identifyTime default = 0x0;
+ ram attribute identifyType default = 0x00;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 4;
+
+ handle command Identify;
+ }
+
+ server cluster Descriptor {
+ callback attribute deviceTypeList;
+ callback attribute serverList;
+ callback attribute clientList;
+ callback attribute partsList;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ ram attribute featureMap default = 0;
+ callback attribute clusterRevision default = 1;
+ }
+
+ server cluster AirQuality {
+ callback attribute airQuality default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap default = 0;
+ ram attribute clusterRevision default = 1;
+ }
+
+ server cluster CarbonMonoxideConcentrationMeasurement {
+ callback attribute measuredValue;
+ callback attribute minMeasuredValue;
+ callback attribute maxMeasuredValue;
+ callback attribute peakMeasuredValue;
+ callback attribute peakMeasuredValueWindow default = 1;
+ callback attribute averageMeasuredValue;
+ callback attribute averageMeasuredValueWindow default = 1;
+ callback attribute uncertainty default = 0;
+ callback attribute measurementUnit default = 0;
+ callback attribute measurementMedium default = 0;
+ callback attribute levelValue default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap default = 0;
+ ram attribute clusterRevision default = 3;
+ }
+
+ server cluster CarbonDioxideConcentrationMeasurement {
+ callback attribute measuredValue;
+ callback attribute minMeasuredValue;
+ callback attribute maxMeasuredValue;
+ callback attribute peakMeasuredValue;
+ callback attribute peakMeasuredValueWindow default = 1;
+ callback attribute averageMeasuredValue;
+ callback attribute averageMeasuredValueWindow default = 1;
+ callback attribute uncertainty default = 0;
+ callback attribute measurementUnit default = 0;
+ callback attribute measurementMedium default = 0;
+ callback attribute levelValue default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap default = 0;
+ ram attribute clusterRevision default = 3;
+ }
+
+ server cluster NitrogenDioxideConcentrationMeasurement {
+ callback attribute measuredValue;
+ callback attribute minMeasuredValue;
+ callback attribute maxMeasuredValue;
+ callback attribute peakMeasuredValue;
+ callback attribute peakMeasuredValueWindow default = 1;
+ callback attribute averageMeasuredValue;
+ callback attribute averageMeasuredValueWindow default = 1;
+ callback attribute uncertainty default = 0;
+ callback attribute measurementUnit default = 0;
+ callback attribute measurementMedium default = 0;
+ callback attribute levelValue default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap default = 0;
+ ram attribute clusterRevision default = 3;
+ }
+
+ server cluster OzoneConcentrationMeasurement {
+ callback attribute measuredValue;
+ callback attribute minMeasuredValue;
+ callback attribute maxMeasuredValue;
+ callback attribute peakMeasuredValue;
+ callback attribute peakMeasuredValueWindow default = 1;
+ callback attribute averageMeasuredValue;
+ callback attribute averageMeasuredValueWindow default = 1;
+ callback attribute uncertainty default = 0;
+ callback attribute measurementUnit default = 0;
+ callback attribute measurementMedium default = 0;
+ callback attribute levelValue default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap default = 0;
+ ram attribute clusterRevision default = 3;
+ }
+
+ server cluster Pm25ConcentrationMeasurement {
+ callback attribute measuredValue;
+ callback attribute minMeasuredValue;
+ callback attribute maxMeasuredValue;
+ callback attribute peakMeasuredValue;
+ callback attribute peakMeasuredValueWindow default = 1;
+ callback attribute averageMeasuredValue;
+ callback attribute averageMeasuredValueWindow default = 1;
+ callback attribute uncertainty default = 0;
+ callback attribute measurementUnit default = 0;
+ callback attribute measurementMedium default = 0;
+ callback attribute levelValue default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap default = 0;
+ ram attribute clusterRevision default = 3;
+ }
+
+ server cluster FormaldehydeConcentrationMeasurement {
+ callback attribute measuredValue;
+ callback attribute minMeasuredValue;
+ callback attribute maxMeasuredValue;
+ callback attribute peakMeasuredValue;
+ callback attribute peakMeasuredValueWindow default = 1;
+ callback attribute averageMeasuredValue;
+ callback attribute averageMeasuredValueWindow default = 1;
+ callback attribute uncertainty default = 0;
+ callback attribute measurementUnit default = 0;
+ callback attribute measurementMedium default = 0;
+ callback attribute levelValue default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap default = 0;
+ ram attribute clusterRevision default = 3;
+ }
+
+ server cluster Pm1ConcentrationMeasurement {
+ callback attribute measuredValue;
+ callback attribute minMeasuredValue;
+ callback attribute maxMeasuredValue;
+ callback attribute peakMeasuredValue;
+ callback attribute peakMeasuredValueWindow default = 1;
+ callback attribute averageMeasuredValue;
+ callback attribute averageMeasuredValueWindow default = 1;
+ callback attribute uncertainty default = 0;
+ callback attribute measurementUnit default = 0;
+ callback attribute measurementMedium default = 0;
+ callback attribute levelValue default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap default = 0;
+ ram attribute clusterRevision default = 3;
+ }
+
+ server cluster Pm10ConcentrationMeasurement {
+ callback attribute measuredValue;
+ callback attribute minMeasuredValue;
+ callback attribute maxMeasuredValue;
+ callback attribute peakMeasuredValue;
+ callback attribute peakMeasuredValueWindow default = 1;
+ callback attribute averageMeasuredValue;
+ callback attribute averageMeasuredValueWindow default = 1;
+ callback attribute uncertainty default = 0;
+ callback attribute measurementUnit default = 0;
+ callback attribute measurementMedium default = 0;
+ callback attribute levelValue default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap default = 0;
+ ram attribute clusterRevision default = 3;
+ }
+
+ server cluster TotalVolatileOrganicCompoundsConcentrationMeasurement {
+ callback attribute measuredValue;
+ callback attribute minMeasuredValue;
+ callback attribute maxMeasuredValue;
+ callback attribute peakMeasuredValue;
+ callback attribute peakMeasuredValueWindow default = 1;
+ callback attribute averageMeasuredValue;
+ callback attribute averageMeasuredValueWindow default = 1;
+ callback attribute uncertainty default = 0;
+ callback attribute measurementUnit default = 0;
+ callback attribute measurementMedium default = 0;
+ callback attribute levelValue default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap default = 0;
+ ram attribute clusterRevision default = 3;
+ }
+
+ server cluster RadonConcentrationMeasurement {
+ callback attribute measuredValue;
+ callback attribute minMeasuredValue;
+ callback attribute maxMeasuredValue;
+ callback attribute peakMeasuredValue;
+ callback attribute peakMeasuredValueWindow default = 1;
+ callback attribute averageMeasuredValue;
+ callback attribute averageMeasuredValueWindow default = 1;
+ callback attribute uncertainty default = 0;
+ callback attribute measurementUnit default = 0;
+ callback attribute measurementMedium default = 0;
+ callback attribute levelValue default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap default = 0;
+ ram attribute clusterRevision default = 3;
+ }
+}
+endpoint 3 {
+ device type ma_tempsensor = 770, version 1;
+
+
+ server cluster Identify {
+ ram attribute identifyTime default = 0x0;
+ ram attribute identifyType default = 0x00;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ 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 generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ ram attribute featureMap default = 0;
+ callback attribute clusterRevision default = 1;
+ }
+
+ server cluster TemperatureMeasurement {
+ ram attribute measuredValue default = 0x8000;
+ ram attribute minMeasuredValue default = 0x8000;
+ ram attribute maxMeasuredValue default = 0x8000;
+ ram attribute tolerance default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 4;
+ }
+}
+endpoint 4 {
+ device type ma_humiditysensor = 775, version 1;
+
+
+ server cluster Identify {
+ ram attribute identifyTime default = 0x0;
+ ram attribute identifyType default = 0x00;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ 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 generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ ram attribute featureMap default = 0;
+ callback attribute clusterRevision default = 1;
+ }
+
+ server cluster RelativeHumidityMeasurement {
+ ram attribute measuredValue default = 0;
+ ram attribute minMeasuredValue default = 0;
+ ram attribute maxMeasuredValue default = 0x2710;
+ ram attribute tolerance;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 3;
+ }
+}
+
+
diff --git a/examples/air-purifier-app/air-purifier-common/air-purifier-app.zap b/examples/air-purifier-app/air-purifier-common/air-purifier-app.zap
new file mode 100644
index 00000000000000..c1f47b4d162a51
--- /dev/null
+++ b/examples/air-purifier-app/air-purifier-common/air-purifier-app.zap
@@ -0,0 +1,7548 @@
+{
+ "fileFormat": 2,
+ "featureLevel": 99,
+ "creator": "zap",
+ "keyValuePairs": [
+ {
+ "key": "commandDiscovery",
+ "value": "1"
+ },
+ {
+ "key": "defaultResponsePolicy",
+ "value": "always"
+ },
+ {
+ "key": "manufacturerCodes",
+ "value": "0x1002"
+ }
+ ],
+ "package": [
+ {
+ "pathRelativity": "relativeToZap",
+ "path": "../../../src/app/zap-templates/zcl/zcl.json",
+ "type": "zcl-properties",
+ "category": "matter",
+ "version": 1,
+ "description": "Matter SDK ZCL data"
+ },
+ {
+ "pathRelativity": "relativeToZap",
+ "path": "../../../src/app/zap-templates/app-templates.json",
+ "type": "gen-templates-json",
+ "version": "chip-v1"
+ }
+ ],
+ "endpointTypes": [
+ {
+ "id": 1,
+ "name": "MA-rootdevice",
+ "deviceTypeRef": {
+ "code": 22,
+ "profileId": 259,
+ "label": "MA-rootdevice",
+ "name": "MA-rootdevice"
+ },
+ "deviceTypes": [
+ {
+ "code": 22,
+ "profileId": 259,
+ "label": "MA-rootdevice",
+ "name": "MA-rootdevice"
+ }
+ ],
+ "deviceVersions": [
+ 1
+ ],
+ "deviceIdentifiers": [
+ 22
+ ],
+ "deviceTypeName": "MA-rootdevice",
+ "deviceTypeCode": 22,
+ "deviceTypeProfileId": 259,
+ "clusters": [
+ {
+ "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": "",
+ "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": "",
+ "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": "",
+ "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": "",
+ "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": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Access Control",
+ "code": 31,
+ "mfgCode": null,
+ "define": "ACCESS_CONTROL_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "ACL",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Extension",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "SubjectsPerAccessControlEntry",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "TargetsPerAccessControlEntry",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AccessControlEntriesPerFabric",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "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": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ],
+ "events": [
+ {
+ "name": "AccessControlEntryChanged",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ },
+ {
+ "name": "AccessControlExtensionChanged",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ }
+ ]
+ },
+ {
+ "name": "Basic Information",
+ "code": 40,
+ "mfgCode": null,
+ "define": "BASIC_INFORMATION_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "DataModelRevision",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "10",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "VendorName",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "char_string",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "VendorID",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "vendor_id",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "ProductName",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "char_string",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "ProductID",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "NodeLabel",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "char_string",
+ "included": 1,
+ "storageOption": "NVM",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "Location",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "char_string",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "XX",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "HardwareVersion",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "HardwareVersionString",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "char_string",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "SoftwareVersion",
+ "code": 9,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int32u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "SoftwareVersionString",
+ "code": 10,
+ "mfgCode": null,
+ "side": "server",
+ "type": "char_string",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "ManufacturingDate",
+ "code": 11,
+ "mfgCode": null,
+ "side": "server",
+ "type": "char_string",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "20210614123456ZZ",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "PartNumber",
+ "code": 12,
+ "mfgCode": null,
+ "side": "server",
+ "type": "char_string",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "ProductURL",
+ "code": 13,
+ "mfgCode": null,
+ "side": "server",
+ "type": "long_char_string",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "ProductLabel",
+ "code": 14,
+ "mfgCode": null,
+ "side": "server",
+ "type": "char_string",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "SerialNumber",
+ "code": 15,
+ "mfgCode": null,
+ "side": "server",
+ "type": "char_string",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "LocalConfigDisabled",
+ "code": 16,
+ "mfgCode": null,
+ "side": "server",
+ "type": "boolean",
+ "included": 1,
+ "storageOption": "NVM",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "UniqueID",
+ "code": 18,
+ "mfgCode": null,
+ "side": "server",
+ "type": "char_string",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "CapabilityMinima",
+ "code": 19,
+ "mfgCode": null,
+ "side": "server",
+ "type": "CapabilityMinimaStruct",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 1,
+ "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": 1,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ }
+ ],
+ "events": [
+ {
+ "name": "StartUp",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ },
+ {
+ "name": "ShutDown",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ },
+ {
+ "name": "Leave",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ }
+ ]
+ },
+ {
+ "name": "OTA Software Update Provider",
+ "code": 41,
+ "mfgCode": null,
+ "define": "OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER",
+ "side": "client",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "QueryImage",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 0,
+ "isEnabled": 1
+ },
+ {
+ "name": "QueryImageResponse",
+ "code": 1,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "ApplyUpdateRequest",
+ "code": 2,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 0,
+ "isEnabled": 1
+ },
+ {
+ "name": "ApplyUpdateResponse",
+ "code": 3,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "NotifyUpdateApplied",
+ "code": 4,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 0,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "ClusterRevision",
+ "code": 65533,
+ "mfgCode": null,
+ "side": "client",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x0001",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "OTA Software Update Requestor",
+ "code": 42,
+ "mfgCode": null,
+ "define": "OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "AnnounceOTAProvider",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "DefaultOTAProviders",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "UpdatePossible",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "boolean",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "UpdateState",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "UpdateStateEnum",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "UpdateStateProgress",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ }
+ ],
+ "events": [
+ {
+ "name": "StateTransition",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ },
+ {
+ "name": "VersionApplied",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ },
+ {
+ "name": "DownloadError",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ }
+ ]
+ },
+ {
+ "name": "General Commissioning",
+ "code": 48,
+ "mfgCode": null,
+ "define": "GENERAL_COMMISSIONING_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "ArmFailSafe",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "ArmFailSafeResponse",
+ "code": 1,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 0,
+ "isEnabled": 1
+ },
+ {
+ "name": "SetRegulatoryConfig",
+ "code": 2,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "SetRegulatoryConfigResponse",
+ "code": 3,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 0,
+ "isEnabled": 1
+ },
+ {
+ "name": "CommissioningComplete",
+ "code": 4,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "CommissioningCompleteResponse",
+ "code": 5,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 0,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "Breadcrumb",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int64u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x0000000000000000",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "BasicCommissioningInfo",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "BasicCommissioningInfo",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "RegulatoryConfig",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "RegulatoryLocationTypeEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LocationCapability",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "RegulatoryLocationTypeEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "SupportsConcurrentConnection",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "boolean",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "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": "0x0001",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Network Commissioning",
+ "code": 49,
+ "mfgCode": null,
+ "define": "NETWORK_COMMISSIONING_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "ScanNetworks",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "ScanNetworksResponse",
+ "code": 1,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 0,
+ "isEnabled": 1
+ },
+ {
+ "name": "AddOrUpdateWiFiNetwork",
+ "code": 2,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "AddOrUpdateThreadNetwork",
+ "code": 3,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "RemoveNetwork",
+ "code": 4,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "NetworkConfigResponse",
+ "code": 5,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 0,
+ "isEnabled": 1
+ },
+ {
+ "name": "ConnectNetwork",
+ "code": 6,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "ConnectNetworkResponse",
+ "code": 7,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 0,
+ "isEnabled": 1
+ },
+ {
+ "name": "ReorderNetwork",
+ "code": 8,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "MaxNetworks",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Networks",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ScanMaxTimeSeconds",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ConnectMaxTimeSeconds",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "InterfaceEnabled",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "boolean",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LastNetworkingStatus",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "NetworkCommissioningStatusEnum",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LastNetworkID",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "octet_string",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LastConnectErrorValue",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int32s",
+ "included": 1,
+ "storageOption": "RAM",
+ "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": "1",
+ "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": "0x0001",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Diagnostic Logs",
+ "code": 50,
+ "mfgCode": null,
+ "define": "DIAGNOSTIC_LOGS_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "RetrieveLogsRequest",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "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
+ }
+ ]
+ },
+ {
+ "name": "General Diagnostics",
+ "code": 51,
+ "mfgCode": null,
+ "define": "GENERAL_DIAGNOSTICS_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "TestEventTrigger",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "NetworkInterfaces",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "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": "0x0000",
+ "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": "0x0000000000000000",
+ "reportable": 1,
+ "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": "0x00000000",
+ "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": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ActiveHardwareFaults",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ActiveRadioFaults",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ActiveNetworkFaults",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "TestEventTriggersEnabled",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "boolean",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "false",
+ "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": "0x0001",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ }
+ ],
+ "events": [
+ {
+ "name": "BootReason",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ }
+ ]
+ },
+ {
+ "name": "Administrator Commissioning",
+ "code": 60,
+ "mfgCode": null,
+ "define": "ADMINISTRATOR_COMMISSIONING_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "OpenCommissioningWindow",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "OpenBasicCommissioningWindow",
+ "code": 1,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "RevokeCommissioning",
+ "code": 2,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "WindowStatus",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "CommissioningWindowStatusEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AdminFabricIndex",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "fabric_idx",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AdminVendorId",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "vendor_id",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "0x0001",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Operational Credentials",
+ "code": 62,
+ "mfgCode": null,
+ "define": "OPERATIONAL_CREDENTIALS_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "AttestationRequest",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "AttestationResponse",
+ "code": 1,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 0,
+ "isEnabled": 1
+ },
+ {
+ "name": "CertificateChainRequest",
+ "code": 2,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "CertificateChainResponse",
+ "code": 3,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 0,
+ "isEnabled": 1
+ },
+ {
+ "name": "CSRRequest",
+ "code": 4,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "CSRResponse",
+ "code": 5,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 0,
+ "isEnabled": 1
+ },
+ {
+ "name": "AddNOC",
+ "code": 6,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "UpdateNOC",
+ "code": 7,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "NOCResponse",
+ "code": 8,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 0,
+ "isEnabled": 1
+ },
+ {
+ "name": "UpdateFabricLabel",
+ "code": 9,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "RemoveFabric",
+ "code": 10,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "AddTrustedRootCertificate",
+ "code": 11,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "NOCs",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Fabrics",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "SupportedFabrics",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "CommissionedFabrics",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "TrustedRootCertificates",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ },
+ {
+ "name": "CurrentFabricIndex",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "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": "0x0001",
+ "reportable": 1,
+ "minInterval": 0,
+ "maxInterval": 65344,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Group Key Management",
+ "code": 63,
+ "mfgCode": null,
+ "define": "GROUP_KEY_MANAGEMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "KeySetWrite",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "KeySetRead",
+ "code": 1,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "KeySetReadResponse",
+ "code": 2,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 0,
+ "isEnabled": 1
+ },
+ {
+ "name": "KeySetRemove",
+ "code": 3,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "KeySetReadAllIndices",
+ "code": 4,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "KeySetReadAllIndicesResponse",
+ "code": 5,
+ "mfgCode": null,
+ "source": "server",
+ "isIncoming": 0,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "GroupKeyMap",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "GroupTable",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxGroupsPerFabric",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxGroupKeysPerFabric",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "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": "External",
+ "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": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "name": "Anonymous Endpoint Type",
+ "deviceTypeRef": {
+ "code": 45,
+ "profileId": 259,
+ "label": "MA-air-purifier",
+ "name": "MA-air-purifier"
+ },
+ "deviceTypes": [
+ {
+ "code": 45,
+ "profileId": 259,
+ "label": "MA-air-purifier",
+ "name": "MA-air-purifier"
+ }
+ ],
+ "deviceVersions": [
+ 1
+ ],
+ "deviceIdentifiers": [
+ 45
+ ],
+ "deviceTypeName": "MA-air-purifier",
+ "deviceTypeCode": 45,
+ "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": "0x0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "IdentifyType",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "IdentifyTypeEnum",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x0",
+ "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": "0",
+ "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": "0",
+ "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": "0",
+ "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": "2",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "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": "0",
+ "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": "0",
+ "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": "0",
+ "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": "0",
+ "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": "0",
+ "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": "0",
+ "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": "0",
+ "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": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "HEPA Filter Monitoring",
+ "code": 113,
+ "mfgCode": null,
+ "define": "HEPA_FILTER_MONITORING_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "ResetCondition",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "Condition",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "percent",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "100",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "DegradationDirection",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "DegradationDirectionEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ChangeIndication",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "ChangeIndicationEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "InPlaceIndicator",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "boolean",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LastChangedTime",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "epoch_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ReplacementProductList",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "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
+ }
+ ]
+ },
+ {
+ "name": "Activated Carbon Filter Monitoring",
+ "code": 114,
+ "mfgCode": null,
+ "define": "ACTIVATED_CARBON_FILTER_MONITORING_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "ResetCondition",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "Condition",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "percent",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "100",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "DegradationDirection",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "DegradationDirectionEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ChangeIndication",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "ChangeIndicationEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "InPlaceIndicator",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "boolean",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LastChangedTime",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "epoch_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ReplacementProductList",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "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
+ }
+ ]
+ },
+ {
+ "name": "Fan Control",
+ "code": 514,
+ "mfgCode": null,
+ "define": "FAN_CONTROL_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "apiMaturity": "provisional",
+ "commands": [
+ {
+ "name": "Step",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "FanMode",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "FanModeEnum",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "FanModeSequence",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "FanModeSequenceEnum",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "2",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PercentSetting",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "percent",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PercentCurrent",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "percent",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "SpeedMax",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "10",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "SpeedSetting",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "SpeedCurrent",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "RockSupport",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "RockBitmap",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x01",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "RockSetting",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "RockBitmap",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x00",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "WindSupport",
+ "code": 9,
+ "mfgCode": null,
+ "side": "server",
+ "type": "WindBitmap",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x03",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "WindSetting",
+ "code": 10,
+ "mfgCode": null,
+ "side": "server",
+ "type": "WindBitmap",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x00",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AirflowDirection",
+ "code": 11,
+ "mfgCode": null,
+ "side": "server",
+ "type": "AirflowDirectionEnum",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "63",
+ "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": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "name": "Anonymous Endpoint Type",
+ "deviceTypeRef": {
+ "code": 44,
+ "profileId": 259,
+ "label": "MA-air-quality-sensor",
+ "name": "MA-air-quality-sensor"
+ },
+ "deviceTypes": [
+ {
+ "code": 44,
+ "profileId": 259,
+ "label": "MA-air-quality-sensor",
+ "name": "MA-air-quality-sensor"
+ }
+ ],
+ "deviceVersions": [
+ 1
+ ],
+ "deviceIdentifiers": [
+ 44
+ ],
+ "deviceTypeName": "MA-air-quality-sensor",
+ "deviceTypeCode": 44,
+ "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
+ }
+ ],
+ "attributes": [
+ {
+ "name": "IdentifyTime",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "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": "",
+ "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,
+ "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": 1,
+ "maxInterval": 65534,
+ "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": "",
+ "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": "",
+ "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": "",
+ "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": "",
+ "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": "",
+ "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,
+ "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": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Air Quality",
+ "code": 91,
+ "mfgCode": null,
+ "define": "AIR_QUALITY_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "AirQuality",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "AirQualityEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "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
+ }
+ ]
+ },
+ {
+ "name": "Carbon Monoxide Concentration Measurement",
+ "code": 1036,
+ "mfgCode": null,
+ "define": "CARBON_MONOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "MeasuredValue",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MinMeasuredValue",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxMeasuredValue",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValue",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValueWindow",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValue",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValueWindow",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Uncertainty",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementUnit",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementUnitEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementMedium",
+ "code": 9,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementMediumEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LevelValue",
+ "code": 10,
+ "mfgCode": null,
+ "side": "server",
+ "type": "LevelValueEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "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": "3",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Carbon Dioxide Concentration Measurement",
+ "code": 1037,
+ "mfgCode": null,
+ "define": "CARBON_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "MeasuredValue",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MinMeasuredValue",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxMeasuredValue",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValue",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValueWindow",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValue",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValueWindow",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Uncertainty",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementUnit",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementUnitEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementMedium",
+ "code": 9,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementMediumEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LevelValue",
+ "code": 10,
+ "mfgCode": null,
+ "side": "server",
+ "type": "LevelValueEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "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": "3",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Nitrogen Dioxide Concentration Measurement",
+ "code": 1043,
+ "mfgCode": null,
+ "define": "NITROGEN_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "MeasuredValue",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MinMeasuredValue",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxMeasuredValue",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValue",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValueWindow",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValue",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValueWindow",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Uncertainty",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementUnit",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementUnitEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementMedium",
+ "code": 9,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementMediumEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LevelValue",
+ "code": 10,
+ "mfgCode": null,
+ "side": "server",
+ "type": "LevelValueEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "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": "3",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Ozone Concentration Measurement",
+ "code": 1045,
+ "mfgCode": null,
+ "define": "OZONE_CONCENTRATION_MEASUREMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "MeasuredValue",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MinMeasuredValue",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxMeasuredValue",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValue",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValueWindow",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValue",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValueWindow",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Uncertainty",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementUnit",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementUnitEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementMedium",
+ "code": 9,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementMediumEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LevelValue",
+ "code": 10,
+ "mfgCode": null,
+ "side": "server",
+ "type": "LevelValueEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "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": "3",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "PM2.5 Concentration Measurement",
+ "code": 1066,
+ "mfgCode": null,
+ "define": "PM2_5_CONCENTRATION_MEASUREMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "MeasuredValue",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MinMeasuredValue",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxMeasuredValue",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValue",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValueWindow",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValue",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValueWindow",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Uncertainty",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementUnit",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementUnitEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementMedium",
+ "code": 9,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementMediumEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LevelValue",
+ "code": 10,
+ "mfgCode": null,
+ "side": "server",
+ "type": "LevelValueEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "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": "3",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Formaldehyde Concentration Measurement",
+ "code": 1067,
+ "mfgCode": null,
+ "define": "FORMALDEHYDE_CONCENTRATION_MEASUREMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "MeasuredValue",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MinMeasuredValue",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxMeasuredValue",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValue",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValueWindow",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValue",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValueWindow",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Uncertainty",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementUnit",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementUnitEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementMedium",
+ "code": 9,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementMediumEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LevelValue",
+ "code": 10,
+ "mfgCode": null,
+ "side": "server",
+ "type": "LevelValueEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "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": "3",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "PM1 Concentration Measurement",
+ "code": 1068,
+ "mfgCode": null,
+ "define": "PM1_CONCENTRATION_MEASUREMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "MeasuredValue",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MinMeasuredValue",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxMeasuredValue",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValue",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValueWindow",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValue",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValueWindow",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Uncertainty",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementUnit",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementUnitEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementMedium",
+ "code": 9,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementMediumEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LevelValue",
+ "code": 10,
+ "mfgCode": null,
+ "side": "server",
+ "type": "LevelValueEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "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": "3",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "PM10 Concentration Measurement",
+ "code": 1069,
+ "mfgCode": null,
+ "define": "PM10_CONCENTRATION_MEASUREMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "MeasuredValue",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MinMeasuredValue",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxMeasuredValue",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValue",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValueWindow",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValue",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValueWindow",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Uncertainty",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementUnit",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementUnitEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementMedium",
+ "code": 9,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementMediumEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LevelValue",
+ "code": 10,
+ "mfgCode": null,
+ "side": "server",
+ "type": "LevelValueEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "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": "3",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Total Volatile Organic Compounds Concentration Measurement",
+ "code": 1070,
+ "mfgCode": null,
+ "define": "TVOC_CONCENTRATION_MEASUREMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "MeasuredValue",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MinMeasuredValue",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxMeasuredValue",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValue",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValueWindow",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValue",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValueWindow",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Uncertainty",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementUnit",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementUnitEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementMedium",
+ "code": 9,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementMediumEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LevelValue",
+ "code": 10,
+ "mfgCode": null,
+ "side": "server",
+ "type": "LevelValueEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "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": "3",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Radon Concentration Measurement",
+ "code": 1071,
+ "mfgCode": null,
+ "define": "RADON_CONCENTRATION_MEASUREMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "MeasuredValue",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MinMeasuredValue",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxMeasuredValue",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValue",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PeakMeasuredValueWindow",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValue",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AverageMeasuredValueWindow",
+ "code": 6,
+ "mfgCode": null,
+ "side": "server",
+ "type": "elapsed_s",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Uncertainty",
+ "code": 7,
+ "mfgCode": null,
+ "side": "server",
+ "type": "single",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementUnit",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementUnitEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MeasurementMedium",
+ "code": 9,
+ "mfgCode": null,
+ "side": "server",
+ "type": "MeasurementMediumEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "LevelValue",
+ "code": 10,
+ "mfgCode": null,
+ "side": "server",
+ "type": "LevelValueEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "",
+ "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,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "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": "3",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "name": "Anonymous Endpoint Type",
+ "deviceTypeRef": {
+ "code": 770,
+ "profileId": 259,
+ "label": "MA-tempsensor",
+ "name": "MA-tempsensor"
+ },
+ "deviceTypes": [
+ {
+ "code": 770,
+ "profileId": 259,
+ "label": "MA-tempsensor",
+ "name": "MA-tempsensor"
+ }
+ ],
+ "deviceVersions": [
+ 1
+ ],
+ "deviceIdentifiers": [
+ 770
+ ],
+ "deviceTypeName": "MA-tempsensor",
+ "deviceTypeCode": 770,
+ "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": "0x0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "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": "",
+ "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,
+ "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": 1,
+ "maxInterval": 65534,
+ "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": "",
+ "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": "",
+ "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": "",
+ "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": "",
+ "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": "",
+ "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,
+ "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": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Temperature Measurement",
+ "code": 1026,
+ "mfgCode": null,
+ "define": "TEMPERATURE_MEASUREMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "MeasuredValue",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16s",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x8000",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MinMeasuredValue",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16s",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x8000",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxMeasuredValue",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16s",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x8000",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Tolerance",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "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": "",
+ "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,
+ "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": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": 5,
+ "name": "Anonymous Endpoint Type",
+ "deviceTypeRef": {
+ "code": 775,
+ "profileId": 259,
+ "label": "MA-humiditysensor",
+ "name": "MA-humiditysensor"
+ },
+ "deviceTypes": [
+ {
+ "code": 775,
+ "profileId": 259,
+ "label": "MA-humiditysensor",
+ "name": "MA-humiditysensor"
+ }
+ ],
+ "deviceVersions": [
+ 1
+ ],
+ "deviceIdentifiers": [
+ 775
+ ],
+ "deviceTypeName": "MA-humiditysensor",
+ "deviceTypeCode": 775,
+ "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": "0x0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "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": "",
+ "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,
+ "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": 1,
+ "maxInterval": 65534,
+ "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": "",
+ "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": "",
+ "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": "",
+ "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": "",
+ "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": "",
+ "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,
+ "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": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Relative Humidity Measurement",
+ "code": 1029,
+ "mfgCode": null,
+ "define": "RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "MeasuredValue",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MinMeasuredValue",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxMeasuredValue",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x2710",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Tolerance",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "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": "",
+ "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,
+ "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": "3",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "endpoints": [
+ {
+ "endpointTypeName": "MA-rootdevice",
+ "endpointTypeIndex": 0,
+ "profileId": 259,
+ "endpointId": 0,
+ "networkId": 0
+ },
+ {
+ "endpointTypeName": "Anonymous Endpoint Type",
+ "endpointTypeIndex": 1,
+ "profileId": 259,
+ "endpointId": 1,
+ "networkId": 0
+ },
+ {
+ "endpointTypeName": "Anonymous Endpoint Type",
+ "endpointTypeIndex": 2,
+ "profileId": 259,
+ "endpointId": 2,
+ "networkId": 0
+ },
+ {
+ "endpointTypeName": "Anonymous Endpoint Type",
+ "endpointTypeIndex": 3,
+ "profileId": 259,
+ "endpointId": 3,
+ "networkId": 0
+ },
+ {
+ "endpointTypeName": "Anonymous Endpoint Type",
+ "endpointTypeIndex": 4,
+ "profileId": 259,
+ "endpointId": 4,
+ "networkId": 0
+ }
+ ],
+ "log": []
+}
\ No newline at end of file
diff --git a/examples/air-purifier-app/air-purifier-common/include/DeviceManager.h b/examples/air-purifier-app/air-purifier-common/include/DeviceManager.h
new file mode 100644
index 00000000000000..96935feb4b4448
--- /dev/null
+++ b/examples/air-purifier-app/air-purifier-common/include/DeviceManager.h
@@ -0,0 +1,51 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include
+#include
+#include
+
+namespace chip {
+namespace DeviceManager {
+
+/**
+ * @brief
+ * This class provides a skeleton for all the callback functions. The functions will be
+ * called by other objects within the CHIP stack for specific events.
+ * Applications interested in receiving specific callbacks can specialize this class and handle
+ * these events in their implementation of this class.
+ */
+class DeviceManagerCallbacks
+{
+public:
+ virtual void PostAttributeChangeCallback(EndpointId endpoint, ClusterId clusterId, AttributeId attributeId, uint8_t type,
+ uint16_t size, uint8_t * value){};
+
+ Protocols::InteractionModel::Status PreAttributeChangeCallback(EndpointId endpoint, ClusterId clusterId,
+ AttributeId attributeId, uint8_t type, uint16_t size,
+ uint8_t * value)
+ {
+ return Protocols::InteractionModel::Status::Success;
+ };
+
+ virtual ~DeviceManagerCallbacks(){};
+};
+
+} // namespace DeviceManager
+} // namespace chip
diff --git a/examples/air-purifier-app/air-purifier-common/include/air-purifier-manager.h b/examples/air-purifier-app/air-purifier-common/include/air-purifier-manager.h
new file mode 100644
index 00000000000000..81565d532e4e7e
--- /dev/null
+++ b/examples/air-purifier-app/air-purifier-common/include/air-purifier-manager.h
@@ -0,0 +1,162 @@
+/*
+ *
+ * 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
+#include
+#include
+#include
+#include
+#include
+
+#pragma once
+
+namespace chip {
+namespace app {
+namespace Clusters {
+
+constexpr std::bitset<4> gHepaFilterFeatureMap{ static_cast(ResourceMonitoring::Feature::kCondition) |
+ static_cast(ResourceMonitoring::Feature::kWarning) |
+ static_cast(ResourceMonitoring::Feature::kReplacementProductList) };
+
+constexpr std::bitset<4> gActivatedCarbonFeatureMap{ static_cast(ResourceMonitoring::Feature::kCondition) |
+ static_cast(ResourceMonitoring::Feature::kWarning) |
+ static_cast(ResourceMonitoring::Feature::kReplacementProductList) };
+
+/**
+ * @brief
+ * This class provides a singleton AIr Purifier Manager which also implements the FanControl::Delegate and the Device Callbacks.
+ * The class is responsible for all Air Purifier Elements on the Air Purifier Endpoint and it has members that are other Managers
+ * for the devices in its composition tree.
+ */
+class AirPurifierManager : public FanControl::Delegate, public DeviceManager::DeviceManagerCallbacks
+{
+public:
+ // Delete copy constructor and assignment operator.
+ AirPurifierManager(const AirPurifierManager &) = delete;
+ AirPurifierManager(const AirPurifierManager &&) = delete;
+ AirPurifierManager & operator=(const AirPurifierManager &) = delete;
+
+ static void InitInstance(EndpointId aEndpointId = 1, EndpointId aAirQualitySensorEndpointId = 2,
+ EndpointId aTemperatureSensorEndpointId = 3, EndpointId aHumiditySensorEndpointId = 4)
+ {
+ if (mInstance == nullptr)
+ {
+ mInstance = new AirPurifierManager(aEndpointId, aAirQualitySensorEndpointId, aTemperatureSensorEndpointId,
+ aHumiditySensorEndpointId);
+ mInstance->Init();
+ }
+ };
+
+ /**
+ * @brief Get an Air Purifier Manager object - this class acts as a singleton device manager for the air purifier
+ * @param[in] aEndpointId Endpoint that the air purifier is on
+ * @param[in] aAirQualitySensorEndpointId Endpoint that the air quality sensor is on
+ * @param[in] aTemperatureSensorEndpointId Endpoint that the temperature sensor is on
+ * @param[in] aHumiditySensorEndpointId Endpoint that the humidity sensor is on
+ * @return mInstance The AirPurifierManager instance, note this this could be nullptr if InitInstance has not been called
+ */
+ static AirPurifierManager * GetInstance() { return mInstance; };
+
+ /**
+ * @brief Initialize the Air Purifier Manager and call init on underlying composed members.
+ */
+ void Init();
+
+ /**
+ * @brief Top level handler for all attribute changes in the device. This function will call the appropriate attribute change
+ * handler based on the cluster id.
+ */
+ void PostAttributeChangeCallback(EndpointId endpoint, ClusterId clusterId, AttributeId attributeId, uint8_t type, uint16_t size,
+ uint8_t * value) override;
+
+ /**
+ * @brief Handle the step command from the Fan Control Cluster
+ */
+ Protocols::InteractionModel::Status HandleStep(FanControl::StepDirectionEnum aDirection, bool aWrap, bool aLowestOff) override;
+
+private:
+ inline static AirPurifierManager * mInstance;
+
+ EndpointId mEndpointId;
+ EndpointId mAirQualitySensorEndpointId;
+ EndpointId mTemperatureSensorEndpointId;
+ EndpointId mHumiditySensorEndpointId;
+
+ uint8_t percentCurrent;
+ uint8_t speedCurrent;
+
+ // Set up for Activated Carbon Filter Monitoring
+ ActivatedCarbonFilterMonitoringDelegate activatedCarbonFilterDelegate;
+ ResourceMonitoring::Instance activatedCarbonFilterInstance;
+
+ // Set up for Hepa Filter Monitoring
+ HepaFilterMonitoringDelegate hepaFilterDelegate;
+ ResourceMonitoring::Instance hepaFilterInstance;
+
+ // Set up other members of composed device
+ AirQualitySensorManager mAirQualitySensorManager;
+ TemperatureSensorManager mTemperatureSensorManager;
+ RelativeHumiditySensorManager mHumiditySensorManager;
+
+ // Fan Mode Limits
+ static constexpr int FAN_MODE_LOW_LOWER_BOUND = 1;
+ static constexpr int FAN_MODE_LOW_UPPER_BOUND = 3;
+ static constexpr int FAN_MODE_MEDIUM_LOWER_BOUND = 4;
+ static constexpr int FAN_MODE_MEDIUM_UPPER_BOUND = 7;
+ static constexpr int FAN_MODE_HIGH_LOWER_BOUND = 8;
+ static constexpr int FAN_MODE_HIGH_UPPER_BOUND = 10;
+
+ /**
+ * @brief Construct a new Air Purifier Manager object - this class acts as a singleton device manager for the air purifier
+ * @param[in] aEndpointId Endpoint that the air purifier is on
+ * @param[in] aAirQualitySensorEndpointId Endpoint that the air quality sensor is on
+ * @param[in] aTemperatureSensorEndpointId Endpoint that the temperature sensor is on
+ * @param[in] aHumiditySensorEndpointId Endpoint that the humidity sensor is on
+ */
+ AirPurifierManager(EndpointId aEndpointId, EndpointId aAirQualitySensorEndpointId, EndpointId aTemperatureSensorEndpointId,
+ EndpointId aHumiditySensorEndpointId) :
+ FanControl::Delegate(aEndpointId),
+ mEndpointId(aEndpointId),
+ activatedCarbonFilterInstance(&activatedCarbonFilterDelegate, mEndpointId, ActivatedCarbonFilterMonitoring::Id,
+ static_cast(gActivatedCarbonFeatureMap.to_ulong()),
+ ResourceMonitoring::DegradationDirectionEnum::kDown, true),
+ hepaFilterInstance(&hepaFilterDelegate, mEndpointId, HepaFilterMonitoring::Id,
+ static_cast(gHepaFilterFeatureMap.to_ulong()),
+ ResourceMonitoring::DegradationDirectionEnum::kDown, true),
+ mAirQualitySensorManager(aAirQualitySensorEndpointId), mTemperatureSensorManager(aTemperatureSensorEndpointId),
+ mHumiditySensorManager(aHumiditySensorEndpointId){};
+
+ /**
+ * @brief Handle attribute changes for the Fan Control Cluster
+ * @param[in] attributeId Cluster attribute id that changed
+ * @param[in] type Cluster attribute type
+ * @param[in] size Size of the attribute
+ * @param[in] value Pointer to the new value
+ */
+ void HandleFanControlAttributeChange(AttributeId attributeId, uint8_t type, uint16_t size, uint8_t * value);
+
+ void PercentSettingWriteCallback(uint8_t aNewPercentSetting);
+ void SpeedSettingWriteCallback(uint8_t aNewSpeedSetting);
+ void FanModeWriteCallback(FanControl::FanModeEnum aNewFanMode);
+
+ void SetSpeedSetting(DataModel::Nullable aNewSpeedSetting);
+};
+
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/examples/air-purifier-app/air-purifier-common/include/air-quality-sensor-manager.h b/examples/air-purifier-app/air-purifier-common/include/air-quality-sensor-manager.h
new file mode 100644
index 00000000000000..b5f94d53e2184e
--- /dev/null
+++ b/examples/air-purifier-app/air-purifier-common/include/air-quality-sensor-manager.h
@@ -0,0 +1,90 @@
+/*
+ *
+ * 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
+#include
+#include
+#include
+
+#pragma once
+
+namespace chip {
+namespace app {
+namespace Clusters {
+
+class AirQualitySensorManager
+{
+public:
+ AirQualitySensorManager(EndpointId aEndpointId) :
+ mEndpointId(aEndpointId),
+ airQualityInstance(mEndpointId,
+ BitMask(AirQuality::Feature::kModerate, AirQuality::Feature::kFair,
+ AirQuality::Feature::kVeryPoor,
+ AirQuality::Feature::kExtremelyPoor)),
+ carbonDioxideConcentrationMeasurementInstance(mEndpointId, CarbonDioxideConcentrationMeasurement::Id,
+ ConcentrationMeasurement::MeasurementMediumEnum::kAir,
+ ConcentrationMeasurement::MeasurementUnitEnum::kPpm),
+ carbonMonoxideConcentrationMeasurementInstance(mEndpointId, CarbonMonoxideConcentrationMeasurement::Id,
+ ConcentrationMeasurement::MeasurementMediumEnum::kAir,
+ ConcentrationMeasurement::MeasurementUnitEnum::kPpm),
+ nitrogenDioxideConcentrationMeasurementInstance(mEndpointId, NitrogenDioxideConcentrationMeasurement::Id,
+ ConcentrationMeasurement::MeasurementMediumEnum::kAir,
+ ConcentrationMeasurement::MeasurementUnitEnum::kPpm),
+ pm1ConcentrationMeasurementInstance(mEndpointId, Pm1ConcentrationMeasurement::Id,
+ ConcentrationMeasurement::MeasurementMediumEnum::kAir,
+ ConcentrationMeasurement::MeasurementUnitEnum::kPpm),
+ pm10ConcentrationMeasurementInstance(mEndpointId, Pm10ConcentrationMeasurement::Id,
+ ConcentrationMeasurement::MeasurementMediumEnum::kAir,
+ ConcentrationMeasurement::MeasurementUnitEnum::kPpm),
+ pm25ConcentrationMeasurementInstance(mEndpointId, Pm25ConcentrationMeasurement::Id,
+ ConcentrationMeasurement::MeasurementMediumEnum::kAir,
+ ConcentrationMeasurement::MeasurementUnitEnum::kPpm),
+ radonConcentrationMeasurementInstance(mEndpointId, RadonConcentrationMeasurement::Id,
+ ConcentrationMeasurement::MeasurementMediumEnum::kAir,
+ ConcentrationMeasurement::MeasurementUnitEnum::kPpm),
+ totalVolatileOrganicCompoundsConcentrationMeasurementInstance(
+ mEndpointId, TotalVolatileOrganicCompoundsConcentrationMeasurement::Id,
+ ConcentrationMeasurement::MeasurementMediumEnum::kAir, ConcentrationMeasurement::MeasurementUnitEnum::kPpm),
+ ozoneConcentrationMeasurementInstance(mEndpointId, OzoneConcentrationMeasurement::Id,
+ ConcentrationMeasurement::MeasurementMediumEnum::kAir,
+ ConcentrationMeasurement::MeasurementUnitEnum::kPpm),
+ formaldehydeConcentrationMeasurementInstance(mEndpointId, FormaldehydeConcentrationMeasurement::Id,
+ ConcentrationMeasurement::MeasurementMediumEnum::kAir,
+ ConcentrationMeasurement::MeasurementUnitEnum::kPpm){};
+
+ void Init();
+
+private:
+ EndpointId mEndpointId;
+ AirQuality::Instance airQualityInstance;
+ ConcentrationMeasurement::Instance carbonDioxideConcentrationMeasurementInstance;
+ ConcentrationMeasurement::Instance carbonMonoxideConcentrationMeasurementInstance;
+ ConcentrationMeasurement::Instance nitrogenDioxideConcentrationMeasurementInstance;
+ ConcentrationMeasurement::Instance pm1ConcentrationMeasurementInstance;
+ ConcentrationMeasurement::Instance pm10ConcentrationMeasurementInstance;
+ ConcentrationMeasurement::Instance pm25ConcentrationMeasurementInstance;
+ ConcentrationMeasurement::Instance radonConcentrationMeasurementInstance;
+ ConcentrationMeasurement::Instance
+ totalVolatileOrganicCompoundsConcentrationMeasurementInstance;
+ ConcentrationMeasurement::Instance ozoneConcentrationMeasurementInstance;
+ ConcentrationMeasurement::Instance formaldehydeConcentrationMeasurementInstance;
+};
+
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/examples/air-purifier-app/air-purifier-common/include/filter-delegates.h b/examples/air-purifier-app/air-purifier-common/include/filter-delegates.h
new file mode 100644
index 00000000000000..76e131c2e87135
--- /dev/null
+++ b/examples/air-purifier-app/air-purifier-common/include/filter-delegates.h
@@ -0,0 +1,60 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include
+#include
+#include
+#include
+
+#pragma once
+
+namespace chip {
+namespace app {
+namespace Clusters {
+
+class ActivatedCarbonFilterMonitoringDelegate : public ResourceMonitoring::Delegate
+{
+private:
+ CHIP_ERROR Init() override;
+ Protocols::InteractionModel::Status PreResetCondition() override;
+ Protocols::InteractionModel::Status PostResetCondition() override;
+
+public:
+ ~ActivatedCarbonFilterMonitoringDelegate() override = default;
+};
+
+class HepaFilterMonitoringDelegate : public ResourceMonitoring::Delegate
+{
+private:
+ CHIP_ERROR Init() override;
+ Protocols::InteractionModel::Status PreResetCondition() override;
+ Protocols::InteractionModel::Status PostResetCondition() override;
+
+public:
+ ~HepaFilterMonitoringDelegate() override = default;
+};
+
+class ImmutableReplacementProductListManager : public ResourceMonitoring::ReplacementProductListManager
+{
+public:
+ CHIP_ERROR
+ Next(ResourceMonitoring::ReplacementProductStruct & item) override;
+};
+
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/examples/air-purifier-app/air-purifier-common/include/relative-humidity-sensor-manager.h b/examples/air-purifier-app/air-purifier-common/include/relative-humidity-sensor-manager.h
new file mode 100644
index 00000000000000..23c82787b0203e
--- /dev/null
+++ b/examples/air-purifier-app/air-purifier-common/include/relative-humidity-sensor-manager.h
@@ -0,0 +1,57 @@
+/*
+ *
+ * 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 {
+
+class RelativeHumiditySensorManager
+{
+public:
+ RelativeHumiditySensorManager(EndpointId aEndpointId) : mEndpointId(aEndpointId){};
+
+ void Init()
+ {
+ EmberAfStatus status = RelativeHumidityMeasurement::Attributes::MinMeasuredValue::Set(mEndpointId, 0);
+ VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status,
+ ChipLogError(NotSpecified, "Failed to set RelativeHumidityMeasurement MinMeasuredValue attribute"));
+
+ status = RelativeHumidityMeasurement::Attributes::MaxMeasuredValue::Set(mEndpointId, 10000);
+ VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status,
+ ChipLogError(NotSpecified, "Failed to set RelativeHumidityMeasurement MaxMeasuredValue attribute"));
+ };
+
+ void OnHumidityChangeHandler(uint16_t newValue)
+ {
+ EmberAfStatus status = RelativeHumidityMeasurement::Attributes::MeasuredValue::Set(mEndpointId, newValue);
+ VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status,
+ ChipLogError(NotSpecified, "Failed to set RelativeHumidityMeasurement MeasuredValue attribute"));
+ ChipLogDetail(NotSpecified, "The new RelativeHumidityMeasurement value: %d", newValue);
+ }
+
+private:
+ EndpointId mEndpointId;
+};
+
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/examples/air-purifier-app/air-purifier-common/include/temperature-sensor-manager.h b/examples/air-purifier-app/air-purifier-common/include/temperature-sensor-manager.h
new file mode 100644
index 00000000000000..339d02588f52bc
--- /dev/null
+++ b/examples/air-purifier-app/air-purifier-common/include/temperature-sensor-manager.h
@@ -0,0 +1,57 @@
+/*
+ *
+ * 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 {
+
+class TemperatureSensorManager
+{
+public:
+ TemperatureSensorManager(EndpointId aEndpointId) : mEndpointId(aEndpointId){};
+
+ void Init()
+ {
+ EmberAfStatus status = TemperatureMeasurement::Attributes::MinMeasuredValue::Set(mEndpointId, -500);
+ VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status,
+ ChipLogError(NotSpecified, "Failed to set TemperatureMeasurement MinMeasuredValue attribute"));
+
+ status = TemperatureMeasurement::Attributes::MaxMeasuredValue::Set(mEndpointId, 6000);
+ VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status,
+ ChipLogError(NotSpecified, "Failed to set TemperatureMeasurement MaxMeasuredValue attribute"));
+ }
+
+ void OnTemperatureChangeHandler(int16_t newValue)
+ {
+ EmberAfStatus status = TemperatureMeasurement::Attributes::MeasuredValue::Set(mEndpointId, newValue);
+ VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status,
+ ChipLogError(NotSpecified, "Failed to set TemperatureMeasurement MeasuredValue attribute"));
+ ChipLogDetail(NotSpecified, "The new TemperatureMeasurement value: %d", newValue);
+ }
+
+private:
+ EndpointId mEndpointId;
+};
+
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/examples/air-purifier-app/air-purifier-common/src/air-purifier-manager.cpp b/examples/air-purifier-app/air-purifier-common/src/air-purifier-manager.cpp
new file mode 100644
index 00000000000000..93e1e37a73dd77
--- /dev/null
+++ b/examples/air-purifier-app/air-purifier-common/src/air-purifier-manager.cpp
@@ -0,0 +1,311 @@
+/*
+ *
+ * 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
+#include
+
+using namespace chip;
+using namespace chip::app;
+using namespace chip::app::Clusters;
+using Protocols::InteractionModel::Status;
+
+void AirPurifierManager::Init()
+{
+ FanControl::SetDefaultDelegate(mEndpointId, this);
+
+ activatedCarbonFilterInstance.Init();
+ hepaFilterInstance.Init();
+ mAirQualitySensorManager.Init();
+ mTemperatureSensorManager.Init();
+ mHumiditySensorManager.Init();
+
+ DataModel::Nullable percentSetting;
+ EmberAfStatus status = FanControl::Attributes::PercentSetting::Get(mEndpointId, percentSetting);
+ if (EMBER_ZCL_STATUS_SUCCESS == status)
+ {
+ if (percentSetting.IsNull())
+ {
+ PercentSettingWriteCallback(0);
+ }
+ else
+ {
+ PercentSettingWriteCallback(percentSetting.Value());
+ }
+ }
+
+ DataModel::Nullable speedSetting;
+ status = FanControl::Attributes::SpeedSetting::Get(mEndpointId, speedSetting);
+ if (EMBER_ZCL_STATUS_SUCCESS == status)
+ {
+ if (speedSetting.IsNull())
+ {
+ SpeedSettingWriteCallback(0);
+ }
+ else
+ {
+ SpeedSettingWriteCallback(speedSetting.Value());
+ }
+ }
+
+ // Set up some sane initial values for temperature and humidity - note these are fixed values for testing purposes only
+ mTemperatureSensorManager.OnTemperatureChangeHandler(2000);
+ mHumiditySensorManager.OnHumidityChangeHandler(5000);
+}
+
+void AirPurifierManager::PostAttributeChangeCallback(EndpointId endpoint, ClusterId clusterId, AttributeId attributeId,
+ uint8_t type, uint16_t size, uint8_t * value)
+{
+ switch (clusterId)
+ {
+ case FanControl::Id: {
+ HandleFanControlAttributeChange(attributeId, type, size, value);
+ break;
+ }
+
+ default:
+ break;
+ }
+}
+
+Status AirPurifierManager::HandleStep(FanControl::StepDirectionEnum aDirection, bool aWrap, bool aLowestOff)
+{
+ ChipLogProgress(NotSpecified, "AirPurifierManager::HandleStep aDirection %d, aWrap %d, aLowestOff %d",
+ to_underlying(aDirection), aWrap, aLowestOff);
+
+ VerifyOrReturnError(aDirection != FanControl::StepDirectionEnum::kUnknownEnumValue, Status::InvalidCommand);
+
+ uint8_t speedMax;
+ FanControl::Attributes::SpeedMax::Get(mEndpointId, &speedMax);
+
+ DataModel::Nullable speedSetting;
+ FanControl::Attributes::SpeedSetting::Get(mEndpointId, speedSetting);
+
+ uint8_t newSpeedSetting = speedSetting.IsNull() ? 0 : speedSetting.Value();
+
+ if (aDirection == FanControl::StepDirectionEnum::kIncrease)
+ {
+ if (speedSetting.IsNull())
+ {
+ newSpeedSetting = 1;
+ }
+ else if (speedSetting.Value() < speedMax)
+ {
+ newSpeedSetting = static_cast(speedSetting.Value() + 1);
+ }
+ else if (speedSetting.Value() == speedMax)
+ {
+ if (aWrap)
+ {
+ newSpeedSetting = aLowestOff ? 0 : 1;
+ }
+ }
+ }
+ else if (aDirection == FanControl::StepDirectionEnum::kDecrease)
+ {
+ if (speedSetting.IsNull())
+ {
+ newSpeedSetting = aLowestOff ? 0 : 1;
+ }
+ else if ((speedSetting.Value() > 1) && (speedSetting.Value() <= speedMax))
+ {
+ newSpeedSetting = static_cast(speedSetting.Value() - 1);
+ }
+ else if (speedSetting.Value() == 1)
+ {
+ if (aLowestOff)
+ {
+ newSpeedSetting = static_cast(speedSetting.Value() - 1);
+ }
+ else if (aWrap)
+ {
+ newSpeedSetting = speedMax;
+ }
+ }
+ else if (speedSetting.Value() == 0)
+ {
+ if (aWrap)
+ {
+ newSpeedSetting = speedMax;
+ }
+ else if (!aLowestOff)
+ {
+ newSpeedSetting = 1;
+ }
+ }
+ }
+
+ return ToInteractionModelStatus(FanControl::Attributes::SpeedSetting::Set(mEndpointId, newSpeedSetting));
+}
+
+void AirPurifierManager::HandleFanControlAttributeChange(AttributeId attributeId, uint8_t type, uint16_t size, uint8_t * value)
+{
+ switch (attributeId)
+ {
+ case FanControl::Attributes::PercentSetting::Id: {
+ DataModel::Nullable percentSetting = static_cast>(*value);
+ if (percentSetting.IsNull())
+ {
+ PercentSettingWriteCallback(0);
+ }
+ else
+ {
+ PercentSettingWriteCallback(percentSetting.Value());
+ }
+ break;
+ }
+
+ case FanControl::Attributes::SpeedSetting::Id: {
+ DataModel::Nullable speedSetting = static_cast>(*value);
+ if (speedSetting.IsNull())
+ {
+ SpeedSettingWriteCallback(0);
+ }
+ else
+ {
+ SpeedSettingWriteCallback(speedSetting.Value());
+ }
+ break;
+ }
+
+ case FanControl::Attributes::FanMode::Id: {
+ FanControl::FanModeEnum fanMode = static_cast(*value);
+ FanModeWriteCallback(fanMode);
+ break;
+ }
+
+ default: {
+ break;
+ }
+ }
+}
+
+void AirPurifierManager::PercentSettingWriteCallback(uint8_t aNewPercentSetting)
+{
+ if (aNewPercentSetting != percentCurrent)
+ {
+ ChipLogDetail(NotSpecified, "AirPurifierManager::PercentSettingWriteCallback: %d", aNewPercentSetting);
+ percentCurrent = aNewPercentSetting;
+ EmberAfStatus status = FanControl::Attributes::PercentCurrent::Set(mEndpointId, percentCurrent);
+ if (status != EMBER_ZCL_STATUS_SUCCESS)
+ {
+ ChipLogError(NotSpecified,
+ "AirPurifierManager::PercentSettingWriteCallback: failed to set PercentCurrent attribute: %d", status);
+ }
+ }
+}
+
+void AirPurifierManager::SpeedSettingWriteCallback(uint8_t aNewSpeedSetting)
+{
+ if (aNewSpeedSetting != speedCurrent)
+ {
+ ChipLogDetail(NotSpecified, "AirPurifierManager::SpeedSettingWriteCallback: %d", aNewSpeedSetting);
+ speedCurrent = aNewSpeedSetting;
+ EmberAfStatus status = FanControl::Attributes::SpeedCurrent::Set(mEndpointId, speedCurrent);
+ if (status != EMBER_ZCL_STATUS_SUCCESS)
+ {
+ ChipLogError(NotSpecified, "AirPurifierManager::SpeedSettingWriteCallback: failed to set SpeedCurrent attribute: %d",
+ status);
+ }
+
+ // Determine if the speed change should also change the fan mode
+ if (speedCurrent == 0)
+ {
+ FanControl::Attributes::FanMode::Set(mEndpointId, FanControl::FanModeEnum::kOff);
+ }
+ else if (speedCurrent <= FAN_MODE_LOW_UPPER_BOUND)
+ {
+ FanControl::Attributes::FanMode::Set(mEndpointId, FanControl::FanModeEnum::kLow);
+ }
+ else if (speedCurrent <= FAN_MODE_MEDIUM_UPPER_BOUND)
+ {
+ FanControl::Attributes::FanMode::Set(mEndpointId, FanControl::FanModeEnum::kMedium);
+ }
+ else if (speedCurrent <= FAN_MODE_HIGH_UPPER_BOUND)
+ {
+ FanControl::Attributes::FanMode::Set(mEndpointId, FanControl::FanModeEnum::kHigh);
+ }
+ }
+}
+
+void AirPurifierManager::FanModeWriteCallback(FanControl::FanModeEnum aNewFanMode)
+{
+ ChipLogDetail(NotSpecified, "AirPurifierManager::FanModeWriteCallback: %d", (uint8_t) aNewFanMode);
+ switch (aNewFanMode)
+ {
+ case FanControl::FanModeEnum::kOff: {
+ if (speedCurrent != 0)
+ {
+ DataModel::Nullable speedSetting(0);
+ SetSpeedSetting(speedSetting);
+ }
+ break;
+ }
+ case FanControl::FanModeEnum::kLow: {
+ if (speedCurrent < FAN_MODE_LOW_LOWER_BOUND || speedCurrent > FAN_MODE_LOW_UPPER_BOUND)
+ {
+ DataModel::Nullable speedSetting(FAN_MODE_LOW_LOWER_BOUND);
+ SetSpeedSetting(speedSetting);
+ }
+ break;
+ }
+ case FanControl::FanModeEnum::kMedium: {
+ if (speedCurrent < FAN_MODE_MEDIUM_LOWER_BOUND || speedCurrent > FAN_MODE_MEDIUM_UPPER_BOUND)
+ {
+ DataModel::Nullable speedSetting(FAN_MODE_MEDIUM_LOWER_BOUND);
+ SetSpeedSetting(speedSetting);
+ }
+ break;
+ }
+ case FanControl::FanModeEnum::kOn:
+ case FanControl::FanModeEnum::kHigh: {
+ if (speedCurrent < FAN_MODE_HIGH_LOWER_BOUND || speedCurrent > FAN_MODE_HIGH_UPPER_BOUND)
+ {
+ DataModel::Nullable speedSetting(FAN_MODE_HIGH_LOWER_BOUND);
+ SetSpeedSetting(speedSetting);
+ }
+ break;
+ }
+ case FanControl::FanModeEnum::kSmart:
+ case FanControl::FanModeEnum::kAuto: {
+ ChipLogProgress(NotSpecified, "AirPurifierManager::FanModeWriteCallback: Auto");
+ break;
+ }
+ case FanControl::FanModeEnum::kUnknownEnumValue: {
+ ChipLogProgress(NotSpecified, "AirPurifierManager::FanModeWriteCallback: Unknown");
+ break;
+ }
+ }
+}
+
+void AirPurifierManager::SetSpeedSetting(DataModel::Nullable aNewSpeedSetting)
+{
+ if (aNewSpeedSetting.IsNull())
+ {
+ ChipLogError(NotSpecified, "AirPurifierManager::SetSpeedSetting: invalid value");
+ return;
+ }
+
+ if (aNewSpeedSetting.Value() != speedCurrent)
+ {
+ EmberAfStatus status = FanControl::Attributes::SpeedSetting::Set(mEndpointId, aNewSpeedSetting);
+ if (status != EMBER_ZCL_STATUS_SUCCESS)
+ {
+ ChipLogError(NotSpecified, "AirPurifierManager::SetSpeedSetting: failed to set SpeedSetting attribute: %d", status);
+ }
+ }
+}
diff --git a/examples/air-purifier-app/air-purifier-common/src/air-quality-sensor-manager.cpp b/examples/air-purifier-app/air-purifier-common/src/air-quality-sensor-manager.cpp
new file mode 100644
index 00000000000000..d6c3155c2501e4
--- /dev/null
+++ b/examples/air-purifier-app/air-purifier-common/src/air-quality-sensor-manager.cpp
@@ -0,0 +1,158 @@
+/*
+ *
+ * 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
+
+using namespace chip;
+using namespace chip::app;
+using namespace chip::app::DataModel;
+using namespace chip::app::Clusters;
+using namespace chip::app::Clusters::ConcentrationMeasurement;
+using namespace chip::app::Clusters::AirQuality;
+
+void AirQualitySensorManager::Init()
+{
+ /*
+ * Note these values are for testing purposes only and are not actual values for the air quality sensor.
+ * They are also fixed.
+ */
+
+ // Air Quality
+ airQualityInstance.Init();
+ airQualityInstance.UpdateAirQuality(AirQualityEnum::kGood);
+
+ // CO2
+ carbonDioxideConcentrationMeasurementInstance.Init();
+ carbonDioxideConcentrationMeasurementInstance.SetMinMeasuredValue(MakeNullable(0.0f));
+ carbonDioxideConcentrationMeasurementInstance.SetMaxMeasuredValue(MakeNullable(1000.0f));
+ carbonDioxideConcentrationMeasurementInstance.SetMeasuredValue(MakeNullable(2.0f));
+ carbonDioxideConcentrationMeasurementInstance.SetPeakMeasuredValue(MakeNullable(1.0f));
+ carbonDioxideConcentrationMeasurementInstance.SetPeakMeasuredValueWindow(320);
+ carbonDioxideConcentrationMeasurementInstance.SetAverageMeasuredValue(MakeNullable(1.0f));
+ carbonDioxideConcentrationMeasurementInstance.SetAverageMeasuredValueWindow(320);
+ carbonDioxideConcentrationMeasurementInstance.SetUncertainty(0.0f);
+ carbonDioxideConcentrationMeasurementInstance.SetLevelValue(LevelValueEnum::kLow);
+
+ // CO
+ carbonMonoxideConcentrationMeasurementInstance.Init();
+ carbonMonoxideConcentrationMeasurementInstance.SetMinMeasuredValue(MakeNullable(0.0f));
+ carbonMonoxideConcentrationMeasurementInstance.SetMaxMeasuredValue(MakeNullable(1000.0f));
+ carbonMonoxideConcentrationMeasurementInstance.SetMeasuredValue(MakeNullable(2.0f));
+ carbonMonoxideConcentrationMeasurementInstance.SetPeakMeasuredValue(MakeNullable(1.0f));
+ carbonMonoxideConcentrationMeasurementInstance.SetPeakMeasuredValueWindow(320);
+ carbonMonoxideConcentrationMeasurementInstance.SetAverageMeasuredValue(MakeNullable(1.0f));
+ carbonMonoxideConcentrationMeasurementInstance.SetAverageMeasuredValueWindow(320);
+ carbonMonoxideConcentrationMeasurementInstance.SetUncertainty(0.0f);
+ carbonMonoxideConcentrationMeasurementInstance.SetLevelValue(LevelValueEnum::kLow);
+
+ // NO2
+ nitrogenDioxideConcentrationMeasurementInstance.Init();
+ nitrogenDioxideConcentrationMeasurementInstance.SetMinMeasuredValue(MakeNullable(0.0f));
+ nitrogenDioxideConcentrationMeasurementInstance.SetMaxMeasuredValue(MakeNullable(1000.0f));
+ nitrogenDioxideConcentrationMeasurementInstance.SetMeasuredValue(MakeNullable(2.0f));
+ nitrogenDioxideConcentrationMeasurementInstance.SetPeakMeasuredValue(MakeNullable(1.0f));
+ nitrogenDioxideConcentrationMeasurementInstance.SetPeakMeasuredValueWindow(320);
+ nitrogenDioxideConcentrationMeasurementInstance.SetAverageMeasuredValue(MakeNullable(1.0f));
+ nitrogenDioxideConcentrationMeasurementInstance.SetAverageMeasuredValueWindow(320);
+ nitrogenDioxideConcentrationMeasurementInstance.SetUncertainty(0.0f);
+ nitrogenDioxideConcentrationMeasurementInstance.SetLevelValue(LevelValueEnum::kLow);
+
+ // PM1
+ pm1ConcentrationMeasurementInstance.Init();
+ pm1ConcentrationMeasurementInstance.SetMinMeasuredValue(MakeNullable(0.0f));
+ pm1ConcentrationMeasurementInstance.SetMaxMeasuredValue(MakeNullable(1000.0f));
+ pm1ConcentrationMeasurementInstance.SetMeasuredValue(MakeNullable(2.0f));
+ pm1ConcentrationMeasurementInstance.SetPeakMeasuredValue(MakeNullable(1.0f));
+ pm1ConcentrationMeasurementInstance.SetPeakMeasuredValueWindow(320);
+ pm1ConcentrationMeasurementInstance.SetAverageMeasuredValue(MakeNullable(1.0f));
+ pm1ConcentrationMeasurementInstance.SetAverageMeasuredValueWindow(320);
+ pm1ConcentrationMeasurementInstance.SetUncertainty(0.0f);
+ pm1ConcentrationMeasurementInstance.SetLevelValue(LevelValueEnum::kLow);
+
+ // PM10
+ pm10ConcentrationMeasurementInstance.Init();
+ pm10ConcentrationMeasurementInstance.SetMinMeasuredValue(MakeNullable(0.0f));
+ pm10ConcentrationMeasurementInstance.SetMaxMeasuredValue(MakeNullable(1000.0f));
+ pm10ConcentrationMeasurementInstance.SetMeasuredValue(MakeNullable(2.0f));
+ pm10ConcentrationMeasurementInstance.SetPeakMeasuredValue(MakeNullable(1.0f));
+ pm10ConcentrationMeasurementInstance.SetPeakMeasuredValueWindow(320);
+ pm10ConcentrationMeasurementInstance.SetAverageMeasuredValue(MakeNullable(1.0f));
+ pm10ConcentrationMeasurementInstance.SetAverageMeasuredValueWindow(320);
+ pm10ConcentrationMeasurementInstance.SetUncertainty(0.0f);
+ pm10ConcentrationMeasurementInstance.SetLevelValue(LevelValueEnum::kLow);
+
+ // PM2.5
+ pm25ConcentrationMeasurementInstance.Init();
+ pm25ConcentrationMeasurementInstance.SetMinMeasuredValue(MakeNullable(0.0f));
+ pm25ConcentrationMeasurementInstance.SetMaxMeasuredValue(MakeNullable(1000.0f));
+ pm25ConcentrationMeasurementInstance.SetMeasuredValue(MakeNullable(2.0f));
+ pm25ConcentrationMeasurementInstance.SetPeakMeasuredValue(MakeNullable(1.0f));
+ pm25ConcentrationMeasurementInstance.SetPeakMeasuredValueWindow(320);
+ pm25ConcentrationMeasurementInstance.SetAverageMeasuredValue(MakeNullable(1.0f));
+ pm25ConcentrationMeasurementInstance.SetAverageMeasuredValueWindow(320);
+ pm25ConcentrationMeasurementInstance.SetUncertainty(0.0f);
+ pm25ConcentrationMeasurementInstance.SetLevelValue(LevelValueEnum::kLow);
+
+ // Radon
+ radonConcentrationMeasurementInstance.Init();
+ radonConcentrationMeasurementInstance.SetMinMeasuredValue(MakeNullable(0.0f));
+ radonConcentrationMeasurementInstance.SetMaxMeasuredValue(MakeNullable(1000.0f));
+ radonConcentrationMeasurementInstance.SetMeasuredValue(MakeNullable(2.0f));
+ radonConcentrationMeasurementInstance.SetPeakMeasuredValue(MakeNullable(1.0f));
+ radonConcentrationMeasurementInstance.SetPeakMeasuredValueWindow(320);
+ radonConcentrationMeasurementInstance.SetAverageMeasuredValue(MakeNullable(1.0f));
+ radonConcentrationMeasurementInstance.SetAverageMeasuredValueWindow(320);
+ radonConcentrationMeasurementInstance.SetUncertainty(0.0f);
+ radonConcentrationMeasurementInstance.SetLevelValue(LevelValueEnum::kLow);
+
+ // TVOC
+ totalVolatileOrganicCompoundsConcentrationMeasurementInstance.Init();
+ totalVolatileOrganicCompoundsConcentrationMeasurementInstance.SetMinMeasuredValue(MakeNullable(0.0f));
+ totalVolatileOrganicCompoundsConcentrationMeasurementInstance.SetMaxMeasuredValue(MakeNullable(1000.0f));
+ totalVolatileOrganicCompoundsConcentrationMeasurementInstance.SetMeasuredValue(MakeNullable(2.0f));
+ totalVolatileOrganicCompoundsConcentrationMeasurementInstance.SetPeakMeasuredValue(MakeNullable(1.0f));
+ totalVolatileOrganicCompoundsConcentrationMeasurementInstance.SetPeakMeasuredValueWindow(320);
+ totalVolatileOrganicCompoundsConcentrationMeasurementInstance.SetAverageMeasuredValue(MakeNullable(1.0f));
+ totalVolatileOrganicCompoundsConcentrationMeasurementInstance.SetAverageMeasuredValueWindow(320);
+ totalVolatileOrganicCompoundsConcentrationMeasurementInstance.SetUncertainty(0.0f);
+ totalVolatileOrganicCompoundsConcentrationMeasurementInstance.SetLevelValue(LevelValueEnum::kLow);
+
+ // Ozone
+ ozoneConcentrationMeasurementInstance.Init();
+ ozoneConcentrationMeasurementInstance.SetMinMeasuredValue(MakeNullable(0.0f));
+ ozoneConcentrationMeasurementInstance.SetMaxMeasuredValue(MakeNullable(1000.0f));
+ ozoneConcentrationMeasurementInstance.SetMeasuredValue(MakeNullable(2.0f));
+ ozoneConcentrationMeasurementInstance.SetPeakMeasuredValue(MakeNullable(1.0f));
+ ozoneConcentrationMeasurementInstance.SetPeakMeasuredValueWindow(320);
+ ozoneConcentrationMeasurementInstance.SetAverageMeasuredValue(MakeNullable(1.0f));
+ ozoneConcentrationMeasurementInstance.SetAverageMeasuredValueWindow(320);
+ ozoneConcentrationMeasurementInstance.SetUncertainty(0.0f);
+ ozoneConcentrationMeasurementInstance.SetLevelValue(LevelValueEnum::kLow);
+
+ // Formaldehyde
+ formaldehydeConcentrationMeasurementInstance.Init();
+ formaldehydeConcentrationMeasurementInstance.SetMinMeasuredValue(MakeNullable(0.0f));
+ formaldehydeConcentrationMeasurementInstance.SetMaxMeasuredValue(MakeNullable(1000.0f));
+ formaldehydeConcentrationMeasurementInstance.SetMeasuredValue(MakeNullable(2.0f));
+ formaldehydeConcentrationMeasurementInstance.SetPeakMeasuredValue(MakeNullable(1.0f));
+ formaldehydeConcentrationMeasurementInstance.SetPeakMeasuredValueWindow(320);
+ formaldehydeConcentrationMeasurementInstance.SetAverageMeasuredValue(MakeNullable(1.0f));
+ formaldehydeConcentrationMeasurementInstance.SetAverageMeasuredValueWindow(320);
+ formaldehydeConcentrationMeasurementInstance.SetUncertainty(0.0f);
+ formaldehydeConcentrationMeasurementInstance.SetLevelValue(LevelValueEnum::kLow);
+}
diff --git a/examples/air-purifier-app/air-purifier-common/src/filter-delegates.cpp b/examples/air-purifier-app/air-purifier-common/src/filter-delegates.cpp
new file mode 100644
index 00000000000000..74091ab778b539
--- /dev/null
+++ b/examples/air-purifier-app/air-purifier-common/src/filter-delegates.cpp
@@ -0,0 +1,108 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include
+#include
+#include
+
+using namespace chip;
+using namespace chip::app;
+using namespace chip::app::Clusters;
+using namespace chip::app::Clusters::ResourceMonitoring;
+using namespace chip::app::Clusters::ActivatedCarbonFilterMonitoring;
+using namespace chip::app::Clusters::HepaFilterMonitoring;
+using chip::Protocols::InteractionModel::Status;
+
+static ImmutableReplacementProductListManager sReplacementProductListManager;
+
+//-- Activated Carbon Filter Monitoring delegate methods
+CHIP_ERROR ActivatedCarbonFilterMonitoringDelegate::Init()
+{
+ ChipLogDetail(Zcl, "ActivatedCarbonFilterMonitoringDelegate::Init()");
+ GetInstance()->SetReplacementProductListManagerInstance(&sReplacementProductListManager);
+ return CHIP_NO_ERROR;
+}
+
+Status ActivatedCarbonFilterMonitoringDelegate::PreResetCondition()
+{
+ ChipLogDetail(Zcl, "ActivatedCarbonFilterMonitoringDelegate::PreResetCondition()");
+ return Status::Success;
+}
+
+Status ActivatedCarbonFilterMonitoringDelegate::PostResetCondition()
+{
+ ChipLogDetail(Zcl, "ActivatedCarbonFilterMonitoringDelegate::PostResetCondition()");
+ return Status::Success;
+}
+
+//-- Hepa Filter Monitoring delegate methods
+CHIP_ERROR HepaFilterMonitoringDelegate::Init()
+{
+ ChipLogDetail(Zcl, "HepaFilterMonitoringDelegate::Init()");
+ GetInstance()->SetReplacementProductListManagerInstance(&sReplacementProductListManager);
+ return CHIP_NO_ERROR;
+}
+
+Status HepaFilterMonitoringDelegate::PreResetCondition()
+{
+ ChipLogDetail(Zcl, "HepaFilterMonitoringDelegate::PreResetCondition()");
+ return Status::Success;
+}
+
+Status HepaFilterMonitoringDelegate::PostResetCondition()
+{
+ ChipLogDetail(Zcl, "HepaFilterMonitoringDelegate::PostResetCondition()");
+ return Status::Success;
+}
+
+CHIP_ERROR ImmutableReplacementProductListManager::Next(ReplacementProductStruct & item)
+{
+ if (mIndex >= kReplacementProductListMaxSize)
+ {
+ return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED;
+ }
+
+ switch (mIndex)
+ {
+ case 0: {
+ item.SetProductIdentifierType(ResourceMonitoring::ProductIdentifierTypeEnum::kUpc);
+ item.SetProductIdentifierValue(CharSpan::fromCharString("111112222233"));
+ break;
+ case 1:
+ item.SetProductIdentifierType(ResourceMonitoring::ProductIdentifierTypeEnum::kGtin8);
+ item.SetProductIdentifierValue(CharSpan::fromCharString("gtin8xxx"));
+ break;
+ case 2:
+ item.SetProductIdentifierType(ResourceMonitoring::ProductIdentifierTypeEnum::kEan);
+ item.SetProductIdentifierValue(CharSpan::fromCharString("4444455555666"));
+ break;
+ case 3:
+ item.SetProductIdentifierType(ResourceMonitoring::ProductIdentifierTypeEnum::kGtin14);
+ item.SetProductIdentifierValue(CharSpan::fromCharString("gtin14xxxxxxxx"));
+ break;
+ case 4:
+ item.SetProductIdentifierType(ResourceMonitoring::ProductIdentifierTypeEnum::kOem);
+ item.SetProductIdentifierValue(CharSpan::fromCharString("oem20xxxxxxxxxxxxxxx"));
+ break;
+ default:
+ return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED;
+ break;
+ }
+ }
+ mIndex++;
+ return CHIP_NO_ERROR;
+}
diff --git a/examples/air-purifier-app/ameba/.gitignore b/examples/air-purifier-app/ameba/.gitignore
new file mode 100644
index 00000000000000..234526a082ad26
--- /dev/null
+++ b/examples/air-purifier-app/ameba/.gitignore
@@ -0,0 +1,5 @@
+*.vscode
+
+/build/
+/sdkconfig
+/sdkconfig.old
diff --git a/examples/air-purifier-app/ameba/README.md b/examples/air-purifier-app/ameba/README.md
new file mode 100644
index 00000000000000..be11ad8d063210
--- /dev/null
+++ b/examples/air-purifier-app/ameba/README.md
@@ -0,0 +1,117 @@
+# CHIP Ameba Air Purifier Example
+
+This example demonstrates the Matter air purifier application on Ameba platform.
+
+---
+
+- [CHIP Ameba Air Purifier Example](#chip-ameba-air-purifier-example)
+ - [Supported Device](#supported-device)
+ - [Building the Example Application](#building-the-example-application)
+ - [Commissioning](#commissioning)
+ - [BLE mode](#ble-mode)
+ - [IP mode](#ip-mode)
+ - [Cluster control](#cluster-control)
+
+---
+
+## Supported Device
+
+The CHIP demo application is supported on
+[Ameba RTL8722DM Board](https://www.amebaiot.com/en/amebad).
+
+## Building the Example Application
+
+- Check out the Ameba repository in the same folder/directory as the Matter
+ SDK repository:
+
+```
+git clone https://github.com/ambiot/ambd_matter.git
+```
+
+- Setup build environment:
+
+```
+$ cd connectedhomeip
+$ source scripts/bootstrap.sh
+```
+
+- To build the demo application:
+
+```
+$ cd ambd_matter/project/realtek_amebaD_va0_example/GCC-RELEASE/project_lp/
+$ make all
+
+$ cd ambd_matter/project/realtek_amebaD_va0_example/GCC-RELEASE/project_hp/
+$ make -C asdk air_purifier
+
+From the same directory:
+$ make all
+```
+
+- Combine the three output images for flashing using the **Ameba Image Tool**:
+
+```
+$ cd ambd_matter/tools/AmebaD/Image_Tool_Linux
+
+$ sudo ./AmebaD_ImageTool -combine \
+ ../../../project/realtek_amebaD_va0_example/GCC-RELEASE/project_lp/asdk/image/km0_boot_all.bin 0x0000 \
+ ../../../project/realtek_amebaD_va0_example/GCC-RELEASE/project_hp/asdk/image/km4_boot_all.bin 0x4000 \
+ ../../../project/realtek_amebaD_va0_example/GCC-RELEASE/project_hp/asdk/image/km0_km4_image2.bin 0x6000
+```
+
+- This will produce a combined Image_All.bin file alongside the image tool
+ that can be flashed using the **Ameba Image Tool**:
+
+1. Connect your device via USB
+2. Edit the `ambd_matter/tools/AmebaD/mpp.ini` file with the correct port
+ setting (the rest of the settings should be correct)
+3. Click **Download** button and the **Reset** button to get the board into
+ serial download mode
+4. Flash on the image:
+
+```
+$ cd ambd_matter/tools/AmebaD/Image_Tool_Linux
+$ ./AmebaD_ImageTool -download
+```
+
+## Commissioning
+
+There are two commissioning modes supported by Ameba platform:
+
+### BLE mode
+
+1. Build and Flash
+2. The example will run automatically after booting the Ameba board.
+3. Test with
+ [Chip-Tool](https://github.com/project-chip/connectedhomeip/tree/master/examples/chip-tool)
+
+### IP mode
+
+1. Build and Flash
+2. The example will run automatically after booting the Ameba board.
+3. Connect to AP using `ATW0, ATW1, ATWC` commands
+4. Test with
+ [Chip-Tool](https://github.com/project-chip/connectedhomeip/tree/master/examples/chip-tool)
+
+## Cluster Control
+
+After successful commissioning, the air purifier clusters can be read and
+controlled using
+[Chip-Tool](https://github.com/project-chip/connectedhomeip/tree/master/examples/chip-tool#using-the-client-to-send-matter-commands).
+
+The Air Purifier is a composed device. The example has endpoints configured as
+follows:
+
+- Air purifier on endpoint 1
+- Air quality sensor on endpoint 2
+- Temperature sensor on endpoint 3
+- Relative humidity sensor on endpoint 4
+
+Example commands using the chip tool:
+
+```
+$ ./chip-tool fancontrol write speed-setting 10 ${NODE_ID_TO_ASSIGN} 1
+$ ./chip-tool formaldehydeconcentrationmeasurement read level-value ${NODE_ID_TO_ASSIGN} 2
+$ ./chip-tool temperaturemeasurement read measured-value ${NODE_ID_TO_ASSIGN} 3
+$ ./chip-tool relativehumiditymeasurement read measured-value ${NODE_ID_TO_ASSIGN} 4
+```
diff --git a/examples/air-purifier-app/ameba/chip_main.cmake b/examples/air-purifier-app/ameba/chip_main.cmake
new file mode 100755
index 00000000000000..df900f2508de17
--- /dev/null
+++ b/examples/air-purifier-app/ameba/chip_main.cmake
@@ -0,0 +1,284 @@
+cmake_minimum_required(VERSION 3.6)
+
+project(chip_main)
+
+set(chip_dir "${ameba_matter_root}")
+set(chip_dir_output "${matter_output_path}/chip")
+set(dir "${sdk_root}/component/common/api")
+set(chip_main chip_main)
+set(list_chip_main_sources chip_main_sources)
+
+if (matter_enable_rpc)
+set(pigweed_dir "${chip_dir}/third_party/pigweed/repo")
+
+include(${pigweed_dir}/pw_build/pigweed.cmake)
+include(${pigweed_dir}/pw_protobuf_compiler/proto.cmake)
+include(${pigweed_dir}/pw_assert/backend.cmake)
+include(${pigweed_dir}/pw_log/backend.cmake)
+include(${pigweed_dir}/pw_sys_io/backend.cmake)
+include(${pigweed_dir}/pw_trace/backend.cmake)
+
+set(dir_pw_third_party_nanopb "${chip_dir}/third_party/nanopb/repo" CACHE STRING "" FORCE)
+
+pw_set_module_config(pw_rpc_CONFIG pw_rpc.disable_global_mutex_config)
+pw_set_backend(pw_log pw_log_basic)
+pw_set_backend(pw_assert.check pw_assert_log.check_backend)
+pw_set_backend(pw_assert.assert pw_assert.assert_compatibility_backend)
+pw_set_backend(pw_sys_io pw_sys_io.ameba)
+pw_set_backend(pw_trace pw_trace_tokenized)
+
+add_subdirectory(${chip_dir}/third_party/pigweed/repo ${chip_dir}/examples/air-purifier-app/ameba/out/pigweed)
+add_subdirectory(${chip_dir}/third_party/nanopb/repo ${chip_dir}/examples/air-purifier-app/ameba/out/nanopb)
+add_subdirectory(${chip_dir}/examples/platform/ameba/pw_sys_io ${chip_dir}/examples/air-purifier-app/ameba/out/pw_sys_io)
+
+pw_proto_library(attributes_service
+ SOURCES
+ ${chip_dir}/examples/common/pigweed/protos/attributes_service.proto
+ INPUTS
+ ${chip_dir}/examples/common/pigweed/protos/attributes_service.options
+ PREFIX
+ attributes_service
+ STRIP_PREFIX
+ ${chip_dir}/examples/common/pigweed/protos
+ DEPS
+ pw_protobuf.common_proto
+)
+
+pw_proto_library(button_service
+ SOURCES
+ ${chip_dir}/examples/common/pigweed/protos/button_service.proto
+ PREFIX
+ button_service
+ STRIP_PREFIX
+ ${chip_dir}/examples/common/pigweed/protos
+ DEPS
+ pw_protobuf.common_proto
+)
+
+pw_proto_library(descriptor_service
+ SOURCES
+ ${chip_dir}/examples/common/pigweed/protos/descriptor_service.proto
+ PREFIX
+ descriptor_service
+ STRIP_PREFIX
+ ${chip_dir}/examples/common/pigweed/protos
+ DEPS
+ pw_protobuf.common_proto
+)
+
+pw_proto_library(device_service
+ SOURCES
+ ${chip_dir}/examples/common/pigweed/protos/device_service.proto
+ INPUTS
+ ${chip_dir}/examples/common/pigweed/protos/device_service.options
+ PREFIX
+ device_service
+ STRIP_PREFIX
+ ${chip_dir}/examples/common/pigweed/protos
+ DEPS
+ pw_protobuf.common_proto
+)
+
+pw_proto_library(lighting_service
+ SOURCES
+ ${chip_dir}/examples/common/pigweed/protos/lighting_service.proto
+ PREFIX
+ lighting_service
+ STRIP_PREFIX
+ ${chip_dir}/examples/common/pigweed/protos
+ DEPS
+ pw_protobuf.common_proto
+)
+
+pw_proto_library(locking_service
+ SOURCES
+ ${chip_dir}/examples/common/pigweed/protos/locking_service.proto
+ PREFIX
+ locking_service
+ STRIP_PREFIX
+ ${chip_dir}/examples/common/pigweed/protos
+ DEPS
+ pw_protobuf.common_proto
+)
+
+pw_proto_library(wifi_service
+ SOURCES
+ ${chip_dir}/examples/common/pigweed/protos/wifi_service.proto
+ INPUTS
+ ${chip_dir}/examples/common/pigweed/protos/wifi_service.options
+ PREFIX
+ wifi_service
+ DEPS
+ pw_protobuf.common_proto
+ STRIP_PREFIX
+ ${chip_dir}/examples/common/pigweed/protos
+)
+
+endif(matter_enable_rpc)
+
+include(${prj_root}/GCC-RELEASE/project_hp/asdk/includepath.cmake)
+
+if (matter_enable_rpc)
+list(
+ APPEND ${list_chip_main_sources}
+ #rpc
+ ${chip_dir}/examples/platform/ameba/PigweedLogger.cpp
+ ${chip_dir}/examples/platform/ameba/Rpc.cpp
+ ${chip_dir}/examples/common/pigweed/RpcService.cpp
+ ${chip_dir}/examples/common/pigweed/ameba/PigweedLoggerMutex.cpp
+)
+endif (matter_enable_rpc)
+
+if (matter_enable_ota_requestor)
+list(
+ APPEND ${list_chip_main_sources}
+ #OTARequestor
+ ${chip_dir}/src/app/clusters/ota-requestor/BDXDownloader.cpp
+ ${chip_dir}/src/app/clusters/ota-requestor/DefaultOTARequestor.cpp
+ ${chip_dir}/src/app/clusters/ota-requestor/DefaultOTARequestorDriver.cpp
+ ${chip_dir}/src/app/clusters/ota-requestor/DefaultOTARequestorStorage.cpp
+ ${chip_dir}/src/app/clusters/ota-requestor/ota-requestor-server.cpp
+ ${chip_dir}/examples/platform/ameba/ota/OTAInitializer.cpp
+)
+endif (matter_enable_ota_requestor)
+
+list(
+ APPEND ${list_chip_main_sources}
+
+ ${chip_dir}/examples/air-purifier-app/ameba/main/chipinterface.cpp
+ ${chip_dir}/examples/air-purifier-app/ameba/main/DeviceCallbacks.cpp
+ ${chip_dir}/examples/air-purifier-app/ameba/main/CHIPDeviceManager.cpp
+
+ ${chip_dir}/examples/platform/ameba/route_hook/ameba_route_hook.c
+ ${chip_dir}/examples/platform/ameba/route_hook/ameba_route_table.c
+
+ ${chip_dir}/examples/providers/DeviceInfoProviderImpl.cpp
+)
+
+add_library(
+ ${chip_main}
+ STATIC
+ ${chip_main_sources}
+)
+
+chip_configure_data_model(chip_main
+ INCLUDE_SERVER
+ ZAP_FILE ${matter_example_path}/../air-purifier-common/air-purifier-app.zap
+)
+
+if (matter_enable_rpc)
+target_include_directories(
+ ${chip_main}
+ PUBLIC
+ #rpc
+ ${chip_dir}/examples/platform/ameba
+ ${chip_dir}/examples/platform/ameba/pw_sys_io/public
+ ${chip_dir}/examples/common
+ ${chip_dir}/examples/common/pigweed
+ ${chip_dir}/examples/common/pigweed/ameba
+ ${chip_dir}/src
+ ${chip_dir}/src/lib/support
+ ${pigweed_dir}/pw_rpc/nanopb/public
+)
+endif (matter_enable_rpc)
+
+target_include_directories(
+ ${chip_main}
+ PUBLIC
+ ${inc_path}
+ ${chip_dir}/zzz_generated/air-purifier-app
+ ${chip_dir}/zzz_generated/air-purifier-app/zap-generated
+ ${chip_dir}/zzz_generated/app-common
+ ${chip_dir}/examples/air-purifier-app/air-purifier-common
+ ${chip_dir}/examples/air-purifier-app/air-purifier-common/include
+ ${chip_dir}/examples/air-purifier-app/ameba/main/include
+ ${chip_dir}/examples/platform/ameba
+ ${chip_dir}/examples/providers
+ ${chip_dir_output}/gen/include
+ ${chip_dir}/src/include/
+ ${chip_dir}/src/lib/
+ ${chip_dir}/src/
+ ${chip_dir}/third_party/nlassert/repo/include/
+ ${chip_dir}/src/app/
+ ${chip_dir}/src/app/util/
+ ${chip_dir}/src/app/server/
+ ${chip_dir}/src/controller/data_model
+ ${chip_dir}/third_party/nlio/repo/include/
+ ${chip_dir}/third_party/nlunit-test/repo/src
+)
+
+if (matter_enable_rpc)
+target_link_libraries(${chip_main} PUBLIC
+ attributes_service.nanopb_rpc
+ button_service.nanopb_rpc
+ descriptor_service.nanopb_rpc
+ device_service.nanopb_rpc
+ lighting_service.nanopb_rpc
+ locking_service.nanopb_rpc
+ wifi_service.nanopb_rpc
+ pw_checksum
+ pw_hdlc
+ pw_log
+ pw_rpc.server
+ pw_sys_io
+ pw_trace_tokenized
+ pw_trace_tokenized.trace_buffer
+ pw_trace_tokenized.rpc_service
+ pw_trace_tokenized.protos.nanopb_rpc
+ PwRpc
+)
+
+link_directories(
+ ${chip_dir_output}/lib
+)
+endif (matter_enable_rpc)
+
+list(
+ APPEND chip_main_flags
+
+ -DINET_CONFIG_ENABLE_IPV4=0
+ -DCHIP_PROJECT=1
+ -DCHIP_DEVICE_LAYER_TARGET=Ameba
+ -DUSE_ZAP_CONFIG
+ -DCHIP_HAVE_CONFIG_H
+ -DMBEDTLS_CONFIG_FILE=
+)
+
+if (matter_enable_persistentstorage_audit)
+list(
+ APPEND chip_main_flags
+
+ -DCHIP_SUPPORT_ENABLE_STORAGE_API_AUDIT
+)
+endif (matter_enable_persistentstorage_audit)
+
+if (matter_enable_rpc)
+list(
+ APPEND chip_main_flags
+
+ -DPW_RPC_ATTRIBUTE_SERVICE=1
+ -DPW_RPC_BUTTON_SERVICE=1
+ -DPW_RPC_DESCRIPTOR_SERVICE=1
+ -DPW_RPC_DEVICE_SERVICE=1
+ -DPW_RPC_LIGHTING_SERVICE=1
+ -DPW_RPC_LOCKING_SERVICE=1
+ -DCONFIG_ENABLE_PW_RPC=1
+)
+endif (matter_enable_rpc)
+
+list(
+ APPEND chip_main_cpp_flags
+
+ -Wno-unused-parameter
+ -std=c++17
+ -fno-rtti
+)
+target_compile_definitions(${chip_main} PRIVATE ${chip_main_flags} )
+target_compile_options(${chip_main} PRIVATE ${chip_main_cpp_flags})
+
+# move static library post build command
+add_custom_command(
+ TARGET ${chip_main}
+ POST_BUILD
+ COMMAND cp lib${chip_main}.a ${CMAKE_CURRENT_SOURCE_DIR}/lib/application
+)
diff --git a/examples/air-purifier-app/ameba/main/CHIPDeviceManager.cpp b/examples/air-purifier-app/ameba/main/CHIPDeviceManager.cpp
new file mode 100644
index 00000000000000..0c73b5506f0849
--- /dev/null
+++ b/examples/air-purifier-app/ameba/main/CHIPDeviceManager.cpp
@@ -0,0 +1,112 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file
+ * This file implements the CHIP Device Interface that is used by
+ * applications to interact with the CHIP stack
+ *
+ */
+
+#include
+
+#include "CHIPDeviceManager.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+using namespace ::chip;
+using namespace ::chip::app;
+using namespace ::chip::app::Clusters;
+using namespace ::chip::Credentials;
+
+namespace chip {
+
+namespace DeviceManager {
+
+using namespace ::chip::DeviceLayer;
+
+chip::DeviceLayer::FactoryDataProvider mFactoryDataProvider;
+
+void CHIPDeviceManager::CommonDeviceEventHandler(const ChipDeviceEvent * event, intptr_t arg)
+{
+ CHIPDeviceManagerCallbacks * cb = reinterpret_cast(arg);
+ if (cb != nullptr)
+ {
+ cb->DeviceEventCallback(event, reinterpret_cast(cb));
+ }
+}
+
+CHIP_ERROR CHIPDeviceManager::Init(CHIPDeviceManagerCallbacks * cb)
+{
+ CHIP_ERROR err;
+ mCB = cb;
+
+ err = Platform::MemoryInit();
+ SuccessOrExit(err);
+
+ err = PlatformMgr().InitChipStack();
+ SuccessOrExit(err);
+
+ err = mFactoryDataProvider.Init();
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(DeviceLayer, "Error initializing FactoryData!");
+ ChipLogError(DeviceLayer, "Check if you have flashed it correctly!");
+ }
+ SetCommissionableDataProvider(&mFactoryDataProvider);
+ SetDeviceAttestationCredentialsProvider(&mFactoryDataProvider);
+ SetDeviceInstanceInfoProvider(&mFactoryDataProvider);
+
+ if (CONFIG_NETWORK_LAYER_BLE)
+ {
+ ConnectivityMgr().SetBLEAdvertisingEnabled(true);
+ }
+
+ PlatformMgr().AddEventHandler(CHIPDeviceManager::CommonDeviceEventHandler, reinterpret_cast(cb));
+
+ // // Start a task to run the CHIP Device event loop.
+ err = PlatformMgr().StartEventLoopTask();
+ SuccessOrExit(err);
+
+exit:
+ return err;
+}
+} // namespace DeviceManager
+} // namespace chip
+
+void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath, uint8_t type, uint16_t size,
+ uint8_t * value)
+{
+ if (AirPurifierManager::GetInstance() != nullptr)
+ {
+ AirPurifierManager::GetInstance()->PostAttributeChangeCallback(attributePath.mEndpointId, attributePath.mClusterId,
+ attributePath.mAttributeId, type, size, value);
+ }
+}
diff --git a/examples/air-purifier-app/ameba/main/DeviceCallbacks.cpp b/examples/air-purifier-app/ameba/main/DeviceCallbacks.cpp
new file mode 100644
index 00000000000000..0a5d9dd2617ce1
--- /dev/null
+++ b/examples/air-purifier-app/ameba/main/DeviceCallbacks.cpp
@@ -0,0 +1,182 @@
+/*
+ *
+ * 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.
+ */
+
+/**
+ * @file DeviceCallbacks.cpp
+ *
+ * Implements all the callbacks to the application from the CHIP Stack
+ *
+ **/
+#include "DeviceCallbacks.h"
+
+#include "CHIPDeviceManager.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR
+#include
+#endif
+
+static const char * TAG = "app-devicecallbacks";
+
+using namespace ::chip;
+using namespace ::chip::Inet;
+using namespace ::chip::System;
+using namespace ::chip::DeviceLayer;
+using namespace ::chip::DeviceManager;
+using namespace ::chip::Logging;
+
+uint32_t identifyTimerCount;
+constexpr uint32_t kIdentifyTimerDelayMS = 250;
+constexpr uint32_t kInitOTARequestorDelaySec = 3;
+
+#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR
+void InitOTARequestorHandler(System::Layer * systemLayer, void * appState)
+{
+ OTAInitializer::Instance().InitOTARequestor();
+}
+#endif
+
+void DeviceCallbacks::DeviceEventCallback(const ChipDeviceEvent * event, intptr_t arg)
+{
+ switch (event->Type)
+ {
+ case DeviceEventType::kInternetConnectivityChange:
+ OnInternetConnectivityChange(event);
+ break;
+
+ case DeviceEventType::kCHIPoBLEConnectionEstablished:
+ ChipLogProgress(DeviceLayer, "CHIPoBLE Connection Established");
+ break;
+
+ case DeviceEventType::kCHIPoBLEConnectionClosed:
+ ChipLogProgress(DeviceLayer, "CHIPoBLE Connection Closed");
+ break;
+
+ case DeviceEventType::kCHIPoBLEAdvertisingChange:
+ ChipLogProgress(DeviceLayer, "CHIPoBLE advertising has changed");
+ break;
+
+ case DeviceEventType::kInterfaceIpAddressChanged:
+ if ((event->InterfaceIpAddressChanged.Type == InterfaceIpChangeType::kIpV4_Assigned) ||
+ (event->InterfaceIpAddressChanged.Type == InterfaceIpChangeType::kIpV6_Assigned))
+ {
+ // MDNS server restart on any ip assignment: if link local ipv6 is configured, that
+ // will not trigger a 'internet connectivity change' as there is no internet
+ // connectivity. MDNS still wants to refresh its listening interfaces to include the
+ // newly selected address.
+ chip::app::DnssdServer::Instance().StartServer();
+ }
+ if (event->InterfaceIpAddressChanged.Type == InterfaceIpChangeType::kIpV6_Assigned)
+ {
+ ChipLogProgress(DeviceLayer, "Initializing route hook...");
+ ameba_route_hook_init();
+ }
+ break;
+
+ case DeviceEventType::kCommissioningComplete:
+ ChipLogProgress(DeviceLayer, "Commissioning Complete");
+ chip::DeviceLayer::Internal::AmebaUtils::SetCurrentProvisionedNetwork();
+ break;
+ }
+}
+
+void DeviceCallbacks::OnInternetConnectivityChange(const ChipDeviceEvent * event)
+{
+ if (event->InternetConnectivityChange.IPv4 == kConnectivity_Established)
+ {
+ printf("IPv4 Server ready...");
+ chip::app::DnssdServer::Instance().StartServer();
+ }
+ else if (event->InternetConnectivityChange.IPv4 == kConnectivity_Lost)
+ {
+ printf("Lost IPv4 connectivity...");
+ }
+ if (event->InternetConnectivityChange.IPv6 == kConnectivity_Established)
+ {
+ printf("IPv6 Server ready...");
+ chip::app::DnssdServer::Instance().StartServer();
+#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR
+ // Init OTA requestor only when we have gotten IPv6 address
+ if (!OTAInitializer::Instance().CheckInit())
+ {
+ ChipLogProgress(DeviceLayer, "Initializing OTA");
+ chip::DeviceLayer::SystemLayer().StartTimer(chip::System::Clock::Seconds32(kInitOTARequestorDelaySec),
+ InitOTARequestorHandler, nullptr);
+ }
+#endif
+ }
+ else if (event->InternetConnectivityChange.IPv6 == kConnectivity_Lost)
+ {
+ printf("Lost IPv6 connectivity...");
+ }
+}
+
+void DeviceCallbacks::PostAttributeChangeCallback(EndpointId endpointId, ClusterId clusterId, AttributeId attributeId, uint8_t type,
+ uint16_t size, uint8_t * value)
+{
+ switch (clusterId)
+ {
+ case app::Clusters::Identify::Id:
+ OnIdentifyPostAttributeChangeCallback(endpointId, attributeId, value);
+ break;
+
+ default:
+ ChipLogProgress(Zcl, "Unknown cluster ID: " ChipLogFormatMEI, ChipLogValueMEI(clusterId));
+ break;
+ }
+}
+
+void IdentifyTimerHandler(Layer * systemLayer, void * appState)
+{
+ if (identifyTimerCount)
+ {
+ systemLayer->StartTimer(Clock::Milliseconds32(kIdentifyTimerDelayMS), IdentifyTimerHandler, appState);
+ // Decrement the timer count.
+ identifyTimerCount--;
+ }
+}
+
+void DeviceCallbacks::OnIdentifyPostAttributeChangeCallback(EndpointId endpointId, AttributeId attributeId, uint8_t * value)
+{
+ VerifyOrExit(attributeId == app::Clusters::Identify::Attributes::IdentifyTime::Id,
+ ChipLogError(DeviceLayer, "[%s] Unhandled Attribute ID: '0x%04x", TAG, attributeId));
+ VerifyOrExit(endpointId == 1, ChipLogError(DeviceLayer, "[%s] Unexpected EndPoint ID: `0x%02x'", TAG, endpointId));
+
+ // timerCount represents the number of callback executions before we stop the timer.
+ // value is expressed in seconds and the timer is fired every 250ms, so just multiply value by 4.
+ // Also, we want timerCount to be odd number, so the ligth state ends in the same state it starts.
+ identifyTimerCount = (*value) * 4;
+
+ DeviceLayer::SystemLayer().CancelTimer(IdentifyTimerHandler, this);
+ DeviceLayer::SystemLayer().StartTimer(Clock::Milliseconds32(kIdentifyTimerDelayMS), IdentifyTimerHandler, this);
+
+exit:
+ return;
+}
diff --git a/examples/air-purifier-app/ameba/main/chipinterface.cpp b/examples/air-purifier-app/ameba/main/chipinterface.cpp
new file mode 100644
index 00000000000000..bcda329cdb8536
--- /dev/null
+++ b/examples/air-purifier-app/ameba/main/chipinterface.cpp
@@ -0,0 +1,175 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include
+
+#include "CHIPDeviceManager.h"
+#include "DeviceCallbacks.h"
+#include "Server.h"
+#include
+
+#include "chip_porting.h"
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+#if CONFIG_ENABLE_PW_RPC
+#include "Rpc.h"
+#endif
+
+#define AIR_PURIFIER_ENDPOINT 1
+#define AIR_QUALITY_SENSOR_ENDPOINT 2
+#define TEMPERATURE_SENSOR_ENDPOINT 3
+#define RELATIVE_HUMIDITY_SENSOR_ENDPOINT 4
+
+using namespace ::chip;
+using namespace ::chip::app;
+using namespace ::chip::DeviceManager;
+using namespace ::chip::DeviceLayer;
+using namespace ::chip::System;
+
+namespace { // Network Commissioning
+constexpr EndpointId kNetworkCommissioningEndpointMain = 0;
+constexpr EndpointId kNetworkCommissioningEndpointSecondary = 0xFFFE;
+
+app::Clusters::NetworkCommissioning::Instance
+ sWiFiNetworkCommissioningInstance(kNetworkCommissioningEndpointMain /* Endpoint Id */,
+ &(NetworkCommissioning::AmebaWiFiDriver::GetInstance()));
+} // namespace
+
+void NetWorkCommissioningInstInit()
+{
+ sWiFiNetworkCommissioningInstance.Init();
+
+ // We only have network commissioning on endpoint 0.
+ emberAfEndpointEnableDisable(kNetworkCommissioningEndpointSecondary, false);
+}
+
+static DeviceCallbacks EchoCallbacks;
+chip::DeviceLayer::DeviceInfoProviderImpl gExampleDeviceInfoProvider;
+
+void OnIdentifyStart(Identify *)
+{
+ ChipLogProgress(Zcl, "OnIdentifyStart");
+}
+
+void OnIdentifyStop(Identify *)
+{
+ ChipLogProgress(Zcl, "OnIdentifyStop");
+}
+
+void OnTriggerEffect(Identify * identify)
+{
+ switch (identify->mCurrentEffectIdentifier)
+ {
+ case Clusters::Identify::EffectIdentifierEnum::kBlink:
+ ChipLogProgress(Zcl, "Clusters::Identify::EffectIdentifierEnum::kBlink");
+ break;
+ case Clusters::Identify::EffectIdentifierEnum::kBreathe:
+ ChipLogProgress(Zcl, "Clusters::Identify::EffectIdentifierEnum::kBreathe");
+ break;
+ case Clusters::Identify::EffectIdentifierEnum::kOkay:
+ ChipLogProgress(Zcl, "Clusters::Identify::EffectIdentifierEnum::kOkay");
+ break;
+ case Clusters::Identify::EffectIdentifierEnum::kChannelChange:
+ ChipLogProgress(Zcl, "Clusters::Identify::EffectIdentifierEnum::kChannelChange");
+ break;
+ default:
+ ChipLogProgress(Zcl, "No identifier effect");
+ return;
+ }
+}
+
+static Identify gIdentify1 = {
+ chip::EndpointId{ 1 }, OnIdentifyStart, OnIdentifyStop, Clusters::Identify::IdentifyTypeEnum::kVisibleIndicator,
+ OnTriggerEffect,
+};
+
+static void InitAirPurifierManager(void)
+{
+ Clusters::AirPurifierManager::InitInstance(EndpointId(AIR_PURIFIER_ENDPOINT), EndpointId(AIR_QUALITY_SENSOR_ENDPOINT),
+ EndpointId(TEMPERATURE_SENSOR_ENDPOINT),
+ EndpointId(RELATIVE_HUMIDITY_SENSOR_ENDPOINT));
+
+ SetParentEndpointForEndpoint(AIR_QUALITY_SENSOR_ENDPOINT, AIR_PURIFIER_ENDPOINT);
+ SetParentEndpointForEndpoint(TEMPERATURE_SENSOR_ENDPOINT, AIR_PURIFIER_ENDPOINT);
+ SetParentEndpointForEndpoint(RELATIVE_HUMIDITY_SENSOR_ENDPOINT, AIR_PURIFIER_ENDPOINT);
+}
+
+static void InitServer(intptr_t context)
+{
+ // Init ZCL Data Model and CHIP App Server
+ static chip::CommonCaseDeviceServerInitParams initParams;
+ (void) initParams.InitializeStaticResourcesBeforeServerInit();
+ chip::Server::GetInstance().Init(initParams);
+ gExampleDeviceInfoProvider.SetStorageDelegate(&Server::GetInstance().GetPersistentStorage());
+ chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider);
+
+ NetWorkCommissioningInstInit();
+
+ if (RTW_SUCCESS != wifi_is_connected_to_ap())
+ {
+ // QR code will be used with CHIP Tool
+ PrintOnboardingCodes(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE));
+ }
+
+ InitAirPurifierManager();
+}
+
+extern "C" void ChipTest(void)
+{
+ ChipLogProgress(DeviceLayer, "Air purifier App Demo!");
+ CHIP_ERROR err = CHIP_NO_ERROR;
+
+#if CONFIG_ENABLE_PW_RPC
+ chip::rpc::Init();
+#endif
+
+ initPref();
+
+ CHIPDeviceManager & deviceMgr = CHIPDeviceManager::GetInstance();
+
+ err = deviceMgr.Init(&EchoCallbacks);
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(DeviceLayer, "DeviceManagerInit() - ERROR!\r\n");
+ }
+ else
+ {
+ ChipLogProgress(DeviceLayer, "DeviceManagerInit() - OK\r\n");
+ }
+
+ chip::DeviceLayer::PlatformMgr().ScheduleWork(InitServer, 0);
+}
+
+bool lowPowerClusterSleep()
+{
+ return true;
+}
diff --git a/examples/air-purifier-app/ameba/main/include/CHIPDeviceManager.h b/examples/air-purifier-app/ameba/main/include/CHIPDeviceManager.h
new file mode 100644
index 00000000000000..1a8ac985132365
--- /dev/null
+++ b/examples/air-purifier-app/ameba/main/include/CHIPDeviceManager.h
@@ -0,0 +1,123 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file
+ * This file contains definitions for the CHIP DeviceManager Interface
+ *
+ * This object will co-ordinate multiple activities such as
+ * initialisation, rendezvous, session mgmt and other such
+ * activities within the CHIP stack. This is a singleton object.
+ */
+
+#pragma once
+
+#include
+#include
+#include
+
+#include
+
+#include
+#include
+
+#include
+
+namespace chip {
+namespace DeviceManager {
+
+/**
+ * @brief
+ * This class provides a skeleton for all the callback functions. The functions will be
+ * called by other objects within the CHIP stack for specific events.
+ * Applications interested in receiving specific callbacks can specialize this class and handle
+ * these events in their implementation of this class.
+ */
+class CHIPDeviceManagerCallbacks
+{
+public:
+ /**
+ * @brief
+ * Called when CHIP Device events (PublicEventTypes) are triggered.
+ *
+ * @param event ChipDeviceEvent that occurred
+ * @param arg arguments specific to the event, if any
+ */
+ virtual void DeviceEventCallback(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg) {}
+
+ /**
+ * @brief
+ * Called after an attribute has been changed
+ *
+ * @param endpoint endpoint id
+ * @param clusterID cluster id
+ * @param attributeId attribute id that was changed
+ * @param manufacturerCode manufacturer code
+ * @param type attribute type
+ * @param size size of the attribute
+ * @param value pointer to the new value
+ */
+ virtual void PostAttributeChangeCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, chip::AttributeId attributeId,
+ uint8_t type, uint16_t size, uint8_t * value)
+ {}
+ virtual ~CHIPDeviceManagerCallbacks() {}
+};
+
+/**
+ * @brief
+ * A common class that drives other components of the CHIP stack
+ */
+class DLL_EXPORT CHIPDeviceManager
+{
+public:
+ CHIPDeviceManager(const CHIPDeviceManager &) = delete;
+ CHIPDeviceManager(const CHIPDeviceManager &&) = delete;
+ CHIPDeviceManager & operator=(const CHIPDeviceManager &) = delete;
+
+ static CHIPDeviceManager & GetInstance()
+ {
+ static CHIPDeviceManager instance;
+ return instance;
+ }
+
+ /**
+ * @brief
+ * Initialise CHIPDeviceManager
+ *
+ * @param cb Application's instance of the CHIPDeviceManagerCallbacks for consuming events
+ */
+ CHIP_ERROR Init(CHIPDeviceManagerCallbacks * cb);
+
+ /**
+ * @brief
+ * Fetch a pointer to the registered CHIPDeviceManagerCallbacks object.
+ *
+ */
+ CHIPDeviceManagerCallbacks * GetCHIPDeviceManagerCallbacks() { return mCB; }
+
+ /**
+ * Use internally for registration of the ChipDeviceEvents
+ */
+ static void CommonDeviceEventHandler(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg);
+
+private:
+ CHIPDeviceManagerCallbacks * mCB = nullptr;
+ CHIPDeviceManager() {}
+};
+
+} // namespace DeviceManager
+} // namespace chip
diff --git a/examples/air-purifier-app/ameba/main/include/CHIPProjectAppConfig.h b/examples/air-purifier-app/ameba/main/include/CHIPProjectAppConfig.h
new file mode 100644
index 00000000000000..e3a2e726e2db2a
--- /dev/null
+++ b/examples/air-purifier-app/ameba/main/include/CHIPProjectAppConfig.h
@@ -0,0 +1,38 @@
+/*
+ *
+ * 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 the CHIPProjectConfig from config/standalone
+#include
+
+#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY 0
+
+#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT 1
+
+#define CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY 1
+
+#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DEVICE_TYPE 1
+
+#define CHIP_DEVICE_CONFIG_DEVICE_TYPE 0x002D // Air Purifier
+
+#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DEVICE_NAME 1
+
+#define CHIP_DEVICE_ENABLE_PORT_PARAMS 1
+
+#define CHIP_DEVICE_CONFIG_DEVICE_NAME "Air Purifier"
diff --git a/examples/air-purifier-app/ameba/main/include/DeviceCallbacks.h b/examples/air-purifier-app/ameba/main/include/DeviceCallbacks.h
new file mode 100755
index 00000000000000..696fbd1c2b95c4
--- /dev/null
+++ b/examples/air-purifier-app/ameba/main/include/DeviceCallbacks.h
@@ -0,0 +1,43 @@
+/*
+ *
+ * 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.
+ */
+
+/**
+ * @file DeviceCallbacks.h
+ *
+ * Implementations for the DeviceManager callbacks for this application
+ *
+ **/
+
+#pragma once
+
+#include "CHIPDeviceManager.h"
+#include
+#include
+#include
+
+class DeviceCallbacks : public chip::DeviceManager::CHIPDeviceManagerCallbacks
+{
+public:
+ virtual void DeviceEventCallback(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg);
+ void PostAttributeChangeCallback(chip::EndpointId endpointId, chip::ClusterId clusterId, chip::AttributeId attributeId,
+ uint8_t type, uint16_t size, uint8_t * value) override;
+
+private:
+ void OnInternetConnectivityChange(const chip::DeviceLayer::ChipDeviceEvent * event);
+ void OnIdentifyPostAttributeChangeCallback(chip::EndpointId endpointId, chip::AttributeId attributeId, uint8_t * value);
+};
diff --git a/examples/air-purifier-app/ameba/third_party/connectedhomeip b/examples/air-purifier-app/ameba/third_party/connectedhomeip
new file mode 120000
index 00000000000000..11a54ed360106c
--- /dev/null
+++ b/examples/air-purifier-app/ameba/third_party/connectedhomeip
@@ -0,0 +1 @@
+../../../../
\ No newline at end of file
diff --git a/examples/air-purifier-app/cc32xx/.gn b/examples/air-purifier-app/cc32xx/.gn
new file mode 100644
index 00000000000000..3d48789e30ab3d
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/.gn
@@ -0,0 +1,28 @@
+# Copyright (c) 2020 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.
+
+import("//build_overrides/build.gni")
+
+# The location of the build configuration file.
+buildconfig = "${build_root}/config/BUILDCONFIG.gn"
+
+# CHIP uses angle bracket includes.
+check_system_includes = true
+
+default_args = {
+ target_cpu = "arm"
+ target_os = "freertos"
+
+ import("//args.gni")
+}
diff --git a/examples/air-purifier-app/cc32xx/BUILD.gn b/examples/air-purifier-app/cc32xx/BUILD.gn
new file mode 100755
index 00000000000000..51916cc32d646f
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/BUILD.gn
@@ -0,0 +1,126 @@
+# Copyright (c) 2020 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.
+
+import("//build_overrides/build.gni")
+import("//build_overrides/chip.gni")
+import("//build_overrides/ti_simplelink_sdk.gni")
+import("${build_root}/config/defaults.gni")
+import("${chip_root}/src/platform/device.gni")
+import("${ti_simplelink_sdk_build_root}/ti_simplelink_executable.gni")
+import("${ti_simplelink_sdk_build_root}/ti_simplelink_sdk.gni")
+
+assert(current_os == "freertos")
+
+project_dir = "${chip_root}/examples/air-purifier-app/cc32xx"
+
+ti_simplelink_sdk("sdk") {
+ include_dirs = [ "${project_dir}/main/include" ]
+
+ defines = []
+ if (is_debug) {
+ defines += [ "BUILD_RELEASE=0" ]
+ } else {
+ defines += [ "BUILD_RELEASE=1" ]
+ }
+}
+
+ti_sysconfig("sysconfig") {
+ sources = [ "${project_dir}/chip.syscfg" ]
+ outputs = [
+ "ti_drivers_net_wifi_config.c",
+ "ti_net_config.c",
+ "ti_drivers_config.c",
+ "ti_drivers_config.h",
+ ]
+}
+
+source_set("air-purifier_app_sdk") {
+ defines = []
+
+ configs -= [ "${build_root}/config/compiler:std_default" ]
+ configs += [ ":sdk_posix_config" ]
+
+ sources = [
+ "${chip_root}/src/platform/cc32xx/Logging.cpp",
+ "${project_dir}/main/cc32xxWifiInit.c",
+ "${project_dir}/main/main.cpp",
+ "${ti_simplelink_sdk_root}/examples/rtos/common/ifmod/lwip_if.c",
+ "${ti_simplelink_sdk_root}/examples/rtos/common/ifmod/utils_if.c",
+ "${ti_simplelink_sdk_root}/examples/rtos/common/ifmod/wifi_if.c",
+ ]
+
+ include_dirs = [
+ "${project_dir}/include",
+ "${project_dir}/main",
+ "${project_dir}/main/ifmod/",
+ "${chip_root}/src/platform/cc32xx",
+ "${chip_root}/examples/platform/cc32xx",
+ ]
+
+ deps = [
+ ":sdk",
+ ":sysconfig",
+ "${chip_root}/examples/air-purifier-app/air-purifier-common",
+ "${chip_root}/src/lib",
+ "${chip_root}/src/setup_payload",
+ ]
+}
+
+ti_simplelink_executable("air-purifier_app") {
+ defines = []
+ output_name = "chip-${ti_simplelink_board}-air-purifier-example.out"
+
+ sources = [
+ "${chip_root}/examples/air-purifier-app/air-purifier-common/src/air-purifier-manager.cpp",
+ "${chip_root}/examples/air-purifier-app/air-purifier-common/src/air-quality-sensor-manager.cpp",
+ "${chip_root}/examples/air-purifier-app/air-purifier-common/src/filter-delegates.cpp",
+ "${project_dir}/main/AppTask.cpp",
+ "${project_dir}/main/CHIPDeviceManager.cpp",
+ "${project_dir}/main/CXXExceptionStubs.cpp",
+ "${project_dir}/main/DeviceCallbacks.cpp",
+ "${project_dir}/main/ZclCallbacks.cpp",
+ ]
+
+ deps = [
+ ":air-purifier_app_sdk",
+ ":sdk",
+ ":sysconfig",
+ "${chip_root}/examples/air-purifier-app/air-purifier-common",
+ "${chip_root}/examples/platform/cc32xx:cc32xx-attestation-credentials",
+ "${chip_root}/src/lib",
+ "${chip_root}/src/setup_payload",
+ ]
+
+ include_dirs = [
+ "${project_dir}",
+ "${project_dir}/main",
+ "${chip_root}/examples/air-purifier-app/air-purifier-common/include",
+ ]
+
+ cflags = [
+ "-Wno-implicit-fallthrough",
+ "-Wno-sign-compare",
+ "-Wconversion",
+ ]
+
+ output_dir = root_out_dir
+}
+
+group("cc32xx") {
+ deps = [ ":air-purifier_app" ]
+}
+
+group("default") {
+ deps = [ ":cc32xx" ]
+}
diff --git a/examples/air-purifier-app/cc32xx/README.md b/examples/air-purifier-app/cc32xx/README.md
new file mode 100644
index 00000000000000..529c3c245be9ca
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/README.md
@@ -0,0 +1,163 @@
+# Matter `CC32XXSF` Air Purifier Example Application
+
+An example application showing the use of [Matter][matter] on the Texas
+Instruments CC32XX family of Wireless MCUs.
+
+---
+
+- [Matter `CC32XXSF` Air Purifier Example Application](#matter-cc32xxsf-air-purifier-example-application)
+ - [Introduction](#introduction)
+ - [Device UI](#device-ui)
+ - [Building](#building)
+ - [Preparation](#preparation)
+ - [Compilation](#compilation)
+ - [Adding DAC Certificates](#adding-dac-certificates)
+ - [Programming](#programming)
+ - [Code Composer Studio](#code-composer-studio)
+ - [Viewing Logging Output](#viewing-logging-output)
+ - [Running the Example](#running-the-example)
+ - [Provisioning](#provisioning)
+ - [Bluetooth LE Provisioning](#bluetooth-le-provisioning)
+
+---
+
+## Introduction
+
+The CC32XX air purifier example application provides a working demonstration of
+a connected air purifier device. This uses the open-source CHIP implementation
+and the Texas Instruments SimpleLink™ Wi-Fi® CC32xx software development kit.
+
+By default this example targets the [CC3235SF_LAUNCHXL][cc3235sf_launchxl]
+LaunchPad, but the example application is enabled to build on the whole `CC32XX`
+family of MCUs.
+
+The air purifier example is intended to serve both as a means to explore the
+workings of CHIP, as well as a template for creating real products based on the
+Texas Instruments devices.
+
+## Device UI
+
+The left button (`BTN-1`) is used to enable provisioning (provisioning is
+enabled as "oneshot" by default). The right button (`BTN-2`) long press is used
+to reset the device.
+
+## Building
+
+### Preparation
+
+Some initial setup is necessary for preparing the build environment. This
+section will need to be done when migrating to new versions of the SDK. This
+guide assumes that the environment is linux based, and recommends Ubuntu 20.04.
+
+- Download and install [SysConfig][sysconfig] ([recommended
+ version][sysconfig_recommended]). This can be done simply with the following
+ commands.
+
+ ```
+ $ cd ~
+ $ wget https://software-dl.ti.com/ccs/esd/sysconfig/sysconfig-1.13.0_2553-setup.run
+ $ chmod +x sysconfig-1.13.0_2553-setup.run
+ $ ./sysconfig-1.13.0_2553-setup.run
+ ```
+
+- Run the bootstrap script to setup the build environment.
+
+ ```
+ $ cd ~/connectedhomeip
+ $ source ./scripts/bootstrap.sh
+ ```
+
+### Compilation
+
+It is necessary to activate the environment in every new shell. Then run GN and
+Ninja to build the executable.
+
+- Activate the build environment with the repository activate script.
+
+ ```
+ $ cd ~/connectedhomeip
+ $ source ./scripts/activate.sh
+ ```
+
+- Run the build to produce a default executable. By default on Linux the
+ Sysconfig is located in a `ti` folder in the user's home directory, and you
+ must provide the absolute path for it. For example
+ `/home/username/ti/sysconfig_1.13.0`. On Windows the default directory is
+ `C:\ti`. Take note of this install path, as it will be used in the next
+ step.
+
+ ```
+ $ cd ~/connectedhomeip/examples/air-purifier-app/cc32xx
+ $ gn gen out/debug --args="ti_sysconfig_root=\"$HOME/ti/sysconfig_1.13.0\""
+ $ ninja -C out/debug
+ ```
+
+## Adding DAC Certificates
+
+To add custom DAC Certificates, the `CC32XXDeviceAttestationCreds.cpp` file in
+`examples/platform/cc32xx` can be modified. The private key, public key, DAC
+cert and PAI cert arrays all need to be replaced.
+
+## Programming
+
+Loading the built image onto a LaunchPad is supported through Code Composer
+Studio (CCS). Code Composer Studio can be used to load the image and debug the
+source code. UniFlash programming (bin) image is not generated currently.
+
+### Code Composer Studio
+
+Programming with CCS will allow for a full debug environment within the IDE.
+This is accomplished by creating a target connection to the XDS110 debugger and
+starting a project-less debug session. The CCS IDE will attempt to find the
+source files on the local machine based on the debug information embedded within
+the ELF. CCS may prompt you to find the source code if the image was built on
+another machine or the source code is located in a different location than is
+recorded within the ELF.
+
+Download and install [Code Composer Studio][ccs].
+
+First open CCS and create a new workspace.
+
+Create a target connection (sometimes called the CCXML) for your target SoC and
+debugger as described in the [Manual Method][ccs_manual_method] section of the
+CCS User's Guide.
+
+Next initiate a project-less debug session as described in the [Manual
+Launch][ccs_manual_launch] section of the CCS User's Guide.
+
+CCS should switch to the debug view described in the [After
+Launch][ccs_after_launch] section of the User's Guide. The SoC core will likely
+be disconnected and symbols will not be loaded. Connect to the core as described
+in the [Debug View][ccs_debug_view] section of the User's Guide. Once the core
+is connected, use the `Load` button on the toolbar to load the ELF image.
+
+Note that the default configuration of the CCXML uses 2-wire cJTAG instead of
+the full 4-wire JTAG connection to match the default jumper configuration of the
+LaunchPad.
+
+## Viewing Logging Output
+
+By default the log output will be sent to the Application/User UART. Open a
+terminal emulator to that port to see the output with the following options:
+
+| Parameter | Value |
+| ------------ | -------- |
+| Speed (baud) | `115200` |
+| Data bits | `8` |
+| Stop bits | `1` |
+| Parity | `None` |
+| Flow control | `None` |
+
+## Running the Example
+
+### Provisioning
+
+The first step to bring the Matter device onto the network is to provision it.
+The example accomplishes this through the proprietary SimpleLink provisioning
+method (AP or Smart Config) using the SimpleLink Starter Pro mobile app. Once
+the device is connected to the local AP, commissioning can be triggered using
+"OnNetwork" configuration.
+
+#### Bluetooth LE Provisioning
+
+BLE provisioning is not supported currently.
diff --git a/examples/air-purifier-app/cc32xx/args.gni b/examples/air-purifier-app/cc32xx/args.gni
new file mode 100755
index 00000000000000..aaf39441ba3490
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/args.gni
@@ -0,0 +1,44 @@
+# Copyright (c) 2020 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.
+
+import("//build_overrides/chip.gni")
+import("${chip_root}/config/standalone/args.gni")
+import("${chip_root}/examples/platform/cc32xx/args.gni")
+
+ti_simplelink_sdk_target = get_label_info(":sdk", "label_no_toolchain")
+ti_simplelink_sysconfig_target =
+ get_label_info(":sysconfig", "label_no_toolchain")
+
+ti_simplelink_board = "CC3235SF_LAUNCHXL"
+
+# use -Os instead of -Og
+#is_debug = false
+
+# disable BLE for now
+chip_config_network_layer_ble = false
+chip_bypass_rendezvous = false
+
+#enable logging
+chip_progress_logging = true
+chip_detail_logging = true
+chip_automation_logging = true
+
+## Disable lock tracking, since our FreeRTOS configuration does not set
+# INCLUDE_xSemaphoreGetMutexHolder
+chip_stack_lock_tracking = "none"
+
+matter_device_vid = "0xFFF1"
+matter_device_pid = "0x8006"
+matter_software_ver = "0x0001"
+matter_software_ver_str = "1.0d1"
diff --git a/examples/air-purifier-app/cc32xx/build_overrides b/examples/air-purifier-app/cc32xx/build_overrides
new file mode 120000
index 00000000000000..194ee0b812dc3d
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/build_overrides
@@ -0,0 +1 @@
+../../build_overrides/
\ No newline at end of file
diff --git a/examples/air-purifier-app/cc32xx/chip.syscfg b/examples/air-purifier-app/cc32xx/chip.syscfg
new file mode 100755
index 00000000000000..14fd3130d99c4f
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/chip.syscfg
@@ -0,0 +1,74 @@
+/**
+ * Import the modules used in this configuration.
+ */
+const Display = scripting.addModule("/ti/display/Display");
+const Display1 = Display.addInstance();
+const SPI = scripting.addModule("/ti/drivers/SPI");
+const Button = scripting.addModule("/ti/drivers/apps/Button");
+const Button1 = Button.addInstance();
+const Button2 = Button.addInstance();
+const LED = scripting.addModule("/ti/drivers/apps/LED");
+const LED1 = LED.addInstance();
+const LED2 = LED.addInstance();
+const LED3 = LED.addInstance();
+const SimpleLinkWifi = scripting.addModule("/ti/drivers/net/wifi/SimpleLinkWifi");
+const net_utils = scripting.addModule("/ti/drivers/net/wifi/net_utils", {}, false);
+const net_utils1 = net_utils.addInstance();
+const HTTPClient = scripting.addModule("/ti/net/HTTPClient", {}, false);
+const HTTPClient1 = HTTPClient.addInstance();
+const MQTT = scripting.addModule("/ti/net/MQTT", {}, false);
+const MQTT1 = MQTT.addInstance();
+const SNTP = scripting.addModule("/ti/net/SNTP");
+const SlNet = scripting.addModule("/ti/net/SlNet", {}, false);
+const SlNet1 = SlNet.addInstance();
+
+/**
+ * Write custom configuration values to the imported modules.
+ */
+Display1.$name = "CONFIG_Display_0";
+Display1.$hardware = system.deviceData.board.components.XDS110UART;
+Display1.uart.$name = "CONFIG_UART2_0";
+
+const Power = scripting.addModule("/ti/drivers/Power", {}, false);
+Power.parkPins.$name = "ti_drivers_power_PowerCC32XXPins0";
+
+Button1.$hardware = system.deviceData.board.components.SW2;
+Button1.$name = "CONFIG_BTN_LEFT";
+
+Button2.$hardware = system.deviceData.board.components.SW3;
+Button2.$name = "CONFIG_BTN_RIGHT";
+
+LED1.$hardware = system.deviceData.board.components.LED_BLUE;
+LED1.$name = "CONFIG_LED_BLUE";
+
+LED2.$hardware = system.deviceData.board.components.LED_GREEN;
+LED2.$name = "CONFIG_LED_GREEN";
+
+LED3.$hardware = system.deviceData.board.components.LED_RED;
+LED3.dimmable = true;
+LED3.$name = "CONFIG_LED_RED";
+
+net_utils1.$name = "CONFIG_NET_UTILS_0";
+
+HTTPClient1.$name = "CONFIG_HTTPCLIENT_0";
+
+MQTT1.$name = "CONFIG_MQTT_0";
+
+SlNet1.$name = "CONFIG_SLNET_0";
+
+/**
+ * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future
+ * version of the tool will not impact the pinmux you originally saw. These lines can be completely deleted in order to
+ * re-solve from scratch.
+ */
+Display1.uart.uart.$suggestSolution = "UART1";
+Display1.uart.uart.txPin.$suggestSolution = "ball.55";
+Display1.uart.uart.txDmaChannel.$suggestSolution = "UDMA_CH11";
+Display1.uart.uart.rxPin.$suggestSolution = "ball.57";
+Display1.uart.uart.rxDmaChannel.$suggestSolution = "UDMA_CH10";
+Button1.button.$suggestSolution = "boosterpack.3";
+Button2.button.$suggestSolution = "boosterpack.11";
+LED1.ledPin.$suggestSolution = "boosterpack.29";
+LED2.ledPin.$suggestSolution = "boosterpack.10";
+LED3.pwmPin.timer.$suggestSolution = "Timer3";
+LED3.pwmPin.timer.pwmPin.$suggestSolution = "boosterpack.9";
diff --git a/examples/air-purifier-app/cc32xx/main/AppConfig.h b/examples/air-purifier-app/cc32xx/main/AppConfig.h
new file mode 100755
index 00000000000000..913188f41fab36
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/AppConfig.h
@@ -0,0 +1,31 @@
+/*
+ * 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
+
+// Logging
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int cc32xxLogInit(void);
+void cc32xxLog(const char * aFormat, ...);
+#define PLAT_LOG(...) cc32xxLog(__VA_ARGS__);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/examples/air-purifier-app/cc32xx/main/AppEvent.h b/examples/air-purifier-app/cc32xx/main/AppEvent.h
new file mode 100755
index 00000000000000..de612090ee8c01
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/AppEvent.h
@@ -0,0 +1,57 @@
+/*
+ *
+ * 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
+
+struct AppEvent;
+typedef void (*EventHandler)(AppEvent *);
+
+struct AppEvent
+{
+ enum AppEventType
+ {
+ kEventType_None = 0,
+ kEventType_ButtonLeft,
+ kEventType_ButtonRight,
+ kEventType_AppEvent,
+ };
+
+ enum AppEventButtonType
+ {
+ kAppEventButtonType_None = 0,
+ kAppEventButtonType_Clicked,
+ kAppEventButtonType_LongClicked,
+ };
+
+ enum AppEventType Type;
+
+ union
+ {
+ struct
+ {
+ enum AppEventButtonType Type;
+ } ButtonEvent;
+
+ struct
+ {
+ void * Context;
+ } BoltLockEvent;
+ };
+
+ EventHandler Handler;
+};
diff --git a/examples/air-purifier-app/cc32xx/main/AppTask.cpp b/examples/air-purifier-app/cc32xx/main/AppTask.cpp
new file mode 100644
index 00000000000000..fa112c1ee23a21
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/AppTask.cpp
@@ -0,0 +1,282 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ * Copyright (c) 2020 Texas Instruments Incorporated
+ * 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 "AppConfig.h"
+#include "AppEvent.h"
+
+#include
+#include
+#include
+#include
+
+#include "FreeRTOS.h"
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+#include
+#include
+
+#include
+
+#include
+/* syscfg */
+#include
+#include
+
+extern "C" {
+extern int WiFi_init();
+extern void DisplayBanner();
+}
+
+#define APP_TASK_STACK_SIZE (4096)
+#define APP_TASK_PRIORITY 4
+#define APP_EVENT_QUEUE_SIZE 10
+
+#define AIR_PURIFIER_ENDPOINT 1
+#define AIR_QUALITY_SENSOR_ENDPOINT 2
+#define RELATIVE_HUMIDITY_SENSOR_ENDPOINT 3
+#define TEMPERATURE_SENSOR_ENDPOINT 4
+
+// Added the below three for DNS Server Initialization
+using namespace ::chip;
+using namespace ::chip::Inet;
+using namespace ::chip::System;
+
+using namespace ::chip::Credentials;
+using namespace ::chip::DeviceLayer;
+using namespace ::chip::DeviceManager;
+
+using namespace chip::app;
+using namespace chip::app::Clusters;
+
+static TaskHandle_t sAppTaskHandle;
+static QueueHandle_t sAppEventQueue;
+
+extern LED_Handle gLedGreenHandle, gLedRedHandle;
+static Button_Handle gButtonRightHandle;
+
+AppTask AppTask::sAppTask;
+
+static DeviceCallbacks EchoCallbacks;
+
+int AppTask::StartAppTask()
+{
+ int ret = 0;
+
+ sAppEventQueue = xQueueCreate(APP_EVENT_QUEUE_SIZE, sizeof(AppEvent));
+ if (sAppEventQueue == NULL)
+ {
+ PLAT_LOG("Failed to allocate app event queue");
+ while (true)
+ ;
+ }
+
+ // Start App task.
+ if (xTaskCreate(AppTaskMain, "APP", APP_TASK_STACK_SIZE / sizeof(StackType_t), NULL, APP_TASK_PRIORITY, &sAppTaskHandle) !=
+ pdPASS)
+ {
+ PLAT_LOG("Failed to create app task");
+ while (true)
+ ;
+ }
+ return ret;
+}
+
+int AppTask::Init()
+{
+ CHIP_ERROR ret;
+ LED_Params ledParams;
+ Button_Params buttonParams;
+
+ cc32xxLogInit();
+
+ /* Initial Terminal, and print Application name */
+ DisplayBanner();
+
+ // Init Chip memory management before the stack
+ PLAT_LOG("Initialize Memory");
+ chip::Platform::MemoryInit();
+
+ // Initialize LEDs
+ PLAT_LOG("Initialize LEDs");
+ LED_init();
+
+ LED_Params_init(&ledParams); // default PWM LED
+ gLedRedHandle = LED_open(CONFIG_LED_RED, &ledParams);
+ LED_setOff(gLedRedHandle);
+
+ LED_Params_init(&ledParams); // default PWM LED
+ gLedGreenHandle = LED_open(CONFIG_LED_GREEN, &ledParams);
+ LED_setOff(gLedGreenHandle);
+
+ // Initialize buttons
+ PLAT_LOG("Initialize buttons");
+ Button_init();
+
+ Button_Params_init(&buttonParams);
+ buttonParams.buttonEventMask = Button_EV_CLICKED | Button_EV_LONGCLICKED;
+ buttonParams.longPressDuration = 1000U; // ms
+ gButtonRightHandle = Button_open(CONFIG_BTN_RIGHT, &buttonParams);
+ Button_setCallback(gButtonRightHandle, ButtonRightEventHandler);
+
+ PLAT_LOG("Initialize Wi-Fi");
+ WiFi_init();
+
+ PLAT_LOG("Initialize CHIP stack");
+ ret = PlatformMgr().InitChipStack();
+ if (ret != CHIP_NO_ERROR)
+ {
+ PLAT_LOG("PlatformMgr().InitChipStack() failed");
+ while (true)
+ ;
+ }
+
+ // Init ZCL Data Model and start server
+ PLAT_LOG("Initialize Server");
+ static chip::CommonCaseDeviceServerInitParams initParams;
+ (void) initParams.InitializeStaticResourcesBeforeServerInit();
+ chip::Server::GetInstance().Init(initParams);
+
+ // Initialize device attestation config
+ PLAT_LOG("Initialize device attestation config");
+#ifdef CC32XX_ATTESTATION_CREDENTIALS
+ SetDeviceAttestationCredentialsProvider(CC32XX::GetCC32XXDacProvider());
+#else
+
+ SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider());
+#endif
+
+ // init air purifier stuff
+ SetParentEndpointForEndpoint(AIR_QUALITY_SENSOR_ENDPOINT, AIR_PURIFIER_ENDPOINT);
+ SetParentEndpointForEndpoint(TEMPERATURE_SENSOR_ENDPOINT, AIR_PURIFIER_ENDPOINT);
+ SetParentEndpointForEndpoint(RELATIVE_HUMIDITY_SENSOR_ENDPOINT, AIR_PURIFIER_ENDPOINT);
+
+ AirPurifierManager::InitInstance(EndpointId(AIR_PURIFIER_ENDPOINT), EndpointId(AIR_QUALITY_SENSOR_ENDPOINT),
+ EndpointId(TEMPERATURE_SENSOR_ENDPOINT), EndpointId(RELATIVE_HUMIDITY_SENSOR_ENDPOINT));
+
+ ConfigurationMgr().LogDeviceConfig();
+
+ // QR code will be used with CHIP Tool
+ PLAT_LOG("Print Onboarding Codes");
+ PrintOnboardingCodes(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kOnNetwork));
+
+ PLAT_LOG("Start CHIPDeviceManager and Start Event Loop Task");
+ CHIPDeviceManager & deviceMgr = CHIPDeviceManager::GetInstance();
+ ret = deviceMgr.Init(&EchoCallbacks);
+ if (ret != CHIP_NO_ERROR)
+ {
+ PLAT_LOG("CHIPDeviceManager::Init() failed: %s", ErrorStr(ret));
+ while (1)
+ ;
+ }
+
+ return 0;
+}
+
+void AppTask::AppTaskMain(void * pvParameter)
+{
+ AppEvent event;
+
+ sAppTask.Init();
+
+ while (true)
+ {
+ /* Task pend until we have stuff to do */
+ if (xQueueReceive(sAppEventQueue, &event, portMAX_DELAY) == pdTRUE)
+ {
+ sAppTask.DispatchEvent(&event);
+ }
+ }
+}
+
+void AppTask::ButtonRightEventHandler(Button_Handle handle, Button_EventMask events)
+{
+ AppEvent event;
+ event.Type = AppEvent::kEventType_ButtonRight;
+
+ if (events & Button_EV_CLICKED)
+ {
+ event.ButtonEvent.Type = AppEvent::kAppEventButtonType_Clicked;
+ }
+ else if (events & Button_EV_LONGCLICKED)
+ {
+ event.ButtonEvent.Type = AppEvent::kAppEventButtonType_LongClicked;
+ }
+ // button callbacks are in ISR context
+ if (xQueueSendFromISR(sAppEventQueue, &event, NULL) != pdPASS)
+ {
+ /* Failed to post the message */
+ }
+}
+
+void AppTask::PostEvent(const AppEvent * aEvent)
+{
+ if (xQueueSend(sAppEventQueue, aEvent, 0) != pdPASS)
+ {
+ /* Failed to post the message */
+ }
+}
+
+// need to define custom tokens to read/write files from the file system
+#define KVS_TOKEN 0x13578642
+
+void AppTask::DispatchEvent(AppEvent * aEvent)
+{
+ switch (aEvent->Type)
+ {
+ case AppEvent::kEventType_ButtonRight:
+ if (AppEvent::kAppEventButtonType_Clicked == aEvent->ButtonEvent.Type)
+ {
+ PLAT_LOG("DispatchEvent: kEventType_ButtonRight: kAppEventButtonType_Clicked");
+ }
+ if (AppEvent::kAppEventButtonType_LongClicked == aEvent->ButtonEvent.Type)
+ {
+ // delete the kvs.cfg file and reset the matter part of the device
+ PLAT_LOG("DispatchEvent: kEventType_ButtonRight: LONG clicked - clearing KVS");
+
+ uint32_t token = KVS_TOKEN;
+ const unsigned char listName[] = "/sys/matter/kvs.cfg";
+ sl_FsDel(listName, token);
+ }
+ break;
+ case AppEvent::kEventType_AppEvent:
+ if (NULL != aEvent->Handler)
+ {
+ // XXX: assume our caller isn't trying to crash our stack
+ aEvent->Handler(aEvent);
+ }
+ break;
+
+ case AppEvent::kEventType_None:
+ default:
+ break;
+ }
+}
diff --git a/examples/air-purifier-app/cc32xx/main/AppTask.h b/examples/air-purifier-app/cc32xx/main/AppTask.h
new file mode 100644
index 00000000000000..1d16f8eeb82696
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/AppTask.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2023 Project CHIP Authors
+ * Copyright (c) 2019 Google LLC.
+ * 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
+#include
+
+#include "FreeRTOS.h"
+#include "semphr.h"
+#include "task.h"
+
+#include "AppEvent.h"
+#include
+
+class AppTask
+{
+public:
+ int StartAppTask();
+ static void AppTaskMain(void * pvParameter);
+
+ void PostEvent(const AppEvent * event);
+
+private:
+ friend AppTask & GetAppTask(void);
+
+ int Init();
+
+ void DispatchEvent(AppEvent * event);
+
+ static void ButtonRightEventHandler(Button_Handle handle, Button_EventMask events);
+
+ static void TimerEventHandler(void * p_context);
+
+ enum Function_t
+ {
+ kFunction_NoneSelected = 0,
+ kFunction_SoftwareUpdate = 0,
+ kFunction_FactoryReset,
+
+ kFunction_Invalid
+ } Function;
+
+ Function_t mFunction;
+ bool mFunctionTimerActive;
+
+ static AppTask sAppTask;
+};
+
+inline AppTask & GetAppTask(void)
+{
+ return AppTask::sAppTask;
+}
diff --git a/examples/air-purifier-app/cc32xx/main/CHIPDeviceManager.cpp b/examples/air-purifier-app/cc32xx/main/CHIPDeviceManager.cpp
new file mode 100644
index 00000000000000..399c527e47edef
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/CHIPDeviceManager.cpp
@@ -0,0 +1,63 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file
+ * This file implements the CHIP Device Interface that is used by
+ * applications to interact with the CHIP stack
+ *
+ */
+
+#include
+
+#include "CHIPDeviceManager.h"
+
+using namespace ::chip;
+
+namespace chip {
+
+namespace DeviceManager {
+
+using namespace ::chip::DeviceLayer;
+
+void CHIPDeviceManager::DeviceEventHandler(const ChipDeviceEvent * event, intptr_t arg)
+{
+ CHIPDeviceManagerCallbacks * cb = reinterpret_cast(arg);
+ if (cb != nullptr)
+ {
+ cb->DeviceEventCallback(event, reinterpret_cast(cb));
+ }
+}
+
+CHIP_ERROR CHIPDeviceManager::Init(CHIPDeviceManagerCallbacks * cb)
+{
+ mCB = cb;
+
+ // Register a function to receive events from the CHIP device layer. Note that calls to
+ // this function will happen on the CHIP event loop thread, not the app_main thread.
+ PlatformMgr().AddEventHandler(CHIPDeviceManager::DeviceEventHandler, reinterpret_cast(cb));
+
+ // Start a task to run the CHIP Device event loop.
+ return PlatformMgr().StartEventLoopTask();
+}
+
+void CHIPDeviceManagerCallbacks::DeviceEventCallback(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg) {}
+
+CHIPDeviceManagerCallbacks::~CHIPDeviceManagerCallbacks() {}
+
+} // namespace DeviceManager
+} // namespace chip
diff --git a/examples/air-purifier-app/cc32xx/main/CXXExceptionStubs.cpp b/examples/air-purifier-app/cc32xx/main/CXXExceptionStubs.cpp
new file mode 100755
index 00000000000000..39845ce7604c82
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/CXXExceptionStubs.cpp
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2023 Project CHIP Authors
+ * Copyright (c) 2019 Google LLC.
+ * 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
+ * Stub implementations of the C++ ABI exception handling functions.
+ *
+ * These functions replace the standard C++ exception code from the system's
+ * C++ runtime library with stub implementations that simply abort. This
+ * reduces overall code size as well as eliminating some calls to malloc()
+ * that occur during global initialization (see the code in eh_alloc.cc).
+ * This provides significant memory savings on resource constrained devices
+ * that don't use exceptions.
+ *
+ */
+
+#include
+
+extern "C" {
+
+void * __cxa_allocate_exception(size_t)
+{
+ abort();
+}
+
+void __cxa_free_exception(void *)
+{
+ abort();
+}
+
+void * __cxa_allocate_dependent_exception()
+{
+ abort();
+}
+
+void __cxa_free_dependent_exception(void *)
+{
+ abort();
+}
+
+void __cxa_throw(void *, void *, void (*)(void *))
+{
+ abort();
+}
+
+void __cxa_rethrow()
+{
+ abort();
+}
+
+void * __cxa_begin_catch(void *)
+{
+ abort();
+}
+
+void __cxa_end_catch()
+{
+ abort();
+}
+
+void * __cxa_get_exception_ptr(void *)
+{
+ abort();
+}
+}
diff --git a/examples/air-purifier-app/cc32xx/main/DeviceCallbacks.cpp b/examples/air-purifier-app/cc32xx/main/DeviceCallbacks.cpp
new file mode 100644
index 00000000000000..71ec0909cc206b
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/DeviceCallbacks.cpp
@@ -0,0 +1,45 @@
+/*
+ *
+ * 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 "DeviceCallbacks.h"
+#include
+
+using namespace chip;
+using namespace chip::DeviceLayer;
+using namespace chip::System;
+
+DeviceCallbacksDelegate * appDelegate = nullptr;
+extern "C" void cc32xxLog(const char * aFormat, ...);
+
+void DeviceCallbacks::DeviceEventCallback(const ChipDeviceEvent * event, intptr_t arg)
+{
+ switch (event->Type)
+ {
+ case DeviceEventType::kInterfaceIpAddressChanged:
+ if ((event->InterfaceIpAddressChanged.Type == InterfaceIpChangeType::kIpV4_Assigned) ||
+ (event->InterfaceIpAddressChanged.Type == InterfaceIpChangeType::kIpV6_Assigned))
+ {
+ // MDNS server restart on any ip assignment: if link local ipv6 is configured, that
+ // will not trigger a 'internet connectivity change' as there is no internet
+ // connectivity. MDNS still wants to refresh its listening interfaces to include the
+ // newly selected address.
+ cc32xxLog("DeviceEventCallback:Start DNS Server");
+ chip::app::DnssdServer::Instance().StartServer();
+ }
+ }
+}
diff --git a/examples/air-purifier-app/cc32xx/main/ZclCallbacks.cpp b/examples/air-purifier-app/cc32xx/main/ZclCallbacks.cpp
new file mode 100644
index 00000000000000..7e780d7050f06e
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/ZclCallbacks.cpp
@@ -0,0 +1,61 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "AppConfig.h"
+
+#include
+#include
+#include
+#include
+#include
+
+using namespace ::chip;
+using namespace ::chip::app::Clusters;
+
+void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath, uint8_t type, uint16_t size,
+ uint8_t * value)
+{
+ if (attributePath.mClusterId == OnOff::Id && attributePath.mAttributeId == OnOff::Attributes::OnOff::Id)
+ {
+ PLAT_LOG("MatterPostAttributeChangeCallback from zclCallbacks.cpp");
+ }
+ if (AirPurifierManager::GetInstance() != nullptr)
+ {
+ AirPurifierManager::GetInstance()->PostAttributeChangeCallback(attributePath.mEndpointId, attributePath.mClusterId,
+ attributePath.mAttributeId, type, size, value);
+ }
+}
+
+/** @brief OnOff Cluster Init
+ *
+ * This function is called when a specific cluster is initialized. It gives the
+ * application an opportunity to take care of cluster initialization procedures.
+ * It is called exactly once for each endpoint where cluster is present.
+ *
+ * @param endpoint Ver.: always
+ *
+ * TODO Issue #3841
+ * emberAfOnOffClusterInitCallback happens before the stack initialize the cluster
+ * attributes to the default value.
+ * The logic here expects something similar to the deprecated Plugins callback
+ * emberAfPluginOnOffClusterServerPostInitCallback.
+ *
+ */
+void emberAfOnOffClusterInitCallback(EndpointId endpoint)
+{
+ // TODO: implement any additional Cluster Server init actions
+}
diff --git a/examples/air-purifier-app/cc32xx/main/cc32xxWifiInit.c b/examples/air-purifier-app/cc32xx/main/cc32xxWifiInit.c
new file mode 100644
index 00000000000000..2f6230d1487c12
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/cc32xxWifiInit.c
@@ -0,0 +1,243 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ * Copyright (c) 2020 Texas Instruments Incorporated
+ * 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.
+ */
+
+//****************************************************************************
+//
+//! \addtogroup
+//! @{
+//
+//****************************************************************************
+
+/* Standard Include */
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+/* TI-DRIVERS Header files */
+#include
+#include
+
+#include
+
+#include
+
+#include
+#include
+
+#include "ti_drivers_config.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "utils_if.h"
+#include "wifi_if.h"
+
+#include
+int CHIP_IF_init();
+
+/* Application Version and Naming*/
+#define APPLICATION_NAME "CC32XX-MATTER:: E-LOCK"
+#define APPLICATION_VERSION "01.00.00.00"
+
+/* USER's defines */
+#define SLNETCONN_TASK_STACK_SIZE (2048)
+#define DISPLAY_TASK_STACK_SIZE (512)
+
+/****************************************************************************
+ LOCAL FUNCTION PROTOTYPES
+ ****************************************************************************/
+static void ButtonLeftEventHandler(Button_Handle handle, Button_EventMask events);
+
+/****************************************************************************
+ EXT. FUNCTION PROTOTYPES
+ ****************************************************************************/
+extern void LWIP_IF_start();
+
+/****************************************************************************
+ GLOBAL VARIABLES
+ ****************************************************************************/
+pthread_t gSlNetConnThread = (pthread_t) NULL;
+Button_Handle gButtonLeftHandle, gButtonRightHandle;
+LED_Handle gLedBlueHandle, gLedGreenHandle, gLedRedHandle;
+
+/****************************************************************************
+ STATIC VARIABLES
+ ****************************************************************************/
+static bool gIsConnected = 0;
+
+//*****************************************************************************
+// Local Functions
+//*****************************************************************************
+
+void SimpleLinkSockEventHandler(SlSockEvent_t * pSock)
+{
+ /* Unused in this application */
+}
+
+void SimpleLinkHttpServerEventHandler(SlNetAppHttpServerEvent_t * pHttpEvent, SlNetAppHttpServerResponse_t * pHttpResponse)
+{
+ /* Unused in this application */
+}
+
+void SimpleLinkNetAppRequestEventHandler(SlNetAppRequest_t * pNetAppRequest, SlNetAppResponse_t * pNetAppResponse)
+{
+ /* Unused in this application */
+}
+
+void SimpleLinkNetAppRequestMemFreeEventHandler(uint8_t * buffer)
+{
+ /* Unused in this application */
+}
+
+//*****************************************************************************
+//
+//! \brief Application startup display on UART
+//!
+//! \param none
+//!
+//! \return none
+//!
+//*****************************************************************************
+void DisplayBanner()
+{
+ cc32xxLog("\n\n\n\r");
+ cc32xxLog("\t\t *************************************************\n\r");
+ cc32xxLog("\t\t %s Application \n\r", APPLICATION_NAME);
+ cc32xxLog("\t\t %s \n\r", APPLICATION_VERSION);
+ cc32xxLog("\t\t *************************************************\n\r");
+ cc32xxLog("\n\n\n\r");
+}
+
+//*****************************************************************************
+//
+//! \brief SlWifiConn Event Handler
+//!
+//*****************************************************************************
+void SlNetConnEventHandler(uint32_t ifID, SlNetConnStatus_e netStatus, void * data)
+{
+ switch (netStatus)
+ {
+ case SLNETCONN_STATUS_CONNECTED_MAC:
+ gIsConnected = 1;
+ LED_setOn(gLedBlueHandle, LED_BRIGHTNESS_MAX);
+ cc32xxLog("[SlNetConnEventHandler] I/F %d - CONNECTED (MAC LEVEL)!\n\r", ifID);
+ break;
+ case SLNETCONN_STATUS_CONNECTED_IP:
+ gIsConnected = 1;
+ cc32xxLog("[SlNetConnEventHandler] I/F %d - CONNECTED (IP LEVEL)!\n\r", ifID);
+ break;
+ case SLNETCONN_STATUS_CONNECTED_INTERNET:
+ gIsConnected = 1;
+ cc32xxLog("[SlNetConnEventHandler] I/F %d - CONNECTED (INTERNET LEVEL)!\n\r", ifID);
+ break;
+ case SLNETCONN_STATUS_WAITING_FOR_CONNECTION:
+ case SLNETCONN_STATUS_DISCONNECTED:
+ gIsConnected = 0;
+ LED_setOff(gLedBlueHandle);
+ cc32xxLog("[SlNetConnEventHandler] I/F %d - DISCONNECTED!\n\r", ifID);
+ break;
+ default:
+ cc32xxLog("[SlNetConnEventHandler] I/F %d - UNKNOWN STATUS\n\r", ifID);
+ break;
+ }
+}
+
+//*****************************************************************************
+//
+//! \brief Launchpad switch used to enable one shot provisioning
+//!
+//*****************************************************************************
+static void ButtonLeftEventHandler(Button_Handle handle, Button_EventMask events)
+{
+ // Enable Provisioning
+ int retVal = SlWifiConn_enableProvisioning(WifiProvMode_ONE_SHOT, PROVISIONING_CMD, 0);
+ assert(retVal == 0);
+}
+
+//*****************************************************************************
+//
+//! \brief Main application thread
+//!
+//! \param none
+//!
+//! \return none
+//!
+//*****************************************************************************
+int WiFi_init()
+{
+ int retVal;
+ Button_Params buttonParams;
+ LED_Params ledParams;
+
+ SPI_init();
+
+#ifdef NWP_LOG
+ // NWP log config
+ // If your application already has UART0 configured, no need for this line
+ MAP_PRCMPeripheralClkEnable(PRCM_UARTA0, PRCM_RUN_MODE_CLK);
+ // Mux Pin 62 to mode 1 for outputting NWP logs
+ MAP_PinTypeUART(PIN_62, PIN_MODE_1);
+#endif
+
+ LED_Params_init(&ledParams); // default PWM LED
+ gLedBlueHandle = LED_open(CONFIG_LED_BLUE, &ledParams);
+ LED_setOff(gLedBlueHandle);
+
+ Button_Params_init(&buttonParams);
+ buttonParams.buttonEventMask = Button_EV_CLICKED | Button_EV_LONGCLICKED;
+ buttonParams.longPressDuration = 1000U; // ms
+ gButtonLeftHandle = Button_open(CONFIG_BTN_LEFT, &buttonParams);
+ Button_setCallback(gButtonLeftHandle, ButtonLeftEventHandler);
+
+ /* Enable SlWifiConn */
+ retVal = WIFI_IF_init();
+ assert(retVal >= 0);
+
+ /* Enable SlNet framework */
+ retVal = ti_net_SlNet_initConfig();
+ assert(retVal == 0);
+
+ /* Enable SlNetConn */
+ retVal = SlNetConn_init(0);
+ assert(retVal == 0);
+ gSlNetConnThread = OS_createTask(1, SLNETCONN_TASK_STACK_SIZE, SlNetConn_process, NULL, OS_TASK_FLAG_DETACHED);
+ assert(gSlNetConnThread);
+
+ return (retVal);
+}
+
+int WiFi_deinit()
+{
+ int retVal;
+ cc32xxLog("[APP] Networking App Completed (entering low power mode)\r\n ");
+ retVal = SlNetConn_stop(SlNetConnEventHandler);
+ retVal = WIFI_IF_deinit();
+ cc32xxLog("[APP] Exit (%d) \r\n", retVal);
+ assert(retVal == 0);
+ return (retVal);
+}
diff --git a/examples/air-purifier-app/cc32xx/main/debug_settings.h b/examples/air-purifier-app/cc32xx/main/debug_settings.h
new file mode 100644
index 00000000000000..16f826dae2f124
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/debug_settings.h
@@ -0,0 +1,39 @@
+/*
+ *
+ * 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.
+ */
+
+//*****************************************************************************
+// Includes
+//*****************************************************************************
+// Standard includes
+#pragma once
+
+// Select the print method used in the main app
+#define D_DEBUG_METHOD D_USER_DEFINED
+
+// Select Sevrity Color
+#define _FATAL_CLR_ _CLR_B_RED_
+#define _ERROR_CLR_ _CLR_RED_
+#define _WARNING_CLR_ _CLR_MAGENTA_
+#define _INFO_CLR_ _CLR_GREEN_
+#define _DEBUG_CLR_ _CLR_YELLOW_
+#define _TRACE_CLR_ _CLR_RESET_
+
+#if (D_DEBUG_METHOD == D_USER_DEFINED)
+extern void cc32xxLog(const char * msg, ...);
+#define PRINTF(...) cc32xxLog(__VA_ARGS__);
+#endif
diff --git a/examples/air-purifier-app/cc32xx/main/include/CHIPDeviceManager.h b/examples/air-purifier-app/cc32xx/main/include/CHIPDeviceManager.h
new file mode 100644
index 00000000000000..939bf3149a4695
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/include/CHIPDeviceManager.h
@@ -0,0 +1,106 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file
+ * This file contains definitions for the CHIP DeviceManager Interface
+ *
+ * This object will co-ordinate multiple activities such as
+ * initialisation, rendezvous, session mgmt and other such
+ * activities within the CHIP stack. This is a singleton object.
+ */
+
+#pragma once
+
+#include
+#include
+#include
+
+#include
+
+#include
+#include
+
+namespace chip {
+namespace DeviceManager {
+
+/**
+ * @brief
+ * This class provides a skeleton for all the callback functions. The functions will be
+ * called by other objects within the CHIP stack for specific events.
+ * Applications interested in receiving specific callbacks can specialize this class and handle
+ * these events in their implementation of this class.
+ */
+class DLL_EXPORT CHIPDeviceManagerCallbacks
+{
+public:
+ /**
+ * @brief
+ * Called when CHIP Device events (PublicEventTypes) are triggered.
+ *
+ * @param event ChipDeviceEvent that occurred
+ * @param arg arguments specific to the event, if any
+ */
+ virtual void DeviceEventCallback(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg);
+
+ virtual ~CHIPDeviceManagerCallbacks();
+};
+
+/**
+ * @brief
+ * A common class that drives other components of the CHIP stack
+ */
+class DLL_EXPORT CHIPDeviceManager
+{
+public:
+ CHIPDeviceManager(const CHIPDeviceManager &) = delete;
+ CHIPDeviceManager(const CHIPDeviceManager &&) = delete;
+ CHIPDeviceManager & operator=(const CHIPDeviceManager &) = delete;
+
+ static CHIPDeviceManager & GetInstance()
+ {
+ static CHIPDeviceManager instance;
+ return instance;
+ }
+
+ /**
+ * @brief
+ * Initialise CHIPDeviceManager
+ *
+ * @param cb Application's instance of the CHIPDeviceManagerCallbacks for consuming events
+ */
+ CHIP_ERROR Init(CHIPDeviceManagerCallbacks * cb);
+
+ /**
+ * @brief
+ * Fetch a pointer to the registered CHIPDeviceManagerCallbacks object.
+ *
+ */
+ CHIPDeviceManagerCallbacks * GetCHIPDeviceManagerCallbacks() { return mCB; }
+
+ /**
+ * Use internally for registration of the ChipDeviceEvents
+ */
+ static void DeviceEventHandler(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg);
+
+private:
+ CHIPDeviceManagerCallbacks * mCB = nullptr;
+ CHIPDeviceManager() {}
+};
+
+} // namespace DeviceManager
+} // namespace chip
diff --git a/examples/air-purifier-app/cc32xx/main/include/CHIPProjectConfig.h b/examples/air-purifier-app/cc32xx/main/include/CHIPProjectConfig.h
new file mode 100644
index 00000000000000..0765b2084a0870
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/include/CHIPProjectConfig.h
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2023 Project CHIP Authors
+ * Copyright (c) 2019 Google LLC.
+ * 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
+
+#if BUILD_RELEASE
+
+// Security and Authentication enabled for release build.
+#define CHIP_CONFIG_SECURITY_TEST_MODE 0
+
+#else
+
+// Security and Authentication disabled for development build.
+// For convenience, enable CHIP Security Test Mode and disable the requirement for
+// authentication in various protocols.
+// 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.
+#define CHIP_CONFIG_SECURITY_TEST_MODE 0
+
+// 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
+
+#define CHIP_DEVICE_CONFIG_DEVICE_TYPE 0x002D // Air Purifier
+#define CHIP_DEVICE_CONFIG_DEVICE_NAME "Air Purifier"
+
+/**
+ * CHIP_DEVICE_CONFIG_USE_TEST_SERIAL_NUMBER
+ *
+ * Enables the use of a hard-coded default serial number if none
+ * is found in CHIP NV storage.
+ */
+#define CHIP_DEVICE_CONFIG_USE_TEST_SERIAL_NUMBER "DUMMY_SN"
+
+#endif // BUILD_RELEASE
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID
+ *
+ * 0xE100: Google's Vendor Id.
+ */
+#define CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID 0xFFF1
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID
+ *
+ * 0xFE00: SDK Sample Lock Resource
+ */
+#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID 0x8006
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_REVISION
+ *
+ * The product revision number assigned to device or product by the device vendor. This
+ * number is scoped to the device product id, and typically corresponds to a revision of the
+ * physical device, a change to its packaging, and/or a change to its marketing presentation.
+ * This value is generally *not* incremented for device software revisions.
+ */
+#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_REVISION 1
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION
+ *
+ * A string identifying the firmware revision running on the device.
+ * CHIP currently expects the firmware version to be in the format
+ * {MAJOR_VERSION}.0d{MINOR_VERSION}
+ */
+#ifndef CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION
+#define CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION "1.0d1"
+#endif
+/**
+ * CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
+ *
+ * Enable support for CHIP-over-BLE (CHIPOBLE).
+ */
+#define CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE 0
+
+/**
+ * CHIP_DEVICE_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS
+ *
+ * Enable recording UTC timestamps.
+ */
+#define CHIP_DEVICE_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS 1
+
+/**
+ * CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE
+ *
+ * A size, in bytes, of the individual debug event logging buffer.
+ */
+#define CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE (512)
+
+/**
+ * CHIP_CONFIG_EVENT_LOGGING_DEFAULT_IMPORTANCE
+ *
+ * For a development build, set the default importance of events to be logged as Debug.
+ * Since debug is the lowest importance level, this means all standard, critical, info and
+ * debug importance level vi events get logged.
+ */
+#if BUILD_RELEASE
+#define CHIP_CONFIG_EVENT_LOGGING_DEFAULT_IMPORTANCE chip::Profiles::DataManagement::Production
+#else
+#define CHIP_CONFIG_EVENT_LOGGING_DEFAULT_IMPORTANCE chip::Profiles::DataManagement::Debug
+#endif
diff --git a/examples/air-purifier-app/cc32xx/main/include/DeviceCallbacks.h b/examples/air-purifier-app/cc32xx/main/include/DeviceCallbacks.h
new file mode 100644
index 00000000000000..c5c9e208e698d8
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/include/DeviceCallbacks.h
@@ -0,0 +1,40 @@
+/*
+ *
+ * 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
+#include
+
+class DeviceCallbacks : public chip::DeviceManager::CHIPDeviceManagerCallbacks
+{
+public:
+ void DeviceEventCallback(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg);
+};
+
+class DeviceCallbacksDelegate
+{
+public:
+ static DeviceCallbacksDelegate & Instance()
+ {
+ static DeviceCallbacksDelegate instance;
+ return instance;
+ }
+ DeviceCallbacksDelegate * mDelegate = nullptr;
+ void SetAppDelegate(DeviceCallbacksDelegate * delegate) { mDelegate = delegate; }
+ DeviceCallbacksDelegate * GetAppDelegate() { return mDelegate; }
+};
diff --git a/examples/air-purifier-app/cc32xx/main/main.cpp b/examples/air-purifier-app/cc32xx/main/main.cpp
new file mode 100644
index 00000000000000..0e332752802a5d
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/main.cpp
@@ -0,0 +1,76 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ * Copyright (c) 2020 Texas Instruments Incorporated
+ *
+ * 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
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+#include
+
+/* Driver Header files */
+#include
+#include
+#include
+
+using namespace ::chip;
+using namespace ::chip::Inet;
+using namespace ::chip::DeviceLayer;
+
+// ================================================================================
+// FreeRTOS Callbacks
+// ================================================================================
+extern "C" void vApplicationStackOverflowHook(void)
+{
+ while (true)
+ {
+ ;
+ }
+}
+
+// ================================================================================
+// Main Code
+// ================================================================================
+int main(void)
+{
+ Board_init();
+ GPIO_init();
+
+ mbedtls_platform_set_calloc_free(CHIPPlatformMemoryCalloc, CHIPPlatformMemoryFree);
+
+ int ret = GetAppTask().StartAppTask();
+ if (ret != 0)
+ {
+ // can't log until the kernel is started
+ // PLAT_LOG("GetAppTask().StartAppTask() failed");
+ while (true)
+ ;
+ }
+
+ vTaskStartScheduler();
+
+ // Should never get here.
+ while (true)
+ ;
+}
diff --git a/examples/air-purifier-app/cc32xx/main/wifi_settings.h b/examples/air-purifier-app/cc32xx/main/wifi_settings.h
new file mode 100644
index 00000000000000..21bf90941b4772
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/main/wifi_settings.h
@@ -0,0 +1,99 @@
+/*
+ *
+ * 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.
+ */
+
+//*****************************************************************************
+// Includes
+//*****************************************************************************
+#pragma once
+
+//*****************************************************************************
+// WIFI IF INTRODUCTION
+//*****************************************************************************
+/* This module enables an easy integration of Wi-Fi to a SimpleLink Networking
+ * framework.
+ * It was designed for applications that use the Wi-Fi Station role only.
+ * The simple API and settings enables the user to initiate the Wi-Fi and
+ * configure the provisioning method that will be used upon first connection
+ * attempt.
+ * Upon successful init (WIFI_IF_init()), the system enables the NWP for any
+ * SL commands.
+ * The NWP will be in a low power state (AUTO-CONNECT will be disabled) waiting
+ * for connection request (SlNetConn_Start()).
+ * User should not call sl_Start/sl_Stop when using this module. Please use
+ * WIFI_IF_restart() (for reseting the NWP) or WIFI_IF_deinit() instead.
+ */
+
+//*****************************************************************************
+// WIFI IF USER SETTINGS
+//*****************************************************************************
+
+/*
+ * Defines the minimum severity level allowed.
+ * Use E_DEBUG to enable Wifi internal messages
+ * Options: E_TRACE, E_DEBUG, E_INFO, E_WARNING, E_ERROR, E_FATAL
+ */
+#define WIFI_IF_DEBUG_LEVEL E_INFO
+
+/*
+ * Defines Provisioning (initial) Parameters:
+ * Mode can be: WifiProvMode_OFF, WifiProvMode_ON, WifiProvMode_ONE_SHOT
+ * Command can be one of the following:
+ * SL_WLAN_PROVISIONING_CMD_START_MODE_AP,
+ * SL_WLAN_PROVISIONING_CMD_START_MODE_SC,
+ * SL_WLAN_PROVISIONING_CMD_START_MODE_APSC,
+ * SL_WLAN_PROVISIONING_CMD_START_MODE_APSC_EXTERNAL_CONFIGURATION,
+ * SL_WLAN_PROVISIONING_CMD_START_MODE_EXTERNAL_CONFIGURATION
+ */
+#define PROVISIONING_MODE WifiProvMode_ONE_SHOT
+#define PROVISIONING_CMD SL_WLAN_PROVISIONING_CMD_START_MODE_APSC
+
+/*
+ * Defines Provisioning AP /SC Parameters:
+ */
+#define PROVISIONING_TIMEOUT 0 // 0 - use default
+#define PROVISIONING_AP_PASSWORD "1234567890" // NULL - use default (OPEN)
+#define PROVISIONING_SC_KEY "1234567890123456" // NULL - use defaults
+
+/* Force provisioning by deleting existing profiles.
+ * To be used for testing during development only.
+ * Note: When FORCE_PROVSIONING is enabled - the following static profile
+ * configurations are ignored
+ */
+#define FORCE_PROVISIONING (0)
+
+/* Static Profile setting - Method 1: Hard coded
+ * Define AP_SSID and optionally AP_PASSWORD - to connect to local network
+ * Hard-Coded Definition: update AP_SSID and AP_PASSWORD (NULL means OPEN, else is WPA2)
+ */
+#define AP_SSID NULL // "network-name"
+#define AP_PASSWORD NULL // "network-password"
+
+/* Static Profile setting - Method 2: Configuration file
+ * File format should be:
+ * "' '"
+ * i.e. ssid and password with one space character between them
+ * Do not use newline, extra space symbols or quotation mark
+ */
+#define AP_CFG_FILENAME "network.cfg" // config file name
+#define AP_CFG_TOKEN 12345678 // config file read access token
+#define AP_CFG_MAX_SIZE 100 // config file Maximum file length
+
+/* Define (if needed) the external handle for TI Driver's LED for wi-fi status:
+ * off: disconnected, blinking: provisionig, on: connected
+ * Comment the definition in case the auto control is not required */
+#define WIFI_LED_HANDLE gLedBlueHandle
diff --git a/examples/air-purifier-app/cc32xx/third_party/connectedhomeip b/examples/air-purifier-app/cc32xx/third_party/connectedhomeip
new file mode 120000
index 00000000000000..11a54ed360106c
--- /dev/null
+++ b/examples/air-purifier-app/cc32xx/third_party/connectedhomeip
@@ -0,0 +1 @@
+../../../../
\ No newline at end of file
diff --git a/examples/air-purifier-app/linux/.gn b/examples/air-purifier-app/linux/.gn
new file mode 100644
index 00000000000000..5d1ce757507582
--- /dev/null
+++ b/examples/air-purifier-app/linux/.gn
@@ -0,0 +1,25 @@
+# Copyright (c) 2020 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.
+
+import("//build_overrides/build.gni")
+
+# The location of the build configuration file.
+buildconfig = "${build_root}/config/BUILDCONFIG.gn"
+
+# CHIP uses angle bracket includes.
+check_system_includes = true
+
+default_args = {
+ import("//args.gni")
+}
diff --git a/examples/air-purifier-app/linux/BUILD.gn b/examples/air-purifier-app/linux/BUILD.gn
new file mode 100644
index 00000000000000..0a0f86cac16ec4
--- /dev/null
+++ b/examples/air-purifier-app/linux/BUILD.gn
@@ -0,0 +1,61 @@
+# Copyright (c) 2023 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/chip.gni")
+
+import("${chip_root}/build/chip/tools.gni")
+import("${chip_root}/src/app/common_flags.gni")
+
+assert(chip_build_tools)
+
+import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
+
+config("includes") {
+ include_dirs = [
+ ".",
+ "include",
+ ]
+}
+
+executable("chip-air-purifier-app") {
+ sources = [
+ "${chip_root}/examples/air-purifier-app/air-purifier-common/src/air-purifier-manager.cpp",
+ "${chip_root}/examples/air-purifier-app/air-purifier-common/src/air-quality-sensor-manager.cpp",
+ "${chip_root}/examples/air-purifier-app/air-purifier-common/src/filter-delegates.cpp",
+ "include/CHIPProjectAppConfig.h",
+ "main.cpp",
+ ]
+
+ deps = [
+ "${chip_root}/examples/air-purifier-app/air-purifier-common",
+ "${chip_root}/examples/platform/linux:app-main",
+ "${chip_root}/src/lib",
+ ]
+
+ cflags = [ "-Wconversion" ]
+
+ include_dirs = [
+ "include",
+ "${chip_root}/examples/air-purifier-app/air-purifier-common/include",
+ ]
+ output_dir = root_out_dir
+}
+
+group("linux") {
+ deps = [ ":chip-air-purifier-app" ]
+}
+
+group("default") {
+ deps = [ ":linux" ]
+}
diff --git a/examples/air-purifier-app/linux/README.md b/examples/air-purifier-app/linux/README.md
new file mode 100644
index 00000000000000..88f5be738c926d
--- /dev/null
+++ b/examples/air-purifier-app/linux/README.md
@@ -0,0 +1,109 @@
+# CHIP Linux Air Purifier Example
+
+An example showing the use of CHIP on the Linux. The document will describe how
+to build and run CHIP Air Purifier Example on A Linux System. This doc is tested
+on **Ubuntu 20.04 LTS**.
+
+The Air Purifier is a composed device with Endpoint 1 being the Air Purifier.
+Endpoint 2 is an Air Quality Sensor, Endpoint 3 is a Relative Humidity Sensor
+and endpoint 4 is a Temperature Sensor.
+
+To cross-compile this example on x64 host and run on **NXP i.MX 8M Mini**
+**EVK**, see the associated
+[README document](../../../docs/guides/nxp_imx8m_linux_examples.md) for details.
+
+
+
+- [CHIP Linux Air Purifier Example](#chip-linux-air-purifier-example)
+ - [Building](#building)
+ - [Commandline arguments](#commandline-arguments)
+ - [Running the Complete Example on Raspberry Pi 4](#running-the-complete-example-on-raspberry-pi-4)
+
+
+
+## Building
+
+- Install tool chain
+
+ $ sudo apt-get install git gcc g++ python pkg-config libssl-dev libdbus-1-dev libglib2.0-dev ninja-build python3-venv python3-dev unzip
+
+- Build the example application:
+
+ $ cd ~/connectedhomeip/examples/air-purifier-app/linux/
+ $ git submodule update --init
+ $ source third_party/connectedhomeip/scripts/activate.sh
+ $ gn gen out/debug
+ $ ninja -C out/debug
+
+- To delete generated executable, libraries and object files use:
+
+ $ cd ~/connectedhomeip/examples/air-purifier-app/linux/
+ $ rm -rf out/
+
+## Commandline arguments
+
+- `--wifi`
+
+ Enables WiFi management feature. Required for WiFi commissioning.
+
+- `--thread`
+
+ Enables Thread management feature, requires ot-br-posix dbus daemon running.
+ Required for Thread commissioning.
+
+- `--ble-device `
+
+ Use specific bluetooth interface for BLE advertisement and connections.
+
+ `interface id`: the number after `hci` when listing BLE interfaces by
+ `hciconfig` command, for example, `--ble-device 1` means using `hci1`
+ interface. Default: `0`.
+
+## Running the Complete Example on Raspberry Pi 4
+
+> If you want to test Echo protocol, please enable Echo handler
+>
+> gn gen out/debug --args='chip_app_use_echo=true'
+> ninja -C out/debug
+
+- Prerequisites
+
+ 1. A Raspberry Pi 4 board
+ 2. A USB Bluetooth Dongle, Ubuntu desktop will send Bluetooth advertisement,
+ which will block CHIP from connecting via BLE. On Ubuntu server, you need
+ to install `pi-bluetooth` via APT.
+ 3. Ubuntu 20.04 or newer image for ARM64 platform.
+
+- Building
+
+ Follow [Building](#building) section of this document.
+
+- Running
+
+ - [Optional] Plug USB Bluetooth dongle
+
+ - Plug USB Bluetooth dongle and find its bluetooth device number. The
+ number after `hci` is the bluetooth device number, `1` in this
+ example.
+
+ $ hciconfig
+ hci1: Type: Primary Bus: USB
+ BD Address: 00:1A:7D:AA:BB:CC ACL MTU: 310:10 SCO MTU: 64:8
+ UP RUNNING PSCAN ISCAN
+ RX bytes:20942 acl:1023 sco:0 events:1140 errors:0
+ TX bytes:16559 acl:1011 sco:0 commands:121 errors:0
+
+ hci0: Type: Primary Bus: UART
+ BD Address: B8:27:EB:AA:BB:CC ACL MTU: 1021:8 SCO MTU: 64:1
+ UP RUNNING PSCAN ISCAN
+ RX bytes:8609495 acl:14 sco:0 events:217484 errors:0
+ TX bytes:92185 acl:20 sco:0 commands:5259 errors:0
+
+ - Run Linux Lighting Example App
+
+ $ cd ~/connectedhomeip/examples/lighting-app/linux
+ $ sudo out/debug/chip-lighting-app --ble-device [bluetooth device number]
+ # In this example, the device we want to use is hci1
+ $ sudo out/debug/chip-lighting-app --ble-device 1
+
+ - Test the device using ChipTool on your laptop / workstation etc.
diff --git a/examples/air-purifier-app/linux/args.gni b/examples/air-purifier-app/linux/args.gni
new file mode 100644
index 00000000000000..b91c0bafdfc9aa
--- /dev/null
+++ b/examples/air-purifier-app/linux/args.gni
@@ -0,0 +1,25 @@
+# Copyright (c) 2023 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/chip.gni")
+
+import("${chip_root}/config/standalone/args.gni")
+
+chip_device_project_config_include = ""
+chip_project_config_include = ""
+chip_system_project_config_include = ""
+
+chip_project_config_include_dirs =
+ [ "${chip_root}/examples/air-purifier-app/linux/include" ]
+chip_project_config_include_dirs += [ "${chip_root}/config/standalone" ]
diff --git a/examples/air-purifier-app/linux/build_overrides b/examples/air-purifier-app/linux/build_overrides
new file mode 120000
index 00000000000000..e578e73312ebd1
--- /dev/null
+++ b/examples/air-purifier-app/linux/build_overrides
@@ -0,0 +1 @@
+../../build_overrides
\ No newline at end of file
diff --git a/examples/air-purifier-app/linux/include/CHIPProjectAppConfig.h b/examples/air-purifier-app/linux/include/CHIPProjectAppConfig.h
new file mode 100644
index 00000000000000..e3a2e726e2db2a
--- /dev/null
+++ b/examples/air-purifier-app/linux/include/CHIPProjectAppConfig.h
@@ -0,0 +1,38 @@
+/*
+ *
+ * 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 the CHIPProjectConfig from config/standalone
+#include
+
+#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY 0
+
+#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT 1
+
+#define CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY 1
+
+#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DEVICE_TYPE 1
+
+#define CHIP_DEVICE_CONFIG_DEVICE_TYPE 0x002D // Air Purifier
+
+#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DEVICE_NAME 1
+
+#define CHIP_DEVICE_ENABLE_PORT_PARAMS 1
+
+#define CHIP_DEVICE_CONFIG_DEVICE_NAME "Air Purifier"
diff --git a/examples/air-purifier-app/linux/main.cpp b/examples/air-purifier-app/linux/main.cpp
new file mode 100644
index 00000000000000..59ef9cf9595755
--- /dev/null
+++ b/examples/air-purifier-app/linux/main.cpp
@@ -0,0 +1,72 @@
+/*
+ *
+ * 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
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define AIR_PURIFIER_ENDPOINT 1
+#define AIR_QUALITY_SENSOR_ENDPOINT 2
+#define TEMPERATURE_SENSOR_ENDPOINT 3
+#define RELATIVE_HUMIDITY_SENSOR_ENDPOINT 4
+// TODO: Add support for the thermostat endpoint in future PR.
+
+using namespace chip;
+using namespace chip::app;
+using namespace chip::app::Clusters;
+
+// The MatterPostAttributeChangeCallback is offloaded to the main Air Purifier Manager class.
+void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath, uint8_t type, uint16_t size,
+ uint8_t * value)
+{
+ if (AirPurifierManager::GetInstance() != nullptr)
+ {
+ AirPurifierManager::GetInstance()->PostAttributeChangeCallback(attributePath.mEndpointId, attributePath.mClusterId,
+ attributePath.mAttributeId, type, size, value);
+ }
+}
+
+// Initialize the Air Purifier Manager and set up the endpoint composition tree.
+void ApplicationInit()
+{
+ AirPurifierManager::InitInstance(EndpointId(AIR_PURIFIER_ENDPOINT), EndpointId(AIR_QUALITY_SENSOR_ENDPOINT),
+ EndpointId(TEMPERATURE_SENSOR_ENDPOINT), EndpointId(RELATIVE_HUMIDITY_SENSOR_ENDPOINT));
+
+ SetParentEndpointForEndpoint(AIR_QUALITY_SENSOR_ENDPOINT, AIR_PURIFIER_ENDPOINT);
+ SetParentEndpointForEndpoint(TEMPERATURE_SENSOR_ENDPOINT, AIR_PURIFIER_ENDPOINT);
+ SetParentEndpointForEndpoint(RELATIVE_HUMIDITY_SENSOR_ENDPOINT, AIR_PURIFIER_ENDPOINT);
+}
+
+void ApplicationShutdown()
+{
+ ChipLogDetail(NotSpecified, "Air Purifier: ApplicationShutdown()");
+}
+
+int main(int argc, char * argv[])
+{
+ if (ChipLinuxAppInit(argc, argv) != 0)
+ {
+ return -1;
+ }
+
+ ChipLinuxAppMainLoop();
+ return 0;
+}
diff --git a/examples/air-purifier-app/linux/third_party/connectedhomeip b/examples/air-purifier-app/linux/third_party/connectedhomeip
new file mode 120000
index 00000000000000..11a54ed360106c
--- /dev/null
+++ b/examples/air-purifier-app/linux/third_party/connectedhomeip
@@ -0,0 +1 @@
+../../../../
\ No newline at end of file
diff --git a/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.matter b/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.matter
index f811b3164af645..736803eaad9c70 100644
--- a/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.matter
+++ b/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.matter
@@ -3,7 +3,7 @@
/** Attributes and commands for putting a device into Identification mode (e.g. flashing a light). */
server cluster Identify = 3 {
- enum EffectIdentifierEnum : ENUM8 {
+ enum EffectIdentifierEnum : enum8 {
kBlink = 0;
kBreathe = 1;
kOkay = 2;
@@ -12,11 +12,11 @@ server cluster Identify = 3 {
kStopEffect = 255;
}
- enum EffectVariantEnum : ENUM8 {
+ enum EffectVariantEnum : enum8 {
kDefault = 0;
}
- enum IdentifyTypeEnum : ENUM8 {
+ enum IdentifyTypeEnum : enum8 {
kNone = 0;
kLightOutput = 1;
kVisibleIndicator = 2;
@@ -43,7 +43,7 @@ server cluster Identify = 3 {
/** The Descriptor Cluster is meant to replace the support from the Zigbee Device Object (ZDO) for describing a node, its endpoints and clusters. */
server cluster Descriptor = 29 {
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kTagList = 0x1;
}
@@ -76,13 +76,13 @@ server cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
server cluster AccessControl = 31 {
- enum AccessControlEntryAuthModeEnum : ENUM8 {
+ enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
kCASE = 2;
kGroup = 3;
}
- enum AccessControlEntryPrivilegeEnum : ENUM8 {
+ enum AccessControlEntryPrivilegeEnum : enum8 {
kView = 1;
kProxyView = 2;
kOperate = 3;
@@ -90,7 +90,7 @@ server cluster AccessControl = 31 {
kAdminister = 5;
}
- enum ChangeTypeEnum : ENUM8 {
+ enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
@@ -148,7 +148,7 @@ server cluster AccessControl = 31 {
Commissioning and operational determination of Node characteristics, such as Vendor ID, Product ID and serial number,
which apply to the whole Node. Also allows setting user device information such as location. */
server cluster BasicInformation = 40 {
- enum ColorEnum : ENUM8 {
+ enum ColorEnum : enum8 {
kBlack = 0;
kNavy = 1;
kGreen = 2;
@@ -172,7 +172,7 @@ server cluster BasicInformation = 40 {
kGold = 20;
}
- enum ProductFinishEnum : ENUM8 {
+ enum ProductFinishEnum : enum8 {
kOther = 0;
kMatte = 1;
kSatin = 2;
@@ -235,20 +235,20 @@ server cluster BasicInformation = 40 {
/** Provides an interface for providing OTA software updates */
client cluster OtaSoftwareUpdateProvider = 41 {
- enum ApplyUpdateActionEnum : ENUM8 {
+ enum ApplyUpdateActionEnum : enum8 {
kProceed = 0;
kAwaitNextAction = 1;
kDiscontinue = 2;
}
- enum DownloadProtocolEnum : ENUM8 {
+ enum DownloadProtocolEnum : enum8 {
kBDXSynchronous = 0;
kBDXAsynchronous = 1;
kHTTPS = 2;
kVendorSpecific = 3;
}
- enum StatusEnum : ENUM8 {
+ enum StatusEnum : enum8 {
kUpdateAvailable = 0;
kBusy = 1;
kNotAvailable = 2;
@@ -309,13 +309,13 @@ client cluster OtaSoftwareUpdateProvider = 41 {
/** Provides an interface for downloading and applying OTA software updates */
server cluster OtaSoftwareUpdateRequestor = 42 {
- enum AnnouncementReasonEnum : ENUM8 {
+ enum AnnouncementReasonEnum : enum8 {
kSimpleAnnouncement = 0;
kUpdateAvailable = 1;
kUrgentUpdateAvailable = 2;
}
- enum ChangeReasonEnum : ENUM8 {
+ enum ChangeReasonEnum : enum8 {
kUnknown = 0;
kSuccess = 1;
kFailure = 2;
@@ -323,7 +323,7 @@ server cluster OtaSoftwareUpdateRequestor = 42 {
kDelayByProvider = 4;
}
- enum UpdateStateEnum : ENUM8 {
+ enum UpdateStateEnum : enum8 {
kUnknown = 0;
kIdle = 1;
kQuerying = 2;
@@ -384,7 +384,7 @@ server cluster OtaSoftwareUpdateRequestor = 42 {
/** This cluster is used to manage global aspects of the Commissioning flow. */
server cluster GeneralCommissioning = 48 {
- enum CommissioningErrorEnum : ENUM8 {
+ enum CommissioningErrorEnum : enum8 {
kOK = 0;
kValueOutsideRange = 1;
kInvalidAuthentication = 2;
@@ -392,7 +392,7 @@ server cluster GeneralCommissioning = 48 {
kBusyWithOtherAdmin = 4;
}
- enum RegulatoryLocationTypeEnum : ENUM8 {
+ enum RegulatoryLocationTypeEnum : enum8 {
kIndoor = 0;
kOutdoor = 1;
kIndoorOutdoor = 2;
@@ -448,7 +448,7 @@ server cluster GeneralCommissioning = 48 {
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
server cluster NetworkCommissioning = 49 {
- enum NetworkCommissioningStatusEnum : ENUM8 {
+ enum NetworkCommissioningStatusEnum : enum8 {
kSuccess = 0;
kOutOfRange = 1;
kBoundsExceeded = 2;
@@ -464,7 +464,7 @@ server cluster NetworkCommissioning = 49 {
kUnknownError = 12;
}
- enum WiFiBandEnum : ENUM8 {
+ enum WiFiBandEnum : enum8 {
k2G4 = 0;
k3G65 = 1;
k5G = 2;
@@ -473,13 +473,21 @@ server cluster NetworkCommissioning = 49 {
k1G = 5;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kWiFiNetworkInterface = 0x1;
kThreadNetworkInterface = 0x2;
kEthernetNetworkInterface = 0x4;
}
- bitmap WiFiSecurityBitmap : BITMAP8 {
+ bitmap ThreadCapabilitiesBitmap : bitmap16 {
+ kIsBorderRouterCapable = 0x1;
+ kIsRouterCapable = 0x2;
+ kIsSleepyEndDeviceCapable = 0x4;
+ kIsFullThreadDevice = 0x8;
+ kIsSynchronizedSleepyEndDeviceCapable = 0x10;
+ }
+
+ bitmap WiFiSecurityBitmap : bitmap8 {
kUnencrypted = 0x1;
kWEP = 0x2;
kWPAPersonal = 0x4;
@@ -588,7 +596,7 @@ server cluster NetworkCommissioning = 49 {
/** The General Diagnostics Cluster, along with other diagnostics clusters, provide a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */
server cluster GeneralDiagnostics = 51 {
- enum BootReasonEnum : ENUM8 {
+ enum BootReasonEnum : enum8 {
kUnspecified = 0;
kPowerOnReboot = 1;
kBrownOutReset = 2;
@@ -598,7 +606,7 @@ server cluster GeneralDiagnostics = 51 {
kSoftwareReset = 6;
}
- enum HardwareFaultEnum : ENUM8 {
+ enum HardwareFaultEnum : enum8 {
kUnspecified = 0;
kRadio = 1;
kSensor = 2;
@@ -612,7 +620,7 @@ server cluster GeneralDiagnostics = 51 {
kTamperDetected = 10;
}
- enum InterfaceTypeEnum : ENUM8 {
+ enum InterfaceTypeEnum : enum8 {
kUnspecified = 0;
kWiFi = 1;
kEthernet = 2;
@@ -620,14 +628,14 @@ server cluster GeneralDiagnostics = 51 {
kThread = 4;
}
- enum NetworkFaultEnum : ENUM8 {
+ enum NetworkFaultEnum : enum8 {
kUnspecified = 0;
kHardwareFailure = 1;
kNetworkJammed = 2;
kConnectionFailed = 3;
}
- enum RadioFaultEnum : ENUM8 {
+ enum RadioFaultEnum : enum8 {
kUnspecified = 0;
kWiFiFault = 1;
kCellularFault = 2;
@@ -693,8 +701,8 @@ server cluster GeneralDiagnostics = 51 {
/** The Software Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */
server cluster SoftwareDiagnostics = 52 {
- bitmap Feature : BITMAP32 {
- kWaterMarks = 0x1;
+ bitmap Feature : bitmap32 {
+ kWatermarks = 0x1;
}
struct ThreadMetricsStruct {
@@ -722,24 +730,24 @@ server cluster SoftwareDiagnostics = 52 {
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
- command ResetWatermarks(): DefaultSuccess = 0;
+ command access(invoke: manage) ResetWatermarks(): DefaultSuccess = 0;
}
/** The Thread Network Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems */
server cluster ThreadNetworkDiagnostics = 53 {
- enum ConnectionStatusEnum : ENUM8 {
+ enum ConnectionStatusEnum : enum8 {
kConnected = 0;
kNotConnected = 1;
}
- enum NetworkFaultEnum : ENUM8 {
+ enum NetworkFaultEnum : enum8 {
kUnspecified = 0;
kLinkDown = 1;
kHardwareFailure = 2;
kNetworkJammed = 3;
}
- enum RoutingRoleEnum : ENUM8 {
+ enum RoutingRoleEnum : enum8 {
kUnspecified = 0;
kUnassigned = 1;
kSleepyEndDevice = 2;
@@ -749,7 +757,7 @@ server cluster ThreadNetworkDiagnostics = 53 {
kLeader = 6;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kPacketCounts = 0x1;
kErrorCounts = 0x2;
kMLECounts = 0x4;
@@ -890,19 +898,19 @@ server cluster ThreadNetworkDiagnostics = 53 {
/** The Wi-Fi Network Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */
server cluster WiFiNetworkDiagnostics = 54 {
- enum AssociationFailureCauseEnum : ENUM8 {
+ enum AssociationFailureCauseEnum : enum8 {
kUnknown = 0;
kAssociationFailed = 1;
kAuthenticationFailed = 2;
kSsidNotFound = 3;
}
- enum ConnectionStatusEnum : ENUM8 {
+ enum ConnectionStatusEnum : enum8 {
kConnected = 0;
kNotConnected = 1;
}
- enum SecurityTypeEnum : ENUM8 {
+ enum SecurityTypeEnum : enum8 {
kUnspecified = 0;
kNone = 1;
kWEP = 2;
@@ -911,7 +919,7 @@ server cluster WiFiNetworkDiagnostics = 54 {
kWPA3 = 5;
}
- enum WiFiVersionEnum : ENUM8 {
+ enum WiFiVersionEnum : enum8 {
kA = 0;
kB = 1;
kG = 2;
@@ -921,7 +929,7 @@ server cluster WiFiNetworkDiagnostics = 54 {
kAh = 6;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kPacketCounts = 0x1;
kErrorCounts = 0x2;
}
@@ -964,7 +972,7 @@ server cluster WiFiNetworkDiagnostics = 54 {
/** The Ethernet Network Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */
server cluster EthernetNetworkDiagnostics = 55 {
- enum PHYRateEnum : ENUM8 {
+ enum PHYRateEnum : enum8 {
kRate10M = 0;
kRate100M = 1;
kRate1G = 2;
@@ -977,7 +985,7 @@ server cluster EthernetNetworkDiagnostics = 55 {
kRate400G = 9;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kPacketCounts = 0x1;
kErrorCounts = 0x2;
}
@@ -998,26 +1006,30 @@ server cluster EthernetNetworkDiagnostics = 55 {
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
- command ResetCounts(): DefaultSuccess = 0;
+ command access(invoke: manage) ResetCounts(): DefaultSuccess = 0;
}
/** Commands to trigger a Node to allow a new Administrator to commission it. */
server cluster AdministratorCommissioning = 60 {
- enum CommissioningWindowStatusEnum : ENUM8 {
+ enum CommissioningWindowStatusEnum : enum8 {
kWindowNotOpen = 0;
kEnhancedWindowOpen = 1;
kBasicWindowOpen = 2;
}
- enum StatusCode : ENUM8 {
+ enum StatusCode : enum8 {
kBusy = 2;
kPAKEParameterError = 3;
kWindowNotOpen = 4;
}
+ bitmap Feature : bitmap32 {
+ kBasic = 0x1;
+ }
+
readonly attribute CommissioningWindowStatusEnum windowStatus = 0;
readonly attribute nullable fabric_idx adminFabricIndex = 1;
- readonly attribute nullable int16u adminVendorId = 2;
+ readonly attribute nullable vendor_id adminVendorId = 2;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1030,7 +1042,7 @@ server cluster AdministratorCommissioning = 60 {
octet_string PAKEPasscodeVerifier = 1;
int16u discriminator = 2;
int32u iterations = 3;
- octet_string salt = 4;
+ octet_string<32> salt = 4;
}
request struct OpenBasicCommissioningWindowRequest {
@@ -1044,12 +1056,12 @@ server cluster AdministratorCommissioning = 60 {
/** This cluster is used to add or remove Operational Credentials on a Commissionee or Node, as well as manage the associated Fabrics. */
server cluster OperationalCredentials = 62 {
- enum CertificateChainTypeEnum : ENUM8 {
+ enum CertificateChainTypeEnum : enum8 {
kDACCertificate = 1;
kPAICertificate = 2;
}
- enum NodeOperationalCertStatusEnum : ENUM8 {
+ enum NodeOperationalCertStatusEnum : enum8 {
kOK = 0;
kInvalidPublicKey = 1;
kInvalidNodeOpId = 2;
@@ -1091,7 +1103,7 @@ server cluster OperationalCredentials = 62 {
readonly attribute int16u clusterRevision = 65533;
request struct AttestationRequestRequest {
- octet_string attestationNonce = 0;
+ octet_string<32> attestationNonce = 0;
}
request struct CertificateChainRequestRequest {
@@ -1099,14 +1111,14 @@ server cluster OperationalCredentials = 62 {
}
request struct CSRRequestRequest {
- octet_string CSRNonce = 0;
+ octet_string<32> CSRNonce = 0;
optional boolean isForUpdateNOC = 1;
}
request struct AddNOCRequest {
- octet_string NOCValue = 0;
- optional octet_string ICACValue = 1;
- octet_string IPKValue = 2;
+ octet_string<400> NOCValue = 0;
+ optional octet_string<400> ICACValue = 1;
+ octet_string<16> IPKValue = 2;
int64u caseAdminSubject = 3;
vendor_id adminVendorId = 4;
}
@@ -1129,12 +1141,12 @@ server cluster OperationalCredentials = 62 {
}
response struct AttestationResponse = 1 {
- octet_string attestationElements = 0;
- octet_string attestationSignature = 1;
+ octet_string<900> attestationElements = 0;
+ octet_string<64> attestationSignature = 1;
}
response struct CertificateChainResponse = 3 {
- octet_string certificate = 0;
+ octet_string<600> certificate = 0;
}
response struct CSRResponse = 5 {
@@ -1145,7 +1157,7 @@ server cluster OperationalCredentials = 62 {
response struct NOCResponse = 8 {
NodeOperationalCertStatusEnum statusCode = 0;
optional fabric_idx fabricIndex = 1;
- optional char_string debugText = 2;
+ optional char_string<128> debugText = 2;
}
command access(invoke: administer) AttestationRequest(AttestationRequestRequest): AttestationResponse = 0;
@@ -1160,12 +1172,12 @@ server cluster OperationalCredentials = 62 {
/** The Group Key Management Cluster is the mechanism by which group keys are managed. */
server cluster GroupKeyManagement = 63 {
- enum GroupKeySecurityPolicyEnum : ENUM8 {
+ enum GroupKeySecurityPolicyEnum : enum8 {
kTrustFirst = 0;
kCacheAndSync = 1;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kCacheAndSync = 0x1;
}
@@ -1232,7 +1244,7 @@ server cluster GroupKeyManagement = 63 {
/** Attributes for reporting air quality classification */
server cluster AirQuality = 91 {
- enum AirQualityEnum : ENUM8 {
+ enum AirQualityEnum : enum8 {
kUnknown = 0;
kGood = 1;
kFair = 2;
@@ -1242,7 +1254,7 @@ server cluster AirQuality = 91 {
kExtremelyPoor = 6;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kFair = 0x1;
kModerate = 0x2;
kVeryPoor = 0x4;
@@ -1260,9 +1272,9 @@ server cluster AirQuality = 91 {
/** Attributes and commands for configuring the measurement of temperature, and reporting temperature measurements. */
server cluster TemperatureMeasurement = 1026 {
- readonly attribute nullable int16s measuredValue = 0;
- readonly attribute nullable int16s minMeasuredValue = 1;
- readonly attribute nullable int16s maxMeasuredValue = 2;
+ readonly attribute nullable temperature measuredValue = 0;
+ readonly attribute nullable temperature minMeasuredValue = 1;
+ readonly attribute nullable temperature maxMeasuredValue = 2;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1286,7 +1298,7 @@ server cluster RelativeHumidityMeasurement = 1029 {
/** Attributes for reporting carbon monoxide concentration measurements */
server cluster CarbonMonoxideConcentrationMeasurement = 1036 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -1294,13 +1306,13 @@ server cluster CarbonMonoxideConcentrationMeasurement = 1036 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -1311,7 +1323,7 @@ server cluster CarbonMonoxideConcentrationMeasurement = 1036 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -1333,7 +1345,7 @@ server cluster CarbonMonoxideConcentrationMeasurement = 1036 {
/** Attributes for reporting carbon dioxide concentration measurements */
server cluster CarbonDioxideConcentrationMeasurement = 1037 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -1341,13 +1353,13 @@ server cluster CarbonDioxideConcentrationMeasurement = 1037 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -1358,7 +1370,7 @@ server cluster CarbonDioxideConcentrationMeasurement = 1037 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -1380,7 +1392,7 @@ server cluster CarbonDioxideConcentrationMeasurement = 1037 {
/** Attributes for reporting nitrogen dioxide concentration measurements */
server cluster NitrogenDioxideConcentrationMeasurement = 1043 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -1388,13 +1400,13 @@ server cluster NitrogenDioxideConcentrationMeasurement = 1043 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -1405,7 +1417,7 @@ server cluster NitrogenDioxideConcentrationMeasurement = 1043 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -1427,7 +1439,7 @@ server cluster NitrogenDioxideConcentrationMeasurement = 1043 {
/** Attributes for reporting ozone concentration measurements */
server cluster OzoneConcentrationMeasurement = 1045 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -1435,13 +1447,13 @@ server cluster OzoneConcentrationMeasurement = 1045 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -1452,7 +1464,7 @@ server cluster OzoneConcentrationMeasurement = 1045 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -1474,7 +1486,7 @@ server cluster OzoneConcentrationMeasurement = 1045 {
/** Attributes for reporting PM2.5 concentration measurements */
server cluster Pm25ConcentrationMeasurement = 1066 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -1482,13 +1494,13 @@ server cluster Pm25ConcentrationMeasurement = 1066 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -1499,7 +1511,7 @@ server cluster Pm25ConcentrationMeasurement = 1066 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -1521,7 +1533,7 @@ server cluster Pm25ConcentrationMeasurement = 1066 {
/** Attributes for reporting formaldehyde concentration measurements */
server cluster FormaldehydeConcentrationMeasurement = 1067 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -1529,13 +1541,13 @@ server cluster FormaldehydeConcentrationMeasurement = 1067 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -1546,7 +1558,7 @@ server cluster FormaldehydeConcentrationMeasurement = 1067 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -1568,7 +1580,7 @@ server cluster FormaldehydeConcentrationMeasurement = 1067 {
/** Attributes for reporting PM1 concentration measurements */
server cluster Pm1ConcentrationMeasurement = 1068 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -1576,13 +1588,13 @@ server cluster Pm1ConcentrationMeasurement = 1068 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -1593,7 +1605,7 @@ server cluster Pm1ConcentrationMeasurement = 1068 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -1615,7 +1627,7 @@ server cluster Pm1ConcentrationMeasurement = 1068 {
/** Attributes for reporting PM10 concentration measurements */
server cluster Pm10ConcentrationMeasurement = 1069 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -1623,13 +1635,13 @@ server cluster Pm10ConcentrationMeasurement = 1069 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -1640,7 +1652,7 @@ server cluster Pm10ConcentrationMeasurement = 1069 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -1662,7 +1674,7 @@ server cluster Pm10ConcentrationMeasurement = 1069 {
/** Attributes for reporting total volatile organic compounds concentration measurements */
server cluster TotalVolatileOrganicCompoundsConcentrationMeasurement = 1070 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -1670,13 +1682,13 @@ server cluster TotalVolatileOrganicCompoundsConcentrationMeasurement = 1070 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -1687,7 +1699,7 @@ server cluster TotalVolatileOrganicCompoundsConcentrationMeasurement = 1070 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -1709,7 +1721,7 @@ server cluster TotalVolatileOrganicCompoundsConcentrationMeasurement = 1070 {
/** Attributes for reporting radon concentration measurements */
server cluster RadonConcentrationMeasurement = 1071 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -1717,13 +1729,13 @@ server cluster RadonConcentrationMeasurement = 1071 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -1734,7 +1746,7 @@ server cluster RadonConcentrationMeasurement = 1071 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
diff --git a/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.zap b/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.zap
index f56a6027e9d092..13bfc7a3777a90 100644
--- a/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.zap
+++ b/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.zap
@@ -3243,7 +3243,7 @@
"code": 2,
"mfgCode": null,
"side": "server",
- "type": "int16u",
+ "type": "vendor_id",
"included": 1,
"storageOption": "External",
"singleton": 0,
diff --git a/examples/air-quality-sensor-app/air-quality-sensor-common/src/air-quality-sensor-manager.cpp b/examples/air-quality-sensor-app/air-quality-sensor-common/src/air-quality-sensor-manager.cpp
index 8bc4f4c627925d..a6e94765d86cf8 100644
--- a/examples/air-quality-sensor-app/air-quality-sensor-common/src/air-quality-sensor-manager.cpp
+++ b/examples/air-quality-sensor-app/air-quality-sensor-common/src/air-quality-sensor-manager.cpp
@@ -136,8 +136,8 @@ void AirQualitySensorManager::Init()
void AirQualitySensorManager::OnAirQualityChangeHandler(AirQualityEnum newValue)
{
- mAirQualityInstance.UpdateAirQuality(static_cast(newValue));
- ChipLogDetail(NotSpecified, "Updated AirQuality value: %huu", newValue);
+ mAirQualityInstance.UpdateAirQuality(newValue);
+ ChipLogDetail(NotSpecified, "Updated AirQuality value: %huu", chip::to_underlying(newValue));
}
void AirQualitySensorManager::OnCarbonDioxideMeasurementChangeHandler(float newValue)
diff --git a/examples/air-quality-sensor-app/telink/README.md b/examples/air-quality-sensor-app/telink/README.md
index eecc7e8bbdbaa6..f91c701c00c527 100644
--- a/examples/air-quality-sensor-app/telink/README.md
+++ b/examples/air-quality-sensor-app/telink/README.md
@@ -21,7 +21,7 @@ You can use this example as a reference for creating your own application.
2. Activate the build environment:
```bash
- $ source ./scripts/activate.sh
+ $ source ./scripts/activate.sh -p all,telink
```
3. In the example dir run (replace __ with your board name, for
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 4491adf35b3d88..99836125ba0451 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
@@ -3,7 +3,7 @@
/** Attributes and commands for putting a device into Identification mode (e.g. flashing a light). */
server cluster Identify = 3 {
- enum EffectIdentifierEnum : ENUM8 {
+ enum EffectIdentifierEnum : enum8 {
kBlink = 0;
kBreathe = 1;
kOkay = 2;
@@ -12,11 +12,11 @@ server cluster Identify = 3 {
kStopEffect = 255;
}
- enum EffectVariantEnum : ENUM8 {
+ enum EffectVariantEnum : enum8 {
kDefault = 0;
}
- enum IdentifyTypeEnum : ENUM8 {
+ enum IdentifyTypeEnum : enum8 {
kNone = 0;
kLightOutput = 1;
kVisibleIndicator = 2;
@@ -49,11 +49,11 @@ server cluster Identify = 3 {
/** Attributes and commands for group configuration and manipulation. */
server cluster Groups = 4 {
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kGroupNames = 0x1;
}
- bitmap NameSupportBitmap : BITMAP8 {
+ bitmap NameSupportBitmap : bitmap8 {
kGroupNames = 0x80;
}
@@ -67,7 +67,7 @@ server cluster Groups = 4 {
request struct AddGroupRequest {
group_id groupID = 0;
- char_string groupName = 1;
+ char_string<16> groupName = 1;
}
request struct ViewGroupRequest {
@@ -84,7 +84,7 @@ server cluster Groups = 4 {
request struct AddGroupIfIdentifyingRequest {
group_id groupID = 0;
- char_string groupName = 1;
+ char_string<16> groupName = 1;
}
response struct AddGroupResponse = 0 {
@@ -95,7 +95,7 @@ server cluster Groups = 4 {
response struct ViewGroupResponse = 1 {
enum8 status = 0;
group_id groupID = 1;
- char_string groupName = 2;
+ char_string<16> groupName = 2;
}
response struct GetGroupMembershipResponse = 2 {
@@ -118,14 +118,14 @@ server cluster Groups = 4 {
/** Attributes and commands for scene configuration and manipulation. */
provisional server cluster Scenes = 5 {
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kSceneNames = 0x1;
kExplicit = 0x2;
kTableSize = 0x4;
kFabricScenes = 0x8;
}
- bitmap ScenesCopyMode : BITMAP8 {
+ bitmap ScenesCopyMode : bitmap8 {
kCopyAllScenes = 0x1;
}
@@ -286,33 +286,33 @@ provisional server cluster Scenes = 5 {
/** Attributes and commands for switching devices between 'On' and 'Off' states. */
client cluster OnOff = 6 {
- enum DelayedAllOffEffectVariantEnum : ENUM8 {
+ enum DelayedAllOffEffectVariantEnum : enum8 {
kDelayedOffFastFade = 0;
kNoFade = 1;
kDelayedOffSlowFade = 2;
}
- enum DyingLightEffectVariantEnum : ENUM8 {
+ enum DyingLightEffectVariantEnum : enum8 {
kDyingLightFadeOff = 0;
}
- enum EffectIdentifierEnum : ENUM8 {
+ enum EffectIdentifierEnum : enum8 {
kDelayedAllOff = 0;
kDyingLight = 1;
}
- enum StartUpOnOffEnum : ENUM8 {
+ enum StartUpOnOffEnum : enum8 {
kOff = 0;
kOn = 1;
kToggle = 2;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kLighting = 0x1;
kDeadFrontBehavior = 0x2;
}
- bitmap OnOffControlBitmap : BITMAP8 {
+ bitmap OnOffControlBitmap : bitmap8 {
kAcceptOnlyWhenOn = 0x1;
}
@@ -355,33 +355,33 @@ client cluster OnOff = 6 {
/** Attributes and commands for switching devices between 'On' and 'Off' states. */
server cluster OnOff = 6 {
- enum DelayedAllOffEffectVariantEnum : ENUM8 {
+ enum DelayedAllOffEffectVariantEnum : enum8 {
kDelayedOffFastFade = 0;
kNoFade = 1;
kDelayedOffSlowFade = 2;
}
- enum DyingLightEffectVariantEnum : ENUM8 {
+ enum DyingLightEffectVariantEnum : enum8 {
kDyingLightFadeOff = 0;
}
- enum EffectIdentifierEnum : ENUM8 {
+ enum EffectIdentifierEnum : enum8 {
kDelayedAllOff = 0;
kDyingLight = 1;
}
- enum StartUpOnOffEnum : ENUM8 {
+ enum StartUpOnOffEnum : enum8 {
kOff = 0;
kOn = 1;
kToggle = 2;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kLighting = 0x1;
kDeadFrontBehavior = 0x2;
}
- bitmap OnOffControlBitmap : BITMAP8 {
+ bitmap OnOffControlBitmap : bitmap8 {
kAcceptOnlyWhenOn = 0x1;
}
@@ -430,23 +430,23 @@ server cluster OnOffSwitchConfiguration = 7 {
/** Attributes and commands for controlling devices that can be set to a level between fully 'On' and fully 'Off.' */
server cluster LevelControl = 8 {
- enum MoveMode : ENUM8 {
+ enum MoveMode : enum8 {
kUp = 0;
kDown = 1;
}
- enum StepMode : ENUM8 {
+ enum StepMode : enum8 {
kUp = 0;
kDown = 1;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kOnOff = 0x1;
kLighting = 0x2;
kFrequency = 0x4;
}
- bitmap LevelControlOptions : BITMAP8 {
+ bitmap LevelControlOptions : bitmap8 {
kExecuteIfOff = 0x1;
kCoupleColorTempToLevel = 0x2;
}
@@ -551,7 +551,7 @@ server cluster BinaryInputBasic = 15 {
/** The Descriptor Cluster is meant to replace the support from the Zigbee Device Object (ZDO) for describing a node, its endpoints and clusters. */
server cluster Descriptor = 29 {
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kTagList = 0x1;
}
@@ -590,7 +590,7 @@ server cluster Binding = 30 {
fabric_idx fabricIndex = 254;
}
- attribute TargetStruct binding[] = 0;
+ attribute access(write: manage) TargetStruct binding[] = 0;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -604,13 +604,13 @@ server cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
server cluster AccessControl = 31 {
- enum AccessControlEntryAuthModeEnum : ENUM8 {
+ enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
kCASE = 2;
kGroup = 3;
}
- enum AccessControlEntryPrivilegeEnum : ENUM8 {
+ enum AccessControlEntryPrivilegeEnum : enum8 {
kView = 1;
kProxyView = 2;
kOperate = 3;
@@ -618,7 +618,7 @@ server cluster AccessControl = 31 {
kAdminister = 5;
}
- enum ChangeTypeEnum : ENUM8 {
+ enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
@@ -674,19 +674,19 @@ server cluster AccessControl = 31 {
/** This cluster provides a standardized way for a Node (typically a Bridge, but could be any Node) to expose action information. */
server cluster Actions = 37 {
- enum ActionErrorEnum : ENUM8 {
+ enum ActionErrorEnum : enum8 {
kUnknown = 0;
kInterrupted = 1;
}
- enum ActionStateEnum : ENUM8 {
+ enum ActionStateEnum : enum8 {
kInactive = 0;
kActive = 1;
kPaused = 2;
kDisabled = 3;
}
- enum ActionTypeEnum : ENUM8 {
+ enum ActionTypeEnum : enum8 {
kOther = 0;
kScene = 1;
kSequence = 2;
@@ -696,13 +696,13 @@ server cluster Actions = 37 {
kAlarm = 6;
}
- enum EndpointListTypeEnum : ENUM8 {
+ enum EndpointListTypeEnum : enum8 {
kOther = 0;
kRoom = 1;
kZone = 2;
}
- bitmap CommandBits : BITMAP16 {
+ bitmap CommandBits : bitmap16 {
kInstantAction = 0x1;
kInstantActionWithTransition = 0x2;
kStartAction = 0x4;
@@ -761,7 +761,7 @@ server cluster Actions = 37 {
Commissioning and operational determination of Node characteristics, such as Vendor ID, Product ID and serial number,
which apply to the whole Node. Also allows setting user device information such as location. */
server cluster BasicInformation = 40 {
- enum ColorEnum : ENUM8 {
+ enum ColorEnum : enum8 {
kBlack = 0;
kNavy = 1;
kGreen = 2;
@@ -785,7 +785,7 @@ server cluster BasicInformation = 40 {
kGold = 20;
}
- enum ProductFinishEnum : ENUM8 {
+ enum ProductFinishEnum : enum8 {
kOther = 0;
kMatte = 1;
kSatin = 2;
@@ -849,20 +849,20 @@ server cluster BasicInformation = 40 {
/** Provides an interface for providing OTA software updates */
client cluster OtaSoftwareUpdateProvider = 41 {
- enum ApplyUpdateActionEnum : ENUM8 {
+ enum ApplyUpdateActionEnum : enum8 {
kProceed = 0;
kAwaitNextAction = 1;
kDiscontinue = 2;
}
- enum DownloadProtocolEnum : ENUM8 {
+ enum DownloadProtocolEnum : enum8 {
kBDXSynchronous = 0;
kBDXAsynchronous = 1;
kHTTPS = 2;
kVendorSpecific = 3;
}
- enum StatusEnum : ENUM8 {
+ enum StatusEnum : enum8 {
kUpdateAvailable = 0;
kBusy = 1;
kNotAvailable = 2;
@@ -923,13 +923,13 @@ client cluster OtaSoftwareUpdateProvider = 41 {
/** Provides an interface for downloading and applying OTA software updates */
server cluster OtaSoftwareUpdateRequestor = 42 {
- enum AnnouncementReasonEnum : ENUM8 {
+ enum AnnouncementReasonEnum : enum8 {
kSimpleAnnouncement = 0;
kUpdateAvailable = 1;
kUrgentUpdateAvailable = 2;
}
- enum ChangeReasonEnum : ENUM8 {
+ enum ChangeReasonEnum : enum8 {
kUnknown = 0;
kSuccess = 1;
kFailure = 2;
@@ -937,7 +937,7 @@ server cluster OtaSoftwareUpdateRequestor = 42 {
kDelayByProvider = 4;
}
- enum UpdateStateEnum : ENUM8 {
+ enum UpdateStateEnum : enum8 {
kUnknown = 0;
kIdle = 1;
kQuerying = 2;
@@ -1001,7 +1001,7 @@ server cluster OtaSoftwareUpdateRequestor = 42 {
standards. As such, Nodes that visually or audibly convey information need a mechanism by which
they can be configured to use a user’s preferred language, units, etc */
server cluster LocalizationConfiguration = 43 {
- attribute char_string<35> activeLocale = 0;
+ attribute access(write: manage) char_string<35> activeLocale = 0;
readonly attribute char_string supportedLocales[] = 1;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
@@ -1016,7 +1016,7 @@ server cluster LocalizationConfiguration = 43 {
or audibly convey time information need a mechanism by which they can be configured to use a
user’s preferred format. */
server cluster TimeFormatLocalization = 44 {
- enum CalendarTypeEnum : ENUM8 {
+ enum CalendarTypeEnum : enum8 {
kBuddhist = 0;
kChinese = 1;
kCoptic = 2;
@@ -1031,12 +1031,12 @@ server cluster TimeFormatLocalization = 44 {
kTaiwanese = 11;
}
- enum HourFormatEnum : ENUM8 {
+ enum HourFormatEnum : enum8 {
k12hr = 0;
k24hr = 1;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kCalendarFormat = 0x1;
}
@@ -1056,13 +1056,13 @@ server cluster TimeFormatLocalization = 44 {
user. As such, Nodes that visually or audibly convey measurable values to the user need a
mechanism by which they can be configured to use a user’s preferred unit. */
server cluster UnitLocalization = 45 {
- enum TempUnitEnum : ENUM8 {
+ enum TempUnitEnum : enum8 {
kFahrenheit = 0;
kCelsius = 1;
kKelvin = 2;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kTemperatureUnit = 0x1;
}
@@ -1077,7 +1077,7 @@ server cluster UnitLocalization = 45 {
/** This cluster is used to describe the configuration and capabilities of a Device's power system. */
server cluster PowerSourceConfiguration = 46 {
- readonly attribute int8u sources[] = 0;
+ readonly attribute endpoint_no sources[] = 0;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1088,7 +1088,7 @@ server cluster PowerSourceConfiguration = 46 {
/** This cluster is used to describe the configuration and capabilities of a physical power source that provides power to the Node. */
server cluster PowerSource = 47 {
- enum BatApprovedChemistryEnum : ENUM16 {
+ enum BatApprovedChemistryEnum : enum16 {
kUnspecified = 0;
kAlkaline = 1;
kLithiumCarbonFluoride = 2;
@@ -1124,7 +1124,7 @@ server cluster PowerSource = 47 {
kZincCerium = 32;
}
- enum BatChargeFaultEnum : ENUM8 {
+ enum BatChargeFaultEnum : enum8 {
kUnspecified = 0;
kAmbientTooHot = 1;
kAmbientTooCold = 2;
@@ -1138,20 +1138,20 @@ server cluster PowerSource = 47 {
kSafetyTimeout = 10;
}
- enum BatChargeLevelEnum : ENUM8 {
+ enum BatChargeLevelEnum : enum8 {
kOK = 0;
kWarning = 1;
kCritical = 2;
}
- enum BatChargeStateEnum : ENUM8 {
+ enum BatChargeStateEnum : enum8 {
kUnknown = 0;
kIsCharging = 1;
kIsAtFullCharge = 2;
kIsNotCharging = 3;
}
- enum BatCommonDesignationEnum : ENUM16 {
+ enum BatCommonDesignationEnum : enum16 {
kUnspecified = 0;
kAAA = 1;
kAA = 2;
@@ -1235,38 +1235,38 @@ server cluster PowerSource = 47 {
k32600 = 80;
}
- enum BatFaultEnum : ENUM8 {
+ enum BatFaultEnum : enum8 {
kUnspecified = 0;
kOverTemp = 1;
kUnderTemp = 2;
}
- enum BatReplaceabilityEnum : ENUM8 {
+ enum BatReplaceabilityEnum : enum8 {
kUnspecified = 0;
kNotReplaceable = 1;
kUserReplaceable = 2;
kFactoryReplaceable = 3;
}
- enum PowerSourceStatusEnum : ENUM8 {
+ enum PowerSourceStatusEnum : enum8 {
kUnspecified = 0;
kActive = 1;
kStandby = 2;
kUnavailable = 3;
}
- enum WiredCurrentTypeEnum : ENUM8 {
+ enum WiredCurrentTypeEnum : enum8 {
kAC = 0;
kDC = 1;
}
- enum WiredFaultEnum : ENUM8 {
+ enum WiredFaultEnum : enum8 {
kUnspecified = 0;
kOverVoltage = 1;
kUnderVoltage = 2;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kWired = 0x1;
kBattery = 0x2;
kRechargeable = 0x4;
@@ -1320,7 +1320,7 @@ server cluster PowerSource = 47 {
/** This cluster is used to manage global aspects of the Commissioning flow. */
server cluster GeneralCommissioning = 48 {
- enum CommissioningErrorEnum : ENUM8 {
+ enum CommissioningErrorEnum : enum8 {
kOK = 0;
kValueOutsideRange = 1;
kInvalidAuthentication = 2;
@@ -1328,7 +1328,7 @@ server cluster GeneralCommissioning = 48 {
kBusyWithOtherAdmin = 4;
}
- enum RegulatoryLocationTypeEnum : ENUM8 {
+ enum RegulatoryLocationTypeEnum : enum8 {
kIndoor = 0;
kOutdoor = 1;
kIndoorOutdoor = 2;
@@ -1384,7 +1384,7 @@ server cluster GeneralCommissioning = 48 {
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
server cluster NetworkCommissioning = 49 {
- enum NetworkCommissioningStatusEnum : ENUM8 {
+ enum NetworkCommissioningStatusEnum : enum8 {
kSuccess = 0;
kOutOfRange = 1;
kBoundsExceeded = 2;
@@ -1400,7 +1400,7 @@ server cluster NetworkCommissioning = 49 {
kUnknownError = 12;
}
- enum WiFiBandEnum : ENUM8 {
+ enum WiFiBandEnum : enum8 {
k2G4 = 0;
k3G65 = 1;
k5G = 2;
@@ -1409,13 +1409,21 @@ server cluster NetworkCommissioning = 49 {
k1G = 5;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kWiFiNetworkInterface = 0x1;
kThreadNetworkInterface = 0x2;
kEthernetNetworkInterface = 0x4;
}
- bitmap WiFiSecurityBitmap : BITMAP8 {
+ bitmap ThreadCapabilitiesBitmap : bitmap16 {
+ kIsBorderRouterCapable = 0x1;
+ kIsRouterCapable = 0x2;
+ kIsSleepyEndDeviceCapable = 0x4;
+ kIsFullThreadDevice = 0x8;
+ kIsSynchronizedSleepyEndDeviceCapable = 0x10;
+ }
+
+ bitmap WiFiSecurityBitmap : bitmap8 {
kUnencrypted = 0x1;
kWEP = 0x2;
kWPAPersonal = 0x4;
@@ -1569,13 +1577,13 @@ client cluster DiagnosticLogs = 50 {
/** The cluster provides commands for retrieving unstructured diagnostic logs from a Node that may be used to aid in diagnostics. */
server cluster DiagnosticLogs = 50 {
- enum IntentEnum : ENUM8 {
+ enum IntentEnum : enum8 {
kEndUserSupport = 0;
kNetworkDiag = 1;
kCrashLogs = 2;
}
- enum StatusEnum : ENUM8 {
+ enum StatusEnum : enum8 {
kSuccess = 0;
kExhausted = 1;
kNoLogs = 2;
@@ -1583,7 +1591,7 @@ server cluster DiagnosticLogs = 50 {
kDenied = 4;
}
- enum TransferProtocolEnum : ENUM8 {
+ enum TransferProtocolEnum : enum8 {
kResponsePayload = 0;
kBDX = 1;
}
@@ -1613,7 +1621,7 @@ server cluster DiagnosticLogs = 50 {
/** The General Diagnostics Cluster, along with other diagnostics clusters, provide a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */
server cluster GeneralDiagnostics = 51 {
- enum BootReasonEnum : ENUM8 {
+ enum BootReasonEnum : enum8 {
kUnspecified = 0;
kPowerOnReboot = 1;
kBrownOutReset = 2;
@@ -1623,7 +1631,7 @@ server cluster GeneralDiagnostics = 51 {
kSoftwareReset = 6;
}
- enum HardwareFaultEnum : ENUM8 {
+ enum HardwareFaultEnum : enum8 {
kUnspecified = 0;
kRadio = 1;
kSensor = 2;
@@ -1637,7 +1645,7 @@ server cluster GeneralDiagnostics = 51 {
kTamperDetected = 10;
}
- enum InterfaceTypeEnum : ENUM8 {
+ enum InterfaceTypeEnum : enum8 {
kUnspecified = 0;
kWiFi = 1;
kEthernet = 2;
@@ -1645,14 +1653,14 @@ server cluster GeneralDiagnostics = 51 {
kThread = 4;
}
- enum NetworkFaultEnum : ENUM8 {
+ enum NetworkFaultEnum : enum8 {
kUnspecified = 0;
kHardwareFailure = 1;
kNetworkJammed = 2;
kConnectionFailed = 3;
}
- enum RadioFaultEnum : ENUM8 {
+ enum RadioFaultEnum : enum8 {
kUnspecified = 0;
kWiFiFault = 1;
kCellularFault = 2;
@@ -1718,8 +1726,8 @@ server cluster GeneralDiagnostics = 51 {
/** The Software Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */
server cluster SoftwareDiagnostics = 52 {
- bitmap Feature : BITMAP32 {
- kWaterMarks = 0x1;
+ bitmap Feature : bitmap32 {
+ kWatermarks = 0x1;
}
struct ThreadMetricsStruct {
@@ -1747,24 +1755,24 @@ server cluster SoftwareDiagnostics = 52 {
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
- command ResetWatermarks(): DefaultSuccess = 0;
+ command access(invoke: manage) ResetWatermarks(): DefaultSuccess = 0;
}
/** The Thread Network Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems */
server cluster ThreadNetworkDiagnostics = 53 {
- enum ConnectionStatusEnum : ENUM8 {
+ enum ConnectionStatusEnum : enum8 {
kConnected = 0;
kNotConnected = 1;
}
- enum NetworkFaultEnum : ENUM8 {
+ enum NetworkFaultEnum : enum8 {
kUnspecified = 0;
kLinkDown = 1;
kHardwareFailure = 2;
kNetworkJammed = 3;
}
- enum RoutingRoleEnum : ENUM8 {
+ enum RoutingRoleEnum : enum8 {
kUnspecified = 0;
kUnassigned = 1;
kSleepyEndDevice = 2;
@@ -1774,7 +1782,7 @@ server cluster ThreadNetworkDiagnostics = 53 {
kLeader = 6;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kPacketCounts = 0x1;
kErrorCounts = 0x2;
kMLECounts = 0x4;
@@ -1915,19 +1923,19 @@ server cluster ThreadNetworkDiagnostics = 53 {
/** The Wi-Fi Network Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */
server cluster WiFiNetworkDiagnostics = 54 {
- enum AssociationFailureCauseEnum : ENUM8 {
+ enum AssociationFailureCauseEnum : enum8 {
kUnknown = 0;
kAssociationFailed = 1;
kAuthenticationFailed = 2;
kSsidNotFound = 3;
}
- enum ConnectionStatusEnum : ENUM8 {
+ enum ConnectionStatusEnum : enum8 {
kConnected = 0;
kNotConnected = 1;
}
- enum SecurityTypeEnum : ENUM8 {
+ enum SecurityTypeEnum : enum8 {
kUnspecified = 0;
kNone = 1;
kWEP = 2;
@@ -1936,7 +1944,7 @@ server cluster WiFiNetworkDiagnostics = 54 {
kWPA3 = 5;
}
- enum WiFiVersionEnum : ENUM8 {
+ enum WiFiVersionEnum : enum8 {
kA = 0;
kB = 1;
kG = 2;
@@ -1946,7 +1954,7 @@ server cluster WiFiNetworkDiagnostics = 54 {
kAh = 6;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kPacketCounts = 0x1;
kErrorCounts = 0x2;
}
@@ -1989,7 +1997,7 @@ server cluster WiFiNetworkDiagnostics = 54 {
/** The Ethernet Network Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */
server cluster EthernetNetworkDiagnostics = 55 {
- enum PHYRateEnum : ENUM8 {
+ enum PHYRateEnum : enum8 {
kRate10M = 0;
kRate100M = 1;
kRate1G = 2;
@@ -2002,7 +2010,7 @@ server cluster EthernetNetworkDiagnostics = 55 {
kRate400G = 9;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kPacketCounts = 0x1;
kErrorCounts = 0x2;
}
@@ -2023,12 +2031,12 @@ server cluster EthernetNetworkDiagnostics = 55 {
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
- command ResetCounts(): DefaultSuccess = 0;
+ command access(invoke: manage) ResetCounts(): DefaultSuccess = 0;
}
/** Accurate time is required for a number of reasons, including scheduling, display and validating security materials. */
server cluster TimeSynchronization = 56 {
- enum GranularityEnum : ENUM8 {
+ enum GranularityEnum : enum8 {
kNoTimeGranularity = 0;
kMinutesGranularity = 1;
kSecondsGranularity = 2;
@@ -2036,11 +2044,11 @@ server cluster TimeSynchronization = 56 {
kMicrosecondsGranularity = 4;
}
- enum StatusCode : ENUM8 {
+ enum StatusCode : enum8 {
kTimeNotAccepted = 2;
}
- enum TimeSourceEnum : ENUM8 {
+ enum TimeSourceEnum : enum8 {
kNone = 0;
kUnknown = 1;
kAdmin = 2;
@@ -2060,13 +2068,13 @@ server cluster TimeSynchronization = 56 {
kGNSS = 16;
}
- enum TimeZoneDatabaseEnum : ENUM8 {
+ enum TimeZoneDatabaseEnum : enum8 {
kFull = 0;
kPartial = 1;
kNone = 2;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kTimeZone = 0x1;
kNTPClient = 0x2;
kNTPServer = 0x4;
@@ -2170,7 +2178,7 @@ server cluster TimeSynchronization = 56 {
Two types of switch devices are supported: latching switch (e.g. rocker switch) and momentary switch (e.g. push button), distinguished with their feature flags.
Interactions with the switch device are exposed as attributes (for the latching switch) and as events (for both types of switches). An interested party MAY subscribe to these attributes/events and thus be informed of the interactions, and can perform actions based on this, for example by sending commands to perform an action such as controlling a light or a window shade. */
server cluster Switch = 59 {
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kLatchingSwitch = 0x1;
kMomentarySwitch = 0x2;
kMomentarySwitchRelease = 0x4;
@@ -2220,21 +2228,25 @@ server cluster Switch = 59 {
/** Commands to trigger a Node to allow a new Administrator to commission it. */
server cluster AdministratorCommissioning = 60 {
- enum CommissioningWindowStatusEnum : ENUM8 {
+ enum CommissioningWindowStatusEnum : enum8 {
kWindowNotOpen = 0;
kEnhancedWindowOpen = 1;
kBasicWindowOpen = 2;
}
- enum StatusCode : ENUM8 {
+ enum StatusCode : enum8 {
kBusy = 2;
kPAKEParameterError = 3;
kWindowNotOpen = 4;
}
+ bitmap Feature : bitmap32 {
+ kBasic = 0x1;
+ }
+
readonly attribute CommissioningWindowStatusEnum windowStatus = 0;
readonly attribute nullable fabric_idx adminFabricIndex = 1;
- readonly attribute nullable int16u adminVendorId = 2;
+ readonly attribute nullable vendor_id adminVendorId = 2;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -2247,7 +2259,7 @@ server cluster AdministratorCommissioning = 60 {
octet_string PAKEPasscodeVerifier = 1;
int16u discriminator = 2;
int32u iterations = 3;
- octet_string salt = 4;
+ octet_string<32> salt = 4;
}
request struct OpenBasicCommissioningWindowRequest {
@@ -2261,12 +2273,12 @@ server cluster AdministratorCommissioning = 60 {
/** This cluster is used to add or remove Operational Credentials on a Commissionee or Node, as well as manage the associated Fabrics. */
server cluster OperationalCredentials = 62 {
- enum CertificateChainTypeEnum : ENUM8 {
+ enum CertificateChainTypeEnum : enum8 {
kDACCertificate = 1;
kPAICertificate = 2;
}
- enum NodeOperationalCertStatusEnum : ENUM8 {
+ enum NodeOperationalCertStatusEnum : enum8 {
kOK = 0;
kInvalidPublicKey = 1;
kInvalidNodeOpId = 2;
@@ -2308,7 +2320,7 @@ server cluster OperationalCredentials = 62 {
readonly attribute int16u clusterRevision = 65533;
request struct AttestationRequestRequest {
- octet_string attestationNonce = 0;
+ octet_string<32> attestationNonce = 0;
}
request struct CertificateChainRequestRequest {
@@ -2316,14 +2328,14 @@ server cluster OperationalCredentials = 62 {
}
request struct CSRRequestRequest {
- octet_string CSRNonce = 0;
+ octet_string<32> CSRNonce = 0;
optional boolean isForUpdateNOC = 1;
}
request struct AddNOCRequest {
- octet_string NOCValue = 0;
- optional octet_string ICACValue = 1;
- octet_string IPKValue = 2;
+ octet_string<400> NOCValue = 0;
+ optional octet_string<400> ICACValue = 1;
+ octet_string<16> IPKValue = 2;
int64u caseAdminSubject = 3;
vendor_id adminVendorId = 4;
}
@@ -2346,12 +2358,12 @@ server cluster OperationalCredentials = 62 {
}
response struct AttestationResponse = 1 {
- octet_string attestationElements = 0;
- octet_string attestationSignature = 1;
+ octet_string<900> attestationElements = 0;
+ octet_string<64> attestationSignature = 1;
}
response struct CertificateChainResponse = 3 {
- octet_string certificate = 0;
+ octet_string<600> certificate = 0;
}
response struct CSRResponse = 5 {
@@ -2362,7 +2374,7 @@ server cluster OperationalCredentials = 62 {
response struct NOCResponse = 8 {
NodeOperationalCertStatusEnum statusCode = 0;
optional fabric_idx fabricIndex = 1;
- optional char_string debugText = 2;
+ optional char_string<128> debugText = 2;
}
command access(invoke: administer) AttestationRequest(AttestationRequestRequest): AttestationResponse = 0;
@@ -2377,12 +2389,12 @@ server cluster OperationalCredentials = 62 {
/** The Group Key Management Cluster is the mechanism by which group keys are managed. */
server cluster GroupKeyManagement = 63 {
- enum GroupKeySecurityPolicyEnum : ENUM8 {
+ enum GroupKeySecurityPolicyEnum : enum8 {
kTrustFirst = 0;
kCacheAndSync = 1;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kCacheAndSync = 0x1;
}
@@ -2497,8 +2509,30 @@ server cluster BooleanState = 69 {
/** Allows servers to ensure that listed clients are notified when a server is available for communication. */
server cluster IcdManagement = 70 {
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kCheckInProtocolSupport = 0x1;
+ kUserActiveModeTrigger = 0x2;
+ kLongIdleTimeSupport = 0x4;
+ }
+
+ bitmap UserActiveModeTriggerBitmap : bitmap32 {
+ kPowerCycle = 0x1;
+ kSettingsMenu = 0x2;
+ kCustomInstruction = 0x4;
+ kDeviceManual = 0x8;
+ kActuateSensor = 0x10;
+ kActuateSensorSeconds = 0x20;
+ kActuateSensorTimes = 0x40;
+ kActuateSensorLightsBlink = 0x80;
+ kResetButton = 0x100;
+ kResetButtonLightsBlink = 0x200;
+ kResetButtonSeconds = 0x400;
+ kResetButtonTimes = 0x800;
+ kSetupButton = 0x1000;
+ kSetupButtonSeconds = 0x2000;
+ kSetupButtonLightsBlink = 0x4000;
+ kSetupButtonTimes = 0x8000;
+ kAppDefinedButton = 0x10000;
}
fabric_scoped struct MonitoringRegistrationStruct {
@@ -2507,8 +2541,8 @@ server cluster IcdManagement = 70 {
fabric_idx fabricIndex = 254;
}
- readonly attribute int32u idleModeInterval = 0;
- readonly attribute int32u activeModeInterval = 1;
+ readonly attribute int32u idleModeDuration = 0;
+ readonly attribute int32u activeModeDuration = 1;
readonly attribute int16u activeModeThreshold = 2;
readonly attribute access(read: administer) MonitoringRegistrationStruct registeredClients[] = 3;
readonly attribute access(read: administer) int32u ICDCounter = 4;
@@ -2543,7 +2577,7 @@ server cluster IcdManagement = 70 {
/** Attributes and commands for selecting a mode from a list of supported options. */
server cluster ModeSelect = 80 {
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kOnOff = 0x1;
}
@@ -2581,14 +2615,14 @@ server cluster ModeSelect = 80 {
/** Attributes and commands for selecting a mode from a list of supported options. */
server cluster LaundryWasherMode = 81 {
- enum ModeTag : ENUM16 {
+ enum ModeTag : enum16 {
kNormal = 16384;
kDelicate = 16385;
kHeavy = 16386;
kWhites = 16387;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kOnOff = 0x1;
}
@@ -2628,12 +2662,12 @@ server cluster LaundryWasherMode = 81 {
/** Attributes and commands for selecting a mode from a list of supported options. */
server cluster RefrigeratorAndTemperatureControlledCabinetMode = 82 {
- enum ModeTag : ENUM16 {
+ enum ModeTag : enum16 {
kRapidCool = 16384;
kRapidFreeze = 16385;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kOnOff = 0x1;
}
@@ -2673,14 +2707,14 @@ server cluster RefrigeratorAndTemperatureControlledCabinetMode = 82 {
/** This cluster supports remotely monitoring and controling the different typs of functionality available to a washing device, such as a washing machine. */
server cluster LaundryWasherControls = 83 {
- enum NumberOfRinsesEnum : ENUM8 {
+ enum NumberOfRinsesEnum : enum8 {
kNone = 0;
kNormal = 1;
kExtra = 2;
kMax = 3;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kSpin = 0x1;
kRinse = 0x2;
}
@@ -2699,12 +2733,12 @@ server cluster LaundryWasherControls = 83 {
/** Attributes and commands for selecting a mode from a list of supported options. */
server cluster RvcRunMode = 84 {
- enum ModeTag : ENUM16 {
+ enum ModeTag : enum16 {
kIdle = 16384;
kCleaning = 16385;
}
- enum StatusCode : ENUM8 {
+ enum StatusCode : enum8 {
kStuck = 65;
kDustBinMissing = 66;
kDustBinFull = 67;
@@ -2715,7 +2749,7 @@ server cluster RvcRunMode = 84 {
kBatteryLow = 72;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kOnOff = 0x1;
}
@@ -2732,7 +2766,6 @@ server cluster RvcRunMode = 84 {
readonly attribute ModeOptionStruct supportedModes[] = 0;
readonly attribute int8u currentMode = 1;
- attribute nullable int8u startUpMode = 2;
attribute nullable int8u onMode = 3;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
@@ -2755,17 +2788,17 @@ server cluster RvcRunMode = 84 {
/** Attributes and commands for selecting a mode from a list of supported options. */
server cluster RvcCleanMode = 85 {
- enum ModeTag : ENUM16 {
+ enum ModeTag : enum16 {
kDeepClean = 16384;
kVacuum = 16385;
kMop = 16386;
}
- enum StatusCode : ENUM8 {
+ enum StatusCode : enum8 {
kCleaningInProgress = 64;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kOnOff = 0x1;
}
@@ -2782,7 +2815,6 @@ server cluster RvcCleanMode = 85 {
readonly attribute ModeOptionStruct supportedModes[] = 0;
readonly attribute int8u currentMode = 1;
- attribute nullable int8u startUpMode = 2;
attribute nullable int8u onMode = 3;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
@@ -2805,7 +2837,7 @@ server cluster RvcCleanMode = 85 {
/** Attributes and commands for configuring the temperature control, and reporting temperature. */
server cluster TemperatureControl = 86 {
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kTemperatureNumber = 0x1;
kTemperatureLevel = 0x2;
kTemperatureStep = 0x4;
@@ -2830,7 +2862,7 @@ server cluster TemperatureControl = 86 {
/** Attributes and commands for configuring the Refrigerator alarm. */
server cluster RefrigeratorAlarm = 87 {
- bitmap AlarmMap : BITMAP32 {
+ bitmap AlarmMap : bitmap32 {
kDoorOpen = 0x1;
}
@@ -2854,13 +2886,13 @@ server cluster RefrigeratorAlarm = 87 {
/** Attributes and commands for selecting a mode from a list of supported options. */
server cluster DishwasherMode = 89 {
- enum ModeTag : ENUM16 {
+ enum ModeTag : enum16 {
kNormal = 16384;
kHeavy = 16385;
kLight = 16386;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kOnOff = 0x1;
}
@@ -2900,7 +2932,7 @@ server cluster DishwasherMode = 89 {
/** Attributes for reporting air quality classification */
server cluster AirQuality = 91 {
- enum AirQualityEnum : ENUM8 {
+ enum AirQualityEnum : enum8 {
kUnknown = 0;
kGood = 1;
kFair = 2;
@@ -2910,7 +2942,7 @@ server cluster AirQuality = 91 {
kExtremelyPoor = 6;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kFair = 0x1;
kModerate = 0x2;
kVeryPoor = 0x4;
@@ -2928,25 +2960,25 @@ server cluster AirQuality = 91 {
/** This cluster provides an interface for observing and managing the state of smoke and CO alarms. */
server cluster SmokeCoAlarm = 92 {
- enum AlarmStateEnum : ENUM8 {
+ enum AlarmStateEnum : enum8 {
kNormal = 0;
kWarning = 1;
kCritical = 2;
}
- enum ContaminationStateEnum : ENUM8 {
+ enum ContaminationStateEnum : enum8 {
kNormal = 0;
kLow = 1;
kWarning = 2;
kCritical = 3;
}
- enum EndOfServiceEnum : ENUM8 {
+ enum EndOfServiceEnum : enum8 {
kNormal = 0;
kExpired = 1;
}
- enum ExpressedStateEnum : ENUM8 {
+ enum ExpressedStateEnum : enum8 {
kNormal = 0;
kSmokeAlarm = 1;
kCOAlarm = 2;
@@ -2958,18 +2990,18 @@ server cluster SmokeCoAlarm = 92 {
kInterconnectCO = 8;
}
- enum MuteStateEnum : ENUM8 {
+ enum MuteStateEnum : enum8 {
kNotMuted = 0;
kMuted = 1;
}
- enum SensitivityEnum : ENUM8 {
+ enum SensitivityEnum : enum8 {
kHigh = 0;
kStandard = 1;
kLow = 2;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kSmokeAlarm = 0x1;
kCOAlarm = 0x2;
}
@@ -3023,7 +3055,7 @@ server cluster SmokeCoAlarm = 92 {
readonly attribute AlarmStateEnum interconnectSmokeAlarm = 8;
readonly attribute AlarmStateEnum interconnectCOAlarm = 9;
readonly attribute ContaminationStateEnum contaminationState = 10;
- attribute SensitivityEnum smokeSensitivityLevel = 11;
+ attribute access(write: manage) SensitivityEnum smokeSensitivityLevel = 11;
readonly attribute epoch_s expiryDate = 12;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
@@ -3037,7 +3069,7 @@ server cluster SmokeCoAlarm = 92 {
/** Attributes and commands for configuring the Dishwasher alarm. */
server cluster DishwasherAlarm = 93 {
- bitmap AlarmMap : BITMAP32 {
+ bitmap AlarmMap : bitmap32 {
kInflowError = 0x1;
kDrainError = 0x2;
kDoorError = 0x4;
@@ -3046,7 +3078,7 @@ server cluster DishwasherAlarm = 93 {
kWaterLevelError = 0x20;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kReset = 0x1;
}
@@ -3082,14 +3114,14 @@ server cluster DishwasherAlarm = 93 {
/** This cluster supports remotely monitoring and, where supported, changing the operational state of any device where a state machine is a part of the operation. */
server cluster OperationalState = 96 {
- enum ErrorStateEnum : ENUM8 {
+ enum ErrorStateEnum : enum8 {
kNoError = 0;
kUnableToStartOrResume = 1;
kUnableToCompleteOperation = 2;
kCommandInvalidInState = 3;
}
- enum OperationalStateEnum : ENUM8 {
+ enum OperationalStateEnum : enum8 {
kStopped = 0;
kRunning = 1;
kPaused = 2;
@@ -3142,7 +3174,7 @@ server cluster OperationalState = 96 {
/** This cluster supports remotely monitoring and, where supported, changing the operational state of a Robotic Vacuum. */
server cluster RvcOperationalState = 97 {
- enum ErrorStateEnum : ENUM8 {
+ enum ErrorStateEnum : enum8 {
kFailedToFindChargingDock = 64;
kStuck = 65;
kDustBinMissing = 66;
@@ -3153,7 +3185,7 @@ server cluster RvcOperationalState = 97 {
kMopCleaningPadMissing = 71;
}
- enum OperationalStateEnum : ENUM8 {
+ enum OperationalStateEnum : enum8 {
kSeekingCharger = 64;
kCharging = 65;
kDocked = 66;
@@ -3203,18 +3235,18 @@ server cluster RvcOperationalState = 97 {
/** Attributes and commands for monitoring HEPA filters in a device */
server cluster HepaFilterMonitoring = 113 {
- enum ChangeIndicationEnum : ENUM8 {
+ enum ChangeIndicationEnum : enum8 {
kOK = 0;
kWarning = 1;
kCritical = 2;
}
- enum DegradationDirectionEnum : ENUM8 {
+ enum DegradationDirectionEnum : enum8 {
kUp = 0;
kDown = 1;
}
- enum ProductIdentifierTypeEnum : ENUM8 {
+ enum ProductIdentifierTypeEnum : enum8 {
kUPC = 0;
kGTIN8 = 1;
kEAN = 2;
@@ -3222,7 +3254,7 @@ server cluster HepaFilterMonitoring = 113 {
kOEM = 4;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kCondition = 0x1;
kWarning = 0x2;
kReplacementProductList = 0x4;
@@ -3251,18 +3283,18 @@ server cluster HepaFilterMonitoring = 113 {
/** Attributes and commands for monitoring activated carbon filters in a device */
server cluster ActivatedCarbonFilterMonitoring = 114 {
- enum ChangeIndicationEnum : ENUM8 {
+ enum ChangeIndicationEnum : enum8 {
kOK = 0;
kWarning = 1;
kCritical = 2;
}
- enum DegradationDirectionEnum : ENUM8 {
+ enum DegradationDirectionEnum : enum8 {
kUp = 0;
kDown = 1;
}
- enum ProductIdentifierTypeEnum : ENUM8 {
+ enum ProductIdentifierTypeEnum : enum8 {
kUPC = 0;
kGTIN8 = 1;
kEAN = 2;
@@ -3270,7 +3302,7 @@ server cluster ActivatedCarbonFilterMonitoring = 114 {
kOEM = 4;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kCondition = 0x1;
kWarning = 0x2;
kReplacementProductList = 0x4;
@@ -3297,552 +3329,9 @@ server cluster ActivatedCarbonFilterMonitoring = 114 {
command ResetCondition(): DefaultSuccess = 0;
}
-/** An interface to a generic way to secure a door */
-server cluster DoorLock = 257 {
- enum AlarmCodeEnum : ENUM8 {
- kLockJammed = 0;
- kLockFactoryReset = 1;
- kLockRadioPowerCycled = 3;
- kWrongCodeEntryLimit = 4;
- kFrontEsceutcheonRemoved = 5;
- kDoorForcedOpen = 6;
- kDoorAjar = 7;
- kForcedUser = 8;
- }
-
- enum CredentialRuleEnum : ENUM8 {
- kSingle = 0;
- kDual = 1;
- kTri = 2;
- }
-
- enum CredentialTypeEnum : ENUM8 {
- kProgrammingPIN = 0;
- kPIN = 1;
- kRFID = 2;
- kFingerprint = 3;
- kFingerVein = 4;
- kFace = 5;
- }
-
- enum DataOperationTypeEnum : ENUM8 {
- kAdd = 0;
- kClear = 1;
- kModify = 2;
- }
-
- enum DlLockState : ENUM8 {
- kNotFullyLocked = 0;
- kLocked = 1;
- kUnlocked = 2;
- kUnlatched = 3;
- }
-
- enum DlLockType : ENUM8 {
- kDeadBolt = 0;
- kMagnetic = 1;
- kOther = 2;
- kMortise = 3;
- kRim = 4;
- kLatchBolt = 5;
- kCylindricalLock = 6;
- kTubularLock = 7;
- kInterconnectedLock = 8;
- kDeadLatch = 9;
- kDoorFurniture = 10;
- kEurocylinder = 11;
- }
-
- enum DlStatus : ENUM8 {
- kSuccess = 0;
- kFailure = 1;
- kDuplicate = 2;
- kOccupied = 3;
- kInvalidField = 133;
- kResourceExhausted = 137;
- kNotFound = 139;
- }
-
- enum DoorLockOperationEventCode : ENUM8 {
- kUnknownOrMfgSpecific = 0;
- kLock = 1;
- kUnlock = 2;
- kLockInvalidPinOrId = 3;
- kLockInvalidSchedule = 4;
- kUnlockInvalidPinOrId = 5;
- kUnlockInvalidSchedule = 6;
- kOneTouchLock = 7;
- kKeyLock = 8;
- kKeyUnlock = 9;
- kAutoLock = 10;
- kScheduleLock = 11;
- kScheduleUnlock = 12;
- kManualLock = 13;
- kManualUnlock = 14;
- }
-
- enum DoorLockProgrammingEventCode : ENUM8 {
- kUnknownOrMfgSpecific = 0;
- kMasterCodeChanged = 1;
- kPinAdded = 2;
- kPinDeleted = 3;
- kPinChanged = 4;
- kIdAdded = 5;
- kIdDeleted = 6;
- }
-
- enum DoorLockSetPinOrIdStatus : ENUM8 {
- kSuccess = 0;
- kGeneralFailure = 1;
- kMemoryFull = 2;
- kDuplicateCodeError = 3;
- }
-
- enum DoorLockUserStatus : ENUM8 {
- kAvailable = 0;
- kOccupiedEnabled = 1;
- kOccupiedDisabled = 3;
- kNotSupported = 255;
- }
-
- enum DoorLockUserType : ENUM8 {
- kUnrestricted = 0;
- kYearDayScheduleUser = 1;
- kWeekDayScheduleUser = 2;
- kMasterUser = 3;
- kNonAccessUser = 4;
- kNotSupported = 255;
- }
-
- enum DoorStateEnum : ENUM8 {
- kDoorOpen = 0;
- kDoorClosed = 1;
- kDoorJammed = 2;
- kDoorForcedOpen = 3;
- kDoorUnspecifiedError = 4;
- kDoorAjar = 5;
- }
-
- enum LockDataTypeEnum : ENUM8 {
- kUnspecified = 0;
- kProgrammingCode = 1;
- kUserIndex = 2;
- kWeekDaySchedule = 3;
- kYearDaySchedule = 4;
- kHolidaySchedule = 5;
- kPIN = 6;
- kRFID = 7;
- kFingerprint = 8;
- kFingerVein = 9;
- kFace = 10;
- }
-
- enum LockOperationTypeEnum : ENUM8 {
- kLock = 0;
- kUnlock = 1;
- kNonAccessUserEvent = 2;
- kForcedUserEvent = 3;
- kUnlatch = 4;
- }
-
- enum OperatingModeEnum : ENUM8 {
- kNormal = 0;
- kVacation = 1;
- kPrivacy = 2;
- kNoRemoteLockUnlock = 3;
- kPassage = 4;
- }
-
- enum OperationErrorEnum : ENUM8 {
- kUnspecified = 0;
- kInvalidCredential = 1;
- kDisabledUserDenied = 2;
- kRestricted = 3;
- kInsufficientBattery = 4;
- }
-
- enum OperationSourceEnum : ENUM8 {
- kUnspecified = 0;
- kManual = 1;
- kProprietaryRemote = 2;
- kKeypad = 3;
- kAuto = 4;
- kButton = 5;
- kSchedule = 6;
- kRemote = 7;
- kRFID = 8;
- kBiometric = 9;
- }
-
- enum UserStatusEnum : ENUM8 {
- kAvailable = 0;
- kOccupiedEnabled = 1;
- kOccupiedDisabled = 3;
- }
-
- enum UserTypeEnum : ENUM8 {
- kUnrestrictedUser = 0;
- kYearDayScheduleUser = 1;
- kWeekDayScheduleUser = 2;
- kProgrammingUser = 3;
- kNonAccessUser = 4;
- kForcedUser = 5;
- kDisposableUser = 6;
- kExpiringUser = 7;
- kScheduleRestrictedUser = 8;
- kRemoteOnlyUser = 9;
- }
-
- bitmap DaysMaskMap : BITMAP8 {
- kSunday = 0x1;
- kMonday = 0x2;
- kTuesday = 0x4;
- kWednesday = 0x8;
- kThursday = 0x10;
- kFriday = 0x20;
- kSaturday = 0x40;
- }
-
- bitmap DlCredentialRuleMask : BITMAP8 {
- kSingle = 0x1;
- kDual = 0x2;
- kTri = 0x4;
- }
-
- bitmap DlCredentialRulesSupport : BITMAP8 {
- kSingle = 0x1;
- kDual = 0x2;
- kTri = 0x4;
- }
-
- bitmap DlDefaultConfigurationRegister : BITMAP16 {
- kEnableLocalProgrammingEnabled = 0x1;
- kKeypadInterfaceDefaultAccessEnabled = 0x2;
- kRemoteInterfaceDefaultAccessIsEnabled = 0x4;
- kSoundEnabled = 0x20;
- kAutoRelockTimeSet = 0x40;
- kLEDSettingsSet = 0x80;
- }
-
- bitmap DlKeypadOperationEventMask : BITMAP16 {
- kUnknown = 0x1;
- kLock = 0x2;
- kUnlock = 0x4;
- kLockInvalidPIN = 0x8;
- kLockInvalidSchedule = 0x10;
- kUnlockInvalidCode = 0x20;
- kUnlockInvalidSchedule = 0x40;
- kNonAccessUserOpEvent = 0x80;
- }
-
- bitmap DlKeypadProgrammingEventMask : BITMAP16 {
- kUnknown = 0x1;
- kProgrammingPINChanged = 0x2;
- kPINAdded = 0x4;
- kPINCleared = 0x8;
- kPINChanged = 0x10;
- }
-
- bitmap DlLocalProgrammingFeatures : BITMAP8 {
- kAddUsersCredentialsSchedulesLocally = 0x1;
- kModifyUsersCredentialsSchedulesLocally = 0x2;
- kClearUsersCredentialsSchedulesLocally = 0x4;
- kAdjustLockSettingsLocally = 0x8;
- }
-
- bitmap DlManualOperationEventMask : BITMAP16 {
- kUnknown = 0x1;
- kThumbturnLock = 0x2;
- kThumbturnUnlock = 0x4;
- kOneTouchLock = 0x8;
- kKeyLock = 0x10;
- kKeyUnlock = 0x20;
- kAutoLock = 0x40;
- kScheduleLock = 0x80;
- kScheduleUnlock = 0x100;
- kManualLock = 0x200;
- kManualUnlock = 0x400;
- }
-
- bitmap DlRFIDOperationEventMask : BITMAP16 {
- kUnknown = 0x1;
- kLock = 0x2;
- kUnlock = 0x4;
- kLockInvalidRFID = 0x8;
- kLockInvalidSchedule = 0x10;
- kUnlockInvalidRFID = 0x20;
- kUnlockInvalidSchedule = 0x40;
- }
-
- bitmap DlRFIDProgrammingEventMask : BITMAP16 {
- kUnknown = 0x1;
- kRFIDCodeAdded = 0x20;
- kRFIDCodeCleared = 0x40;
- }
-
- bitmap DlRemoteOperationEventMask : BITMAP16 {
- kUnknown = 0x1;
- kLock = 0x2;
- kUnlock = 0x4;
- kLockInvalidCode = 0x8;
- kLockInvalidSchedule = 0x10;
- kUnlockInvalidCode = 0x20;
- kUnlockInvalidSchedule = 0x40;
- }
-
- bitmap DlRemoteProgrammingEventMask : BITMAP16 {
- kUnknown = 0x1;
- kProgrammingPINChanged = 0x2;
- kPINAdded = 0x4;
- kPINCleared = 0x8;
- kPINChanged = 0x10;
- kRFIDCodeAdded = 0x20;
- kRFIDCodeCleared = 0x40;
- }
-
- bitmap DlSupportedOperatingModes : BITMAP16 {
- kNormal = 0x1;
- kVacation = 0x2;
- kPrivacy = 0x4;
- kNoRemoteLockUnlock = 0x8;
- kPassage = 0x10;
- }
-
- bitmap DoorLockDayOfWeek : BITMAP8 {
- kSunday = 0x1;
- kMonday = 0x2;
- kTuesday = 0x4;
- kWednesday = 0x8;
- kThursday = 0x10;
- kFriday = 0x20;
- kSaturday = 0x40;
- }
-
- bitmap Feature : BITMAP32 {
- kPINCredential = 0x1;
- kRFIDCredential = 0x2;
- kFingerCredentials = 0x4;
- kLogging = 0x8;
- kWeekDayAccessSchedules = 0x10;
- kDoorPositionSensor = 0x20;
- kFaceCredentials = 0x40;
- kCredentialsOverTheAirAccess = 0x80;
- kUser = 0x100;
- kNotification = 0x200;
- kYearDayAccessSchedules = 0x400;
- kHolidaySchedules = 0x800;
- kUnbolt = 0x1000;
- }
-
- struct CredentialStruct {
- CredentialTypeEnum credentialType = 0;
- int16u credentialIndex = 1;
- }
-
- critical event DoorLockAlarm = 0 {
- AlarmCodeEnum alarmCode = 0;
- }
-
- critical event DoorStateChange = 1 {
- DoorStateEnum doorState = 0;
- }
-
- critical event LockOperation = 2 {
- LockOperationTypeEnum lockOperationType = 0;
- OperationSourceEnum operationSource = 1;
- nullable int16u userIndex = 2;
- nullable fabric_idx fabricIndex = 3;
- nullable node_id sourceNode = 4;
- optional nullable CredentialStruct credentials[] = 5;
- }
-
- critical event LockOperationError = 3 {
- LockOperationTypeEnum lockOperationType = 0;
- OperationSourceEnum operationSource = 1;
- OperationErrorEnum operationError = 2;
- nullable int16u userIndex = 3;
- nullable fabric_idx fabricIndex = 4;
- nullable node_id sourceNode = 5;
- optional nullable CredentialStruct credentials[] = 6;
- }
-
- info event LockUserChange = 4 {
- LockDataTypeEnum lockDataType = 0;
- DataOperationTypeEnum dataOperationType = 1;
- OperationSourceEnum operationSource = 2;
- nullable int16u userIndex = 3;
- nullable fabric_idx fabricIndex = 4;
- nullable node_id sourceNode = 5;
- nullable int16u dataIndex = 6;
- }
-
- readonly attribute nullable DlLockState lockState = 0;
- readonly attribute DlLockType lockType = 1;
- readonly attribute boolean actuatorEnabled = 2;
- readonly attribute nullable DoorStateEnum doorState = 3;
- attribute access(write: manage) int32u doorOpenEvents = 4;
- attribute access(write: manage) int32u doorClosedEvents = 5;
- attribute access(write: manage) int16u openPeriod = 6;
- readonly attribute int16u numberOfTotalUsersSupported = 17;
- readonly attribute int16u numberOfPINUsersSupported = 18;
- readonly attribute int16u numberOfRFIDUsersSupported = 19;
- readonly attribute int8u numberOfWeekDaySchedulesSupportedPerUser = 20;
- readonly attribute int8u maxPINCodeLength = 23;
- readonly attribute int8u minPINCodeLength = 24;
- readonly attribute int8u maxRFIDCodeLength = 25;
- readonly attribute int8u minRFIDCodeLength = 26;
- readonly attribute DlCredentialRuleMask credentialRulesSupport = 27;
- readonly attribute int8u numberOfCredentialsSupportedPerUser = 28;
- attribute access(write: manage) char_string<3> language = 33;
- attribute access(write: manage) int32u autoRelockTime = 35;
- attribute access(write: manage) int8u soundVolume = 36;
- attribute access(write: manage) OperatingModeEnum operatingMode = 37;
- readonly attribute DlSupportedOperatingModes supportedOperatingModes = 38;
- readonly attribute DlDefaultConfigurationRegister defaultConfigurationRegister = 39;
- attribute access(write: manage) boolean enableOneTouchLocking = 41;
- attribute access(write: manage) boolean enableInsideStatusLED = 42;
- attribute access(write: manage) boolean enablePrivacyModeButton = 43;
- attribute access(write: administer) int8u wrongCodeEntryLimit = 48;
- attribute access(write: administer) int8u userCodeTemporaryDisableTime = 49;
- attribute access(write: administer) boolean requirePINforRemoteOperation = 51;
- readonly attribute command_id generatedCommandList[] = 65528;
- readonly attribute command_id acceptedCommandList[] = 65529;
- readonly attribute event_id eventList[] = 65530;
- readonly attribute attrib_id attributeList[] = 65531;
- readonly attribute bitmap32 featureMap = 65532;
- readonly attribute int16u clusterRevision = 65533;
-
- request struct LockDoorRequest {
- optional octet_string PINCode = 0;
- }
-
- request struct UnlockDoorRequest {
- optional octet_string PINCode = 0;
- }
-
- request struct UnlockWithTimeoutRequest {
- int16u timeout = 0;
- optional octet_string PINCode = 1;
- }
-
- request struct SetWeekDayScheduleRequest {
- int8u weekDayIndex = 0;
- int16u userIndex = 1;
- DaysMaskMap daysMask = 2;
- int8u startHour = 3;
- int8u startMinute = 4;
- int8u endHour = 5;
- int8u endMinute = 6;
- }
-
- request struct GetWeekDayScheduleRequest {
- int8u weekDayIndex = 0;
- int16u userIndex = 1;
- }
-
- request struct ClearWeekDayScheduleRequest {
- int8u weekDayIndex = 0;
- int16u userIndex = 1;
- }
-
- request struct SetYearDayScheduleRequest {
- int8u yearDayIndex = 0;
- int16u userIndex = 1;
- epoch_s localStartTime = 2;
- epoch_s localEndTime = 3;
- }
-
- request struct GetYearDayScheduleRequest {
- int8u yearDayIndex = 0;
- int16u userIndex = 1;
- }
-
- request struct SetUserRequest {
- DataOperationTypeEnum operationType = 0;
- int16u userIndex = 1;
- nullable char_string userName = 2;
- nullable int32u userUniqueID = 3;
- nullable UserStatusEnum userStatus = 4;
- nullable UserTypeEnum userType = 5;
- nullable CredentialRuleEnum credentialRule = 6;
- }
-
- request struct GetUserRequest {
- int16u userIndex = 0;
- }
-
- request struct ClearUserRequest {
- int16u userIndex = 0;
- }
-
- request struct SetCredentialRequest {
- DataOperationTypeEnum operationType = 0;
- CredentialStruct credential = 1;
- LONG_OCTET_STRING credentialData = 2;
- nullable int16u userIndex = 3;
- nullable UserStatusEnum userStatus = 4;
- nullable UserTypeEnum userType = 5;
- }
-
- request struct GetCredentialStatusRequest {
- CredentialStruct credential = 0;
- }
-
- request struct ClearCredentialRequest {
- nullable CredentialStruct credential = 0;
- }
-
- request struct UnboltDoorRequest {
- optional octet_string PINCode = 0;
- }
-
- response struct GetUserResponse = 28 {
- int16u userIndex = 0;
- nullable char_string userName = 1;
- nullable int32u userUniqueID = 2;
- nullable UserStatusEnum userStatus = 3;
- nullable UserTypeEnum userType = 4;
- nullable CredentialRuleEnum credentialRule = 5;
- nullable CredentialStruct credentials[] = 6;
- nullable fabric_idx creatorFabricIndex = 7;
- nullable fabric_idx lastModifiedFabricIndex = 8;
- nullable int16u nextUserIndex = 9;
- }
-
- response struct SetCredentialResponse = 35 {
- DlStatus status = 0;
- nullable int16u userIndex = 1;
- nullable int16u nextCredentialIndex = 2;
- }
-
- response struct GetCredentialStatusResponse = 37 {
- boolean credentialExists = 0;
- nullable int16u userIndex = 1;
- nullable fabric_idx creatorFabricIndex = 2;
- nullable fabric_idx lastModifiedFabricIndex = 3;
- nullable int16u nextCredentialIndex = 4;
- }
-
- timed command LockDoor(LockDoorRequest): DefaultSuccess = 0;
- timed command UnlockDoor(UnlockDoorRequest): DefaultSuccess = 1;
- timed command UnlockWithTimeout(UnlockWithTimeoutRequest): DefaultSuccess = 3;
- command access(invoke: administer) SetWeekDaySchedule(SetWeekDayScheduleRequest): DefaultSuccess = 11;
- command access(invoke: administer) GetWeekDaySchedule(GetWeekDayScheduleRequest): GetWeekDayScheduleResponse = 12;
- command access(invoke: administer) ClearWeekDaySchedule(ClearWeekDayScheduleRequest): DefaultSuccess = 13;
- command access(invoke: administer) SetYearDaySchedule(SetYearDayScheduleRequest): DefaultSuccess = 14;
- command access(invoke: administer) GetYearDaySchedule(GetYearDayScheduleRequest): GetYearDayScheduleResponse = 15;
- timed command access(invoke: administer) SetUser(SetUserRequest): DefaultSuccess = 26;
- command access(invoke: administer) GetUser(GetUserRequest): GetUserResponse = 27;
- timed command access(invoke: administer) ClearUser(ClearUserRequest): DefaultSuccess = 29;
- timed command access(invoke: administer) SetCredential(SetCredentialRequest): SetCredentialResponse = 34;
- command access(invoke: administer) GetCredentialStatus(GetCredentialStatusRequest): GetCredentialStatusResponse = 36;
- timed command access(invoke: administer) ClearCredential(ClearCredentialRequest): DefaultSuccess = 38;
- timed command UnboltDoor(UnboltDoorRequest): DefaultSuccess = 39;
-}
-
/** Provides an interface for controlling and adjusting automatic window coverings. */
server cluster WindowCovering = 258 {
- enum EndProductType : ENUM8 {
+ enum EndProductType : enum8 {
kRollerShade = 0;
kRomanShade = 1;
kBalloonShade = 2;
@@ -3870,7 +3359,7 @@ server cluster WindowCovering = 258 {
kUnknown = 255;
}
- enum Type : ENUM8 {
+ enum Type : enum8 {
kRollerShade = 0;
kRollerShade2Motor = 1;
kRollerShadeExterior = 2;
@@ -3884,7 +3373,7 @@ server cluster WindowCovering = 258 {
kUnknown = 255;
}
- bitmap ConfigStatus : BITMAP8 {
+ bitmap ConfigStatus : bitmap8 {
kOperational = 0x1;
kOnlineReserved = 0x2;
kLiftMovementReversed = 0x4;
@@ -3894,7 +3383,7 @@ server cluster WindowCovering = 258 {
kTiltEncoderControlled = 0x40;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kLift = 0x1;
kTilt = 0x2;
kPositionAwareLift = 0x4;
@@ -3902,20 +3391,20 @@ server cluster WindowCovering = 258 {
kPositionAwareTilt = 0x10;
}
- bitmap Mode : BITMAP8 {
+ bitmap Mode : bitmap8 {
kMotorDirectionReversed = 0x1;
kCalibrationMode = 0x2;
kMaintenanceMode = 0x4;
kLedFeedback = 0x8;
}
- bitmap OperationalStatus : BITMAP8 {
+ bitmap OperationalStatus : bitmap8 {
kGlobal = 0x3;
kLift = 0xC;
kTilt = 0x30;
}
- bitmap SafetyStatus : BITMAP16 {
+ bitmap SafetyStatus : bitmap16 {
kRemoteLockout = 0x1;
kTamperDetection = 0x2;
kFailedCommunication = 0x4;
@@ -3986,11 +3475,11 @@ server cluster WindowCovering = 258 {
/** This cluster provides control of a barrier (garage door). */
server cluster BarrierControl = 259 {
- bitmap BarrierControlCapabilities : BITMAP8 {
+ bitmap BarrierControlCapabilities : bitmap8 {
kPartialBarrier = 0x1;
}
- bitmap BarrierControlSafetyStatus : BITMAP16 {
+ bitmap BarrierControlSafetyStatus : bitmap16 {
kRemoteLockout = 0x1;
kTemperDetected = 0x2;
kFailedCommunication = 0x4;
@@ -4018,7 +3507,7 @@ server cluster BarrierControl = 259 {
/** An interface for configuring and controlling pumps. */
server cluster PumpConfigurationAndControl = 512 {
- enum ControlModeEnum : ENUM8 {
+ enum ControlModeEnum : enum8 {
kConstantSpeed = 0;
kConstantPressure = 1;
kProportionalPressure = 2;
@@ -4027,14 +3516,14 @@ server cluster PumpConfigurationAndControl = 512 {
kAutomatic = 7;
}
- enum OperationModeEnum : ENUM8 {
+ enum OperationModeEnum : enum8 {
kNormal = 0;
kMinimum = 1;
kMaximum = 2;
kLocal = 3;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kConstantPressure = 0x1;
kCompensatedPressure = 0x2;
kConstantFlow = 0x4;
@@ -4044,9 +3533,9 @@ server cluster PumpConfigurationAndControl = 512 {
kLocalOperation = 0x40;
}
- bitmap PumpStatusBitmap : BITMAP16 {
+ bitmap PumpStatusBitmap : bitmap16 {
kDeviceFault = 0x1;
- kSupplyfault = 0x2;
+ kSupplyFault = 0x2;
kSpeedLow = 0x4;
kSpeedHigh = 0x8;
kLocalOverride = 0x10;
@@ -4140,13 +3629,13 @@ server cluster PumpConfigurationAndControl = 512 {
/** An interface for configuring and controlling the functionality of a thermostat. */
server cluster Thermostat = 513 {
- enum SetpointAdjustMode : ENUM8 {
+ enum SetpointAdjustMode : enum8 {
kHeat = 0;
kCool = 1;
kBoth = 2;
}
- enum ThermostatControlSequence : ENUM8 {
+ enum ThermostatControlSequence : enum8 {
kCoolingOnly = 0;
kCoolingWithReheat = 1;
kHeatingOnly = 2;
@@ -4155,13 +3644,13 @@ server cluster Thermostat = 513 {
kCoolingAndHeatingWithReheat = 5;
}
- enum ThermostatRunningMode : ENUM8 {
+ enum ThermostatRunningMode : enum8 {
kOff = 0;
kCool = 3;
kHeat = 4;
}
- enum ThermostatSystemMode : ENUM8 {
+ enum ThermostatSystemMode : enum8 {
kOff = 0;
kAuto = 1;
kCool = 3;
@@ -4173,7 +3662,7 @@ server cluster Thermostat = 513 {
kSleep = 9;
}
- bitmap DayOfWeek : BITMAP8 {
+ bitmap DayOfWeek : bitmap8 {
kSunday = 0x1;
kMonday = 0x2;
kTuesday = 0x4;
@@ -4184,7 +3673,7 @@ server cluster Thermostat = 513 {
kAway = 0x80;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kHeating = 0x1;
kCooling = 0x2;
kOccupancy = 0x4;
@@ -4194,7 +3683,7 @@ server cluster Thermostat = 513 {
kLocalTemperatureNotExposed = 0x40;
}
- bitmap ModeForSequence : BITMAP8 {
+ bitmap ModeForSequence : bitmap8 {
kHeatSetpointPresent = 0x1;
kCoolSetpointPresent = 0x2;
}
@@ -4236,12 +3725,12 @@ server cluster Thermostat = 513 {
/** An interface for controlling a fan in a heating/cooling system. */
provisional server cluster FanControl = 514 {
- enum AirflowDirectionEnum : ENUM8 {
+ enum AirflowDirectionEnum : enum8 {
kForward = 0;
kReverse = 1;
}
- enum FanModeEnum : ENUM8 {
+ enum FanModeEnum : enum8 {
kOff = 0;
kLow = 1;
kMedium = 2;
@@ -4251,7 +3740,7 @@ provisional server cluster FanControl = 514 {
kSmart = 6;
}
- enum FanModeSequenceEnum : ENUM8 {
+ enum FanModeSequenceEnum : enum8 {
kOffLowMedHigh = 0;
kOffLowHigh = 1;
kOffLowMedHighAuto = 2;
@@ -4260,12 +3749,12 @@ provisional server cluster FanControl = 514 {
kOffOn = 5;
}
- enum StepDirectionEnum : ENUM8 {
+ enum StepDirectionEnum : enum8 {
kIncrease = 0;
kDecrease = 1;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kMultiSpeed = 0x1;
kAuto = 0x2;
kRocking = 0x4;
@@ -4274,13 +3763,13 @@ provisional server cluster FanControl = 514 {
kAirflowDirection = 0x20;
}
- bitmap RockBitmap : BITMAP8 {
+ bitmap RockBitmap : bitmap8 {
kRockLeftRight = 0x1;
kRockUpDown = 0x2;
kRockRound = 0x4;
}
- bitmap WindBitmap : BITMAP8 {
+ bitmap WindBitmap : bitmap8 {
kSleepWind = 0x1;
kNaturalWind = 0x2;
}
@@ -4328,53 +3817,53 @@ server cluster ThermostatUserInterfaceConfiguration = 516 {
/** Attributes and commands for controlling the color properties of a color-capable light. */
server cluster ColorControl = 768 {
- enum ColorLoopAction : ENUM8 {
+ enum ColorLoopAction : enum8 {
kDeactivate = 0;
kActivateFromColorLoopStartEnhancedHue = 1;
kActivateFromEnhancedCurrentHue = 2;
}
- enum ColorLoopDirection : ENUM8 {
+ enum ColorLoopDirection : enum8 {
kDecrementHue = 0;
kIncrementHue = 1;
}
- enum ColorMode : ENUM8 {
+ enum ColorMode : enum8 {
kCurrentHueAndCurrentSaturation = 0;
kCurrentXAndCurrentY = 1;
kColorTemperature = 2;
}
- enum HueDirection : ENUM8 {
+ enum HueDirection : enum8 {
kShortestDistance = 0;
kLongestDistance = 1;
kUp = 2;
kDown = 3;
}
- enum HueMoveMode : ENUM8 {
+ enum HueMoveMode : enum8 {
kStop = 0;
kUp = 1;
kDown = 3;
}
- enum HueStepMode : ENUM8 {
+ enum HueStepMode : enum8 {
kUp = 1;
kDown = 3;
}
- enum SaturationMoveMode : ENUM8 {
+ enum SaturationMoveMode : enum8 {
kStop = 0;
kUp = 1;
kDown = 3;
}
- enum SaturationStepMode : ENUM8 {
+ enum SaturationStepMode : enum8 {
kUp = 1;
kDown = 3;
}
- bitmap ColorCapabilities : BITMAP16 {
+ bitmap ColorCapabilities : bitmap16 {
kHueSaturationSupported = 0x1;
kEnhancedHueSupported = 0x2;
kColorLoopSupported = 0x4;
@@ -4382,14 +3871,14 @@ server cluster ColorControl = 768 {
kColorTemperatureSupported = 0x10;
}
- bitmap ColorLoopUpdateFlags : BITMAP8 {
+ bitmap ColorLoopUpdateFlags : bitmap8 {
kUpdateAction = 0x1;
kUpdateDirection = 0x2;
kUpdateTime = 0x4;
kUpdateStartHue = 0x8;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kHueAndSaturation = 0x1;
kEnhancedHue = 0x2;
kColorLoop = 0x4;
@@ -4627,29 +4116,29 @@ server cluster ColorControl = 768 {
/** Attributes and commands for configuring a lighting ballast. */
provisional server cluster BallastConfiguration = 769 {
- bitmap BallastStatusBitmap : BITMAP8 {
+ bitmap BallastStatusBitmap : bitmap8 {
kBallastNonOperational = 0x1;
kLampFailure = 0x2;
}
- bitmap LampAlarmModeBitmap : BITMAP8 {
+ bitmap LampAlarmModeBitmap : bitmap8 {
kLampBurnHours = 0x1;
}
readonly attribute int8u physicalMinLevel = 0;
readonly attribute int8u physicalMaxLevel = 1;
readonly attribute BallastStatusBitmap ballastStatus = 2;
- attribute int8u minLevel = 16;
- attribute int8u maxLevel = 17;
- attribute nullable int8u intrinsicBallastFactor = 20;
- attribute nullable int8u ballastFactorAdjustment = 21;
+ attribute access(write: manage) int8u minLevel = 16;
+ attribute access(write: manage) int8u maxLevel = 17;
+ attribute access(write: manage) nullable int8u intrinsicBallastFactor = 20;
+ attribute access(write: manage) nullable int8u ballastFactorAdjustment = 21;
readonly attribute int8u lampQuantity = 32;
- attribute char_string<16> lampType = 48;
- attribute char_string<16> lampManufacturer = 49;
- attribute nullable int24u lampRatedHours = 50;
- attribute nullable int24u lampBurnHours = 51;
- attribute LampAlarmModeBitmap lampAlarmMode = 52;
- attribute nullable int24u lampBurnHoursTripPoint = 53;
+ attribute access(write: manage) char_string<16> lampType = 48;
+ attribute access(write: manage) char_string<16> lampManufacturer = 49;
+ attribute access(write: manage) nullable int24u lampRatedHours = 50;
+ attribute access(write: manage) nullable int24u lampBurnHours = 51;
+ attribute access(write: manage) LampAlarmModeBitmap lampAlarmMode = 52;
+ attribute access(write: manage) nullable int24u lampBurnHoursTripPoint = 53;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -4660,7 +4149,7 @@ provisional server cluster BallastConfiguration = 769 {
/** Attributes and commands for configuring the measurement of illuminance, and reporting illuminance measurements. */
server cluster IlluminanceMeasurement = 1024 {
- enum LightSensorTypeEnum : ENUM8 {
+ enum LightSensorTypeEnum : enum8 {
kPhotodiode = 0;
kCMOS = 1;
}
@@ -4680,10 +4169,10 @@ server cluster IlluminanceMeasurement = 1024 {
/** Attributes and commands for configuring the measurement of temperature, and reporting temperature measurements. */
server cluster TemperatureMeasurement = 1026 {
- readonly attribute nullable int16s measuredValue = 0;
- readonly attribute nullable int16s minMeasuredValue = 1;
- readonly attribute nullable int16s maxMeasuredValue = 2;
- readonly attribute int16u tolerance = 3;
+ readonly attribute nullable temperature measuredValue = 0;
+ readonly attribute nullable temperature minMeasuredValue = 1;
+ readonly attribute nullable temperature maxMeasuredValue = 2;
+ readonly attribute temperature tolerance = 3;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -4694,7 +4183,7 @@ server cluster TemperatureMeasurement = 1026 {
/** Attributes and commands for configuring the measurement of pressure, and reporting pressure measurements. */
server cluster PressureMeasurement = 1027 {
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kExtended = 0x1;
}
@@ -4739,18 +4228,18 @@ server cluster RelativeHumidityMeasurement = 1029 {
/** Attributes and commands for configuring occupancy sensing, and reporting occupancy status. */
server cluster OccupancySensing = 1030 {
- enum OccupancySensorTypeEnum : ENUM8 {
+ enum OccupancySensorTypeEnum : enum8 {
kPIR = 0;
kUltrasonic = 1;
kPIRAndUltrasonic = 2;
kPhysicalContact = 3;
}
- bitmap OccupancyBitmap : BITMAP8 {
+ bitmap OccupancyBitmap : bitmap8 {
kOccupied = 0x1;
}
- bitmap OccupancySensorTypeBitmap : BITMAP8 {
+ bitmap OccupancySensorTypeBitmap : bitmap8 {
kPIR = 0x1;
kUltrasonic = 0x2;
kPhysicalContact = 0x4;
@@ -4769,7 +4258,7 @@ server cluster OccupancySensing = 1030 {
/** Attributes for reporting carbon monoxide concentration measurements */
server cluster CarbonMonoxideConcentrationMeasurement = 1036 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -4777,13 +4266,13 @@ server cluster CarbonMonoxideConcentrationMeasurement = 1036 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -4794,7 +4283,7 @@ server cluster CarbonMonoxideConcentrationMeasurement = 1036 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -4824,7 +4313,7 @@ server cluster CarbonMonoxideConcentrationMeasurement = 1036 {
/** Attributes for reporting carbon dioxide concentration measurements */
server cluster CarbonDioxideConcentrationMeasurement = 1037 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -4832,13 +4321,13 @@ server cluster CarbonDioxideConcentrationMeasurement = 1037 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -4849,7 +4338,7 @@ server cluster CarbonDioxideConcentrationMeasurement = 1037 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -4879,7 +4368,7 @@ server cluster CarbonDioxideConcentrationMeasurement = 1037 {
/** Attributes for reporting nitrogen dioxide concentration measurements */
server cluster NitrogenDioxideConcentrationMeasurement = 1043 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -4887,13 +4376,13 @@ server cluster NitrogenDioxideConcentrationMeasurement = 1043 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -4904,7 +4393,7 @@ server cluster NitrogenDioxideConcentrationMeasurement = 1043 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -4934,7 +4423,7 @@ server cluster NitrogenDioxideConcentrationMeasurement = 1043 {
/** Attributes for reporting ozone concentration measurements */
server cluster OzoneConcentrationMeasurement = 1045 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -4942,13 +4431,13 @@ server cluster OzoneConcentrationMeasurement = 1045 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -4959,7 +4448,7 @@ server cluster OzoneConcentrationMeasurement = 1045 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -4989,7 +4478,7 @@ server cluster OzoneConcentrationMeasurement = 1045 {
/** Attributes for reporting PM2.5 concentration measurements */
server cluster Pm25ConcentrationMeasurement = 1066 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -4997,13 +4486,13 @@ server cluster Pm25ConcentrationMeasurement = 1066 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -5014,7 +4503,7 @@ server cluster Pm25ConcentrationMeasurement = 1066 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -5044,7 +4533,7 @@ server cluster Pm25ConcentrationMeasurement = 1066 {
/** Attributes for reporting formaldehyde concentration measurements */
server cluster FormaldehydeConcentrationMeasurement = 1067 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -5052,13 +4541,13 @@ server cluster FormaldehydeConcentrationMeasurement = 1067 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -5069,7 +4558,7 @@ server cluster FormaldehydeConcentrationMeasurement = 1067 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -5099,7 +4588,7 @@ server cluster FormaldehydeConcentrationMeasurement = 1067 {
/** Attributes for reporting PM1 concentration measurements */
server cluster Pm1ConcentrationMeasurement = 1068 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -5107,13 +4596,13 @@ server cluster Pm1ConcentrationMeasurement = 1068 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -5124,7 +4613,7 @@ server cluster Pm1ConcentrationMeasurement = 1068 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -5154,7 +4643,7 @@ server cluster Pm1ConcentrationMeasurement = 1068 {
/** Attributes for reporting PM10 concentration measurements */
server cluster Pm10ConcentrationMeasurement = 1069 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -5162,13 +4651,13 @@ server cluster Pm10ConcentrationMeasurement = 1069 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -5179,7 +4668,7 @@ server cluster Pm10ConcentrationMeasurement = 1069 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -5209,7 +4698,7 @@ server cluster Pm10ConcentrationMeasurement = 1069 {
/** Attributes for reporting total volatile organic compounds concentration measurements */
server cluster TotalVolatileOrganicCompoundsConcentrationMeasurement = 1070 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -5217,13 +4706,13 @@ server cluster TotalVolatileOrganicCompoundsConcentrationMeasurement = 1070 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -5234,7 +4723,7 @@ server cluster TotalVolatileOrganicCompoundsConcentrationMeasurement = 1070 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -5264,7 +4753,7 @@ server cluster TotalVolatileOrganicCompoundsConcentrationMeasurement = 1070 {
/** Attributes for reporting radon concentration measurements */
server cluster RadonConcentrationMeasurement = 1071 {
- enum LevelValueEnum : ENUM8 {
+ enum LevelValueEnum : enum8 {
kUnknown = 0;
kLow = 1;
kMedium = 2;
@@ -5272,13 +4761,13 @@ server cluster RadonConcentrationMeasurement = 1071 {
kCritical = 4;
}
- enum MeasurementMediumEnum : ENUM8 {
+ enum MeasurementMediumEnum : enum8 {
kAir = 0;
kWater = 1;
kSoil = 2;
}
- enum MeasurementUnitEnum : ENUM8 {
+ enum MeasurementUnitEnum : enum8 {
kPPM = 0;
kPPB = 1;
kPPT = 2;
@@ -5289,7 +4778,7 @@ server cluster RadonConcentrationMeasurement = 1071 {
kBQM3 = 7;
}
- bitmap Feature : BITMAP32 {
+ bitmap Feature : bitmap32 {
kNumericMeasurement = 0x1;
kLevelIndication = 0x2;
kMediumLevel = 0x4;
@@ -5363,42 +4852,42 @@ server cluster ElectricalMeasurement = 2820 {
/** The Test Cluster is meant to validate the generated code */
internal server cluster UnitTesting = 4294048773 {
- enum SimpleEnum : ENUM8 {
+ enum SimpleEnum : enum8 {
kUnspecified = 0;
kValueA = 1;
kValueB = 2;
kValueC = 3;
}
- bitmap Bitmap16MaskMap : BITMAP16 {
+ bitmap Bitmap16MaskMap : bitmap16 {
kMaskVal1 = 0x1;
kMaskVal2 = 0x2;
kMaskVal3 = 0x4;
kMaskVal4 = 0x4000;
}
- bitmap Bitmap32MaskMap : BITMAP32 {
+ bitmap Bitmap32MaskMap : bitmap32 {
kMaskVal1 = 0x1;
kMaskVal2 = 0x2;
kMaskVal3 = 0x4;
kMaskVal4 = 0x40000000;
}
- bitmap Bitmap64MaskMap : BITMAP64 {
+ bitmap Bitmap64MaskMap : bitmap64 {
kMaskVal1 = 0x1;
kMaskVal2 = 0x2;
kMaskVal3 = 0x4;
kMaskVal4 = 0x4000000000000000;
}
- bitmap Bitmap8MaskMap : BITMAP8 {
+ bitmap Bitmap8MaskMap : bitmap8 {
kMaskVal1 = 0x1;
kMaskVal2 = 0x2;
kMaskVal3 = 0x4;
kMaskVal4 = 0x40;
}
- bitmap SimpleBitmap : BITMAP8 {
+ bitmap SimpleBitmap : bitmap8 {
kValueA = 0x1;
kValueB = 0x2;
kValueC = 0x4;
@@ -5685,7 +5174,7 @@ internal server cluster UnitTesting = 4294048773 {
/** The Fault Injection Cluster provide a means for a test harness to configure faults(for example triggering a fault in the system). */
internal server cluster FaultInjection = 4294048774 {
- enum FaultType : ENUM8 {
+ enum FaultType : enum8 {
kUnspecified = 0;
kSystemFault = 1;
kInetFault = 2;
@@ -6203,8 +5692,8 @@ endpoint 0 {
}
server cluster IcdManagement {
- callback attribute idleModeInterval default = 500;
- callback attribute activeModeInterval default = 300;
+ callback attribute idleModeDuration default = 500;
+ callback attribute activeModeDuration default = 300;
callback attribute activeModeThreshold default = 300;
callback attribute registeredClients;
callback attribute ICDCounter default = 0;
@@ -6213,7 +5702,7 @@ endpoint 0 {
callback attribute acceptedCommandList;
callback attribute attributeList;
ram attribute featureMap default = 1;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
handle command RegisterClient;
handle command RegisterClientResponse;
@@ -6294,7 +5783,7 @@ endpoint 1 {
callback attribute acceptedCommandList;
callback attribute eventList;
callback attribute attributeList;
- ram attribute featureMap default = 3;
+ ram attribute featureMap default = 7;
ram attribute clusterRevision default = 5;
handle command AddScene;
@@ -6479,7 +5968,7 @@ endpoint 1 {
callback attribute acceptedCommandList;
callback attribute attributeList;
callback attribute featureMap default = 0;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
handle command ChangeToMode;
handle command ChangeToModeResponse;
@@ -6494,7 +5983,7 @@ endpoint 1 {
callback attribute acceptedCommandList;
callback attribute attributeList;
callback attribute featureMap default = 0;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
handle command ChangeToMode;
handle command ChangeToModeResponse;
@@ -6516,13 +6005,12 @@ endpoint 1 {
server cluster RvcRunMode {
callback attribute supportedModes;
callback attribute currentMode;
- callback attribute startUpMode;
callback attribute onMode;
callback attribute generatedCommandList;
callback attribute acceptedCommandList;
callback attribute attributeList;
callback attribute featureMap default = 0;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
handle command ChangeToMode;
handle command ChangeToModeResponse;
@@ -6531,13 +6019,12 @@ endpoint 1 {
server cluster RvcCleanMode {
callback attribute supportedModes;
callback attribute currentMode;
- callback attribute startUpMode;
callback attribute onMode;
callback attribute generatedCommandList;
callback attribute acceptedCommandList;
callback attribute attributeList;
callback attribute featureMap default = 0;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
handle command ChangeToMode;
handle command ChangeToModeResponse;
@@ -6576,7 +6063,7 @@ endpoint 1 {
callback attribute acceptedCommandList;
callback attribute attributeList;
callback attribute featureMap default = 0;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
handle command ChangeToMode;
handle command ChangeToModeResponse;
@@ -6712,63 +6199,6 @@ endpoint 1 {
handle command ResetCondition;
}
- server cluster DoorLock {
- emits event DoorLockAlarm;
- emits event LockOperation;
- emits event LockOperationError;
- emits event LockUserChange;
- ram attribute lockState default = 2;
- ram attribute lockType;
- ram attribute actuatorEnabled;
- ram attribute doorState;
- ram attribute doorOpenEvents;
- ram attribute doorClosedEvents;
- ram attribute openPeriod;
- ram attribute numberOfTotalUsersSupported default = 10;
- ram attribute numberOfPINUsersSupported default = 10;
- ram attribute numberOfRFIDUsersSupported default = 10;
- ram attribute numberOfWeekDaySchedulesSupportedPerUser default = 10;
- ram attribute maxPINCodeLength default = 6;
- ram attribute minPINCodeLength default = 6;
- ram attribute maxRFIDCodeLength default = 20;
- ram attribute minRFIDCodeLength default = 10;
- ram attribute credentialRulesSupport default = 1;
- ram attribute numberOfCredentialsSupportedPerUser default = 5;
- ram attribute language default = "en";
- ram attribute autoRelockTime default = 60;
- ram attribute soundVolume default = 0x00;
- ram attribute operatingMode default = 0x00;
- ram attribute supportedOperatingModes default = 0xFFF6;
- ram attribute defaultConfigurationRegister default = 0;
- ram attribute enableOneTouchLocking default = 0x00;
- ram attribute enableInsideStatusLED default = 0;
- ram attribute enablePrivacyModeButton default = 0x00;
- ram attribute wrongCodeEntryLimit default = 3;
- ram attribute userCodeTemporaryDisableTime default = 10;
- ram attribute requirePINforRemoteOperation default = 0;
- ram attribute featureMap default = 0x11B3;
- ram attribute clusterRevision default = 6;
-
- handle command LockDoor;
- handle command UnlockDoor;
- handle command UnlockWithTimeout;
- handle command SetWeekDaySchedule;
- handle command GetWeekDaySchedule;
- handle command ClearWeekDaySchedule;
- handle command SetYearDaySchedule;
- handle command GetYearDaySchedule;
- handle command SetUser;
- handle command GetUser;
- handle command GetUserResponse;
- handle command ClearUser;
- handle command SetCredential;
- handle command SetCredentialResponse;
- handle command GetCredentialStatus;
- handle command GetCredentialStatusResponse;
- handle command ClearCredential;
- handle command UnboltDoor;
- }
-
server cluster WindowCovering {
ram attribute type default = 0x08;
ram attribute physicalClosedLimitLift default = 0xFFFF;
@@ -7437,7 +6867,7 @@ endpoint 2 {
callback attribute acceptedCommandList;
callback attribute eventList;
callback attribute attributeList;
- ram attribute featureMap default = 3;
+ ram attribute featureMap default = 7;
ram attribute clusterRevision default = 5;
handle command AddScene;
@@ -7521,7 +6951,7 @@ endpoint 2 {
}
}
endpoint 65534 {
- device type ma_secondary_network_commissioning = 61442, version 1;
+ device type ma_secondary_network_commissioning = 4293984258, version 1;
server cluster Descriptor {
@@ -7529,6 +6959,10 @@ endpoint 65534 {
callback attribute serverList;
callback attribute clientList;
callback attribute partsList;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
ram attribute featureMap default = 0;
callback attribute clusterRevision default = 2;
}
@@ -7542,6 +6976,10 @@ endpoint 65534 {
callback attribute lastNetworkingStatus;
callback attribute lastNetworkID;
callback attribute lastConnectErrorValue;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
callback attribute featureMap default = 0;
callback attribute clusterRevision default = 1;
diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
index 011fd91f522250..2ed3d542d5c751 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
@@ -5206,7 +5206,7 @@
"code": 2,
"mfgCode": null,
"side": "server",
- "type": "int16u",
+ "type": "vendor_id",
"included": 1,
"storageOption": "External",
"singleton": 0,
@@ -5994,7 +5994,7 @@
],
"attributes": [
{
- "name": "IdleModeInterval",
+ "name": "IdleModeDuration",
"code": 0,
"mfgCode": null,
"side": "server",
@@ -6010,7 +6010,7 @@
"reportableChange": 0
},
{
- "name": "ActiveModeInterval",
+ "name": "ActiveModeDuration",
"code": 1,
"mfgCode": null,
"side": "server",
@@ -6163,7 +6163,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -7132,7 +7132,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "3",
+ "defaultValue": "7",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -9150,7 +9150,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -9322,7 +9322,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -9558,22 +9558,6 @@
"maxInterval": 65534,
"reportableChange": 0
},
- {
- "name": "StartUpMode",
- "code": 2,
- "mfgCode": null,
- "side": "server",
- "type": "int8u",
- "included": 1,
- "storageOption": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
{
"name": "OnMode",
"code": 3,
@@ -9664,7 +9648,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -9730,22 +9714,6 @@
"maxInterval": 65534,
"reportableChange": 0
},
- {
- "name": "StartUpMode",
- "code": 2,
- "mfgCode": null,
- "side": "server",
- "type": "int8u",
- "included": 1,
- "storageOption": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
{
"name": "OnMode",
"code": 3,
@@ -9836,7 +9804,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -10287,7 +10255,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -11609,696 +11577,44 @@
"attributes": [
{
"name": "Condition",
- "code": 0,
- "mfgCode": null,
- "side": "server",
- "type": "percent",
- "included": 1,
- "storageOption": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "DegradationDirection",
- "code": 1,
- "mfgCode": null,
- "side": "server",
- "type": "DegradationDirectionEnum",
- "included": 1,
- "storageOption": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "ChangeIndication",
- "code": 2,
- "mfgCode": null,
- "side": "server",
- "type": "ChangeIndicationEnum",
- "included": 1,
- "storageOption": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "0",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "InPlaceIndicator",
- "code": 3,
- "mfgCode": null,
- "side": "server",
- "type": "boolean",
- "included": 1,
- "storageOption": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "LastChangedTime",
- "code": 4,
- "mfgCode": null,
- "side": "server",
- "type": "epoch_s",
- "included": 1,
- "storageOption": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": null,
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "ReplacementProductList",
- "code": 5,
- "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": "",
- "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": "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": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "7",
- "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
- }
- ]
- },
- {
- "name": "Door Lock",
- "code": 257,
- "mfgCode": null,
- "define": "DOOR_LOCK_CLUSTER",
- "side": "server",
- "enabled": 1,
- "commands": [
- {
- "name": "LockDoor",
- "code": 0,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "UnlockDoor",
- "code": 1,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "UnlockWithTimeout",
- "code": 3,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "SetWeekDaySchedule",
- "code": 11,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "GetWeekDaySchedule",
- "code": 12,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "ClearWeekDaySchedule",
- "code": 13,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "SetYearDaySchedule",
- "code": 14,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "GetYearDaySchedule",
- "code": 15,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "SetUser",
- "code": 26,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "GetUser",
- "code": 27,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "GetUserResponse",
- "code": 28,
- "mfgCode": null,
- "source": "server",
- "isIncoming": 0,
- "isEnabled": 1
- },
- {
- "name": "ClearUser",
- "code": 29,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "SetCredential",
- "code": 34,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "SetCredentialResponse",
- "code": 35,
- "mfgCode": null,
- "source": "server",
- "isIncoming": 0,
- "isEnabled": 1
- },
- {
- "name": "GetCredentialStatus",
- "code": 36,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "GetCredentialStatusResponse",
- "code": 37,
- "mfgCode": null,
- "source": "server",
- "isIncoming": 0,
- "isEnabled": 1
- },
- {
- "name": "ClearCredential",
- "code": 38,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- },
- {
- "name": "UnboltDoor",
- "code": 39,
- "mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
- }
- ],
- "attributes": [
- {
- "name": "LockState",
- "code": 0,
- "mfgCode": null,
- "side": "server",
- "type": "DlLockState",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "2",
- "reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
- "reportableChange": 0
- },
- {
- "name": "LockType",
- "code": 1,
- "mfgCode": null,
- "side": "server",
- "type": "DlLockType",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
- "reportableChange": 0
- },
- {
- "name": "ActuatorEnabled",
- "code": 2,
- "mfgCode": null,
- "side": "server",
- "type": "boolean",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
- "reportableChange": 0
- },
- {
- "name": "DoorState",
- "code": 3,
- "mfgCode": null,
- "side": "server",
- "type": "DoorStateEnum",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
- "reportableChange": 0
- },
- {
- "name": "DoorOpenEvents",
- "code": 4,
- "mfgCode": null,
- "side": "server",
- "type": "int32u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "DoorClosedEvents",
- "code": 5,
- "mfgCode": null,
- "side": "server",
- "type": "int32u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "OpenPeriod",
- "code": 6,
- "mfgCode": null,
- "side": "server",
- "type": "int16u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "NumberOfTotalUsersSupported",
- "code": 17,
- "mfgCode": null,
- "side": "server",
- "type": "int16u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "10",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "NumberOfPINUsersSupported",
- "code": 18,
- "mfgCode": null,
- "side": "server",
- "type": "int16u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "10",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "NumberOfRFIDUsersSupported",
- "code": 19,
- "mfgCode": null,
- "side": "server",
- "type": "int16u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "10",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "NumberOfWeekDaySchedulesSupportedPerUser",
- "code": 20,
- "mfgCode": null,
- "side": "server",
- "type": "int8u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "10",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "MaxPINCodeLength",
- "code": 23,
- "mfgCode": null,
- "side": "server",
- "type": "int8u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "6",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "MinPINCodeLength",
- "code": 24,
- "mfgCode": null,
- "side": "server",
- "type": "int8u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "6",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "MaxRFIDCodeLength",
- "code": 25,
- "mfgCode": null,
- "side": "server",
- "type": "int8u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "20",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "MinRFIDCodeLength",
- "code": 26,
- "mfgCode": null,
- "side": "server",
- "type": "int8u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "10",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "CredentialRulesSupport",
- "code": 27,
- "mfgCode": null,
- "side": "server",
- "type": "DlCredentialRuleMask",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "1",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "NumberOfCredentialsSupportedPerUser",
- "code": 28,
- "mfgCode": null,
- "side": "server",
- "type": "int8u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "5",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "Language",
- "code": 33,
- "mfgCode": null,
- "side": "server",
- "type": "char_string",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "en",
- "reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
- "reportableChange": 0
- },
- {
- "name": "AutoRelockTime",
- "code": 35,
- "mfgCode": null,
- "side": "server",
- "type": "int32u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "60",
- "reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
- "reportableChange": 0
- },
- {
- "name": "SoundVolume",
- "code": 36,
- "mfgCode": null,
- "side": "server",
- "type": "int8u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "0x00",
- "reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
- "reportableChange": 0
- },
- {
- "name": "OperatingMode",
- "code": 37,
+ "code": 0,
"mfgCode": null,
"side": "server",
- "type": "OperatingModeEnum",
+ "type": "percent",
"included": 1,
- "storageOption": "RAM",
+ "storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0x00",
+ "defaultValue": "",
"reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
+ "minInterval": 1,
+ "maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "SupportedOperatingModes",
- "code": 38,
+ "name": "DegradationDirection",
+ "code": 1,
"mfgCode": null,
"side": "server",
- "type": "DlSupportedOperatingModes",
+ "type": "DegradationDirectionEnum",
"included": 1,
- "storageOption": "RAM",
+ "storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0xFFF6",
+ "defaultValue": "",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "DefaultConfigurationRegister",
- "code": 39,
+ "name": "ChangeIndication",
+ "code": 2,
"mfgCode": null,
"side": "server",
- "type": "DlDefaultConfigurationRegister",
+ "type": "ChangeIndicationEnum",
"included": 1,
- "storageOption": "RAM",
+ "storageOption": "External",
"singleton": 0,
"bounded": 0,
"defaultValue": "0",
@@ -12308,96 +11624,96 @@
"reportableChange": 0
},
{
- "name": "EnableOneTouchLocking",
- "code": 41,
+ "name": "InPlaceIndicator",
+ "code": 3,
"mfgCode": null,
"side": "server",
"type": "boolean",
"included": 1,
- "storageOption": "RAM",
+ "storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0x00",
+ "defaultValue": "",
"reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
+ "minInterval": 1,
+ "maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "EnableInsideStatusLED",
- "code": 42,
+ "name": "LastChangedTime",
+ "code": 4,
"mfgCode": null,
"side": "server",
- "type": "boolean",
+ "type": "epoch_s",
"included": 1,
- "storageOption": "RAM",
+ "storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0",
+ "defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "EnablePrivacyModeButton",
- "code": 43,
+ "name": "ReplacementProductList",
+ "code": 5,
"mfgCode": null,
"side": "server",
- "type": "boolean",
+ "type": "array",
"included": 1,
- "storageOption": "RAM",
+ "storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0x00",
+ "defaultValue": null,
"reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
+ "minInterval": 1,
+ "maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "WrongCodeEntryLimit",
- "code": 48,
+ "name": "GeneratedCommandList",
+ "code": 65528,
"mfgCode": null,
"side": "server",
- "type": "int8u",
+ "type": "array",
"included": 1,
- "storageOption": "RAM",
+ "storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "3",
+ "defaultValue": "",
"reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
+ "minInterval": 1,
+ "maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "UserCodeTemporaryDisableTime",
- "code": 49,
+ "name": "AcceptedCommandList",
+ "code": 65529,
"mfgCode": null,
"side": "server",
- "type": "int8u",
+ "type": "array",
"included": 1,
- "storageOption": "RAM",
+ "storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "10",
+ "defaultValue": "",
"reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
+ "minInterval": 1,
+ "maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "RequirePINforRemoteOperation",
- "code": 51,
+ "name": "AttributeList",
+ "code": 65531,
"mfgCode": null,
"side": "server",
- "type": "boolean",
+ "type": "array",
"included": 1,
- "storageOption": "RAM",
+ "storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0",
+ "defaultValue": "",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -12410,10 +11726,10 @@
"side": "server",
"type": "bitmap32",
"included": 1,
- "storageOption": "RAM",
+ "storageOption": "External",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0x11B3",
+ "defaultValue": "7",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -12429,42 +11745,12 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "6",
+ "defaultValue": "1",
"reportable": 1,
- "minInterval": 0,
- "maxInterval": 65344,
+ "minInterval": 1,
+ "maxInterval": 65534,
"reportableChange": 0
}
- ],
- "events": [
- {
- "name": "DoorLockAlarm",
- "code": 0,
- "mfgCode": null,
- "side": "server",
- "included": 1
- },
- {
- "name": "LockOperation",
- "code": 2,
- "mfgCode": null,
- "side": "server",
- "included": 1
- },
- {
- "name": "LockOperationError",
- "code": 3,
- "mfgCode": null,
- "side": "server",
- "included": 1
- },
- {
- "name": "LockUserChange",
- "code": 4,
- "mfgCode": null,
- "side": "server",
- "included": 1
- }
]
},
{
@@ -21438,7 +20724,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "3",
+ "defaultValue": "7",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -22198,14 +21484,14 @@
"id": 4,
"name": "Anonymous Endpoint Type",
"deviceTypeRef": {
- "code": 61442,
+ "code": 4293984258,
"profileId": 259,
"label": "MA-secondary-network-commissioning",
"name": "MA-secondary-network-commissioning"
},
"deviceTypes": [
{
- "code": 61442,
+ "code": 4293984258,
"profileId": 259,
"label": "MA-secondary-network-commissioning",
"name": "MA-secondary-network-commissioning"
@@ -22215,10 +21501,10 @@
1
],
"deviceIdentifiers": [
- 61442
+ 4293984258
],
"deviceTypeName": "MA-secondary-network-commissioning",
- "deviceTypeCode": 61442,
+ "deviceTypeCode": 4293984258,
"deviceTypeProfileId": 259,
"clusters": [
{
@@ -22293,6 +21579,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,
@@ -22537,6 +21887,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/all-clusters-app/ameba/README.md b/examples/all-clusters-app/ameba/README.md
index a6c1684b997e50..ab7f1a5726765f 100644
--- a/examples/all-clusters-app/ameba/README.md
+++ b/examples/all-clusters-app/ameba/README.md
@@ -27,11 +27,11 @@ The CHIP demo application is supported on
- Pull docker image:
- $ docker pull ghcr.io/project-chip/chip-build-ameba:21
+ $ docker pull ghcr.io/project-chip/chip-build-ameba:22
- Run docker container:
- $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:21
+ $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:22
- Setup build environment:
diff --git a/examples/all-clusters-app/ameba/chip_main.cmake b/examples/all-clusters-app/ameba/chip_main.cmake
index f105d3efe41a44..07052e123757cd 100755
--- a/examples/all-clusters-app/ameba/chip_main.cmake
+++ b/examples/all-clusters-app/ameba/chip_main.cmake
@@ -154,10 +154,12 @@ list(
APPEND ${list_chip_main_sources}
${chip_dir}/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp
- ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/air-quality-instance.cpp
- ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/concentration-measurement-instances.cpp
+ ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/air-quality-instance.cpp
+ ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/concentration-measurement-instances.cpp
${chip_dir}/examples/all-clusters-app/all-clusters-common/src/fan-stub.cpp
+ ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/laundry-washer-controls-delegate-impl.cpp
${chip_dir}/examples/all-clusters-app/all-clusters-common/src/resource-monitoring-delegates.cpp
+ ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/rvc-modes.cpp
${chip_dir}/examples/all-clusters-app/all-clusters-common/src/smco-stub.cpp
${chip_dir}/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp
${chip_dir}/examples/all-clusters-app/all-clusters-common/src/static-supported-temperature-levels.cpp
@@ -167,10 +169,15 @@ list(
${chip_dir}/examples/all-clusters-app/ameba/main/CHIPDeviceManager.cpp
${chip_dir}/examples/all-clusters-app/ameba/main/Globals.cpp
${chip_dir}/examples/all-clusters-app/ameba/main/LEDWidget.cpp
+ ${chip_dir}/examples/all-clusters-app/ameba/main/OperationalStateManager.cpp
+ ${chip_dir}/examples/all-clusters-app/ameba/main/ManualOperationCommand.cpp
+ ${chip_dir}/examples/all-clusters-app/ameba/main/SmokeCOAlarmManager.cpp
${chip_dir}/examples/platform/ameba/route_hook/ameba_route_hook.c
${chip_dir}/examples/platform/ameba/route_hook/ameba_route_table.c
+ ${chip_dir}/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.cpp
+
${chip_dir}/examples/providers/DeviceInfoProviderImpl.cpp
)
@@ -263,6 +270,7 @@ list(
-DMBEDTLS_CONFIG_FILE=
-DCHIP_SHELL_MAX_TOKENS=11
-DCONFIG_ENABLE_AMEBA_FACTORY_DATA=0
+ -DCONFIG_ENABLE_AMEBA_TEST_EVENT_TRIGGER=0
)
if (matter_enable_persistentstorage_audit)
diff --git a/examples/all-clusters-app/ameba/main/CHIPDeviceManager.cpp b/examples/all-clusters-app/ameba/main/CHIPDeviceManager.cpp
index 50e6d11db53c25..7b178060a6fff2 100644
--- a/examples/all-clusters-app/ameba/main/CHIPDeviceManager.cpp
+++ b/examples/all-clusters-app/ameba/main/CHIPDeviceManager.cpp
@@ -93,6 +93,12 @@ CHIP_ERROR CHIPDeviceManager::Init(CHIPDeviceManagerCallbacks * cb)
exit:
return err;
}
+
+void CHIPDeviceManager::Shutdown()
+{
+ PlatformMgr().Shutdown();
+}
+
} // namespace DeviceManager
} // namespace chip
diff --git a/examples/all-clusters-app/ameba/main/ManualOperationCommand.cpp b/examples/all-clusters-app/ameba/main/ManualOperationCommand.cpp
new file mode 100644
index 00000000000000..feb346b892f6bb
--- /dev/null
+++ b/examples/all-clusters-app/ameba/main/ManualOperationCommand.cpp
@@ -0,0 +1,159 @@
+/*
+ *
+ * Copyright (c) 2022 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 "ManualOperationCommand.h"
+#include "ManualDishWasherAlarmCommand.h"
+#include "ManualOperationalStateCommand.h"
+#include "ManualRVCModesCommand.h"
+#include "ManualRefrigeratorAlarmCommand.h"
+
+#include "app/server/Server.h"
+#include "platform/CHIPDeviceLayer.h"
+#include
+
+#if CONFIG_ENABLE_CHIP_SHELL
+#include "lib/shell/Engine.h"
+#include "lib/shell/commands/Help.h"
+#endif // ENABLE_CHIP_SHELL
+
+using namespace chip;
+using namespace chip::app;
+
+#if CONFIG_ENABLE_CHIP_SHELL
+using Shell::Engine;
+using Shell::shell_command_t;
+using Shell::streamer_get;
+using Shell::streamer_printf;
+
+Engine sShellManualOperationSubCommands;
+#endif // defined(ENABLE_CHIP_SHELL)
+
+namespace {
+#if CONFIG_ENABLE_CHIP_SHELL
+
+/********************************************************
+ * Manual Operation shell functions
+ *********************************************************/
+
+CHIP_ERROR ManualOperationHelpHandler(int argc, char ** argv)
+{
+ sShellManualOperationSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr);
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR ManualOperationCommandHandler(int argc, char ** argv)
+{
+ if (argc == 0)
+ {
+ return ManualOperationHelpHandler(argc, argv);
+ }
+
+ return sShellManualOperationSubCommands.ExecCommand(argc, argv);
+}
+
+/**
+ * @brief configures switch matter shell
+ *
+ */
+static void RegisterManualOperationCommands()
+{
+
+ static const shell_command_t sManualOperationSubCommands[] = {
+ { &ManualOperationHelpHandler, "help", "Usage: manual " },
+ { &ManualOperationalStateCommandHandler, "opstate", " Usage: manual opstate " },
+ { &ManualRVCCommandHandler, "rvc", " Usage: manual rvc " },
+ { &ManualRefrigeratorAlarmCommandHandler, "refalm", " Usage: manual refalm " },
+ { &ManualDishWasherAlarmCommandHandler, "dishalm", " Usage: manual dishalm " },
+ };
+
+ static const shell_command_t sManualOperationalStateSubCommands[] = {
+ { &ManualOperationalStateCommandHelpHandler, "help", "Usage: manual opstate " },
+ { &ManualOperationalStateSetStateCommandHandler, "set-state", "set-state Usage: manual opstate set-state " },
+ { &ManualOperationalStateSetErrorCommandHandler, "set-error", "set-error Usage: manual opstate set-error " },
+ };
+
+ static const shell_command_t sManualRVCSubCommands[] = {
+ { &ManualRVCCommandHelpHandler, "help", "Usage: manual rvc " },
+ { &ManualRVCOperationalStateCommandHandler, "opstate", "Usage: manual rvc opstate " },
+ { &ManualRVCRunModeCommandHandler, "runmode", "Usage: manual rvc runmode " },
+ { &ManualRVCCleanModeCommandHandler, "cleanmode", "Usage: manual rvc cleanmode " },
+ };
+
+ static const shell_command_t sManualRVCOperationalStateSubCommands[] = {
+ { &ManualRVCOperationalStateCommandHelpHandler, "help", "Usage: manual rvc opstate " },
+ { &ManualRVCOperationalStateSetStateCommandHandler, "set-state", "set-state Usage: manual rvc opstate set-state " },
+ { &ManualRVCOperationalStateSetErrorCommandHandler, "set-error", "set-error Usage: manual rvc opstate set-error " },
+ };
+
+ static const shell_command_t sManualRVCRunModeSubCommands[] = {
+ { &ManualRVCRunModeCommandHelpHandler, "help", "Usage: manual rvc runmode " },
+ { &ManualRVCRunModeSetModeCommandHandler, "set-mode", "set-mode Usage: manual rvc runmode set-mode " },
+ };
+
+ static const shell_command_t sManualRVCCleanModeSubCommands[] = {
+ { &ManualRVCCleanModeCommandHelpHandler, "help", "Usage: manual rvc cleanmode " },
+ { &ManualRVCCleanModeSetModeCommandHandler, "set-mode", "set-mode Usage: manual rvc cleanmode set-mode " },
+ };
+
+ static const shell_command_t sManualRefrigeratorAlarmStateSubCommands[] = {
+ { &ManualRefrigeratorAlarmCommandHelpHandler, "help", "Usage: manual refalm " },
+ { &ManualRefrigeratorAlarmDoorOpenCommandHandler, "door-open", "door-open Usage: manual refalm door-open" },
+ { &ManualRefrigeratorAlarmDoorCloseCommandHandler, "door-close", "door-close Usage: manual refalm door-close" },
+ { &ManualRefrigeratorAlarmSuppressCommandHandler, "suppress-alarm", "suppress-alarm Usage: manual refalm suppress-alarm" },
+ };
+
+ static const shell_command_t sManualDishWasherAlarmSubCommands[] = {
+ { &ManualDishWasherAlarmCommandHelpHandler, "help", "Usage: manual dishalm " },
+ { &ManualDishWasherAlarmSetRaiseCommandHandler, "raise", "raise Usage: manual dishalm raise" },
+ { &ManualDishWasherAlarmSetLowerCommandHandler, "lower", "lower Usage: manual dishalm lower" },
+ };
+
+ static const shell_command_t sManualOperationCommand = { &ManualOperationCommandHandler, "manual",
+ "Manual Operation commands. Usage: manual " };
+
+ // Register commands
+ sShellManualOperationSubCommands.RegisterCommands(sManualOperationSubCommands, ArraySize(sManualOperationSubCommands));
+ sShellManualOperationalStateSubCommands.RegisterCommands(sManualOperationalStateSubCommands,
+ ArraySize(sManualOperationalStateSubCommands));
+ sShellManualRVCSubCommands.RegisterCommands(sManualRVCSubCommands, ArraySize(sManualRVCSubCommands));
+ sShellManualRVCOperationalStateSubCommands.RegisterCommands(sManualRVCOperationalStateSubCommands,
+ ArraySize(sManualRVCOperationalStateSubCommands));
+ sShellManualRVCRunModeSubCommands.RegisterCommands(sManualRVCRunModeSubCommands, ArraySize(sManualRVCRunModeSubCommands));
+ sShellManualRVCCleanModeSubCommands.RegisterCommands(sManualRVCCleanModeSubCommands, ArraySize(sManualRVCCleanModeSubCommands));
+ sShellManualRefrigeratorAlarmStateSubCommands.RegisterCommands(sManualRefrigeratorAlarmStateSubCommands,
+ ArraySize(sManualRefrigeratorAlarmStateSubCommands));
+ sShellManualDishWasherAlarmStateSubCommands.RegisterCommands(sManualDishWasherAlarmSubCommands,
+ ArraySize(sManualDishWasherAlarmSubCommands));
+
+ Engine::Root().RegisterCommands(&sManualOperationCommand, 1);
+}
+#endif // ENABLE_CHIP_SHELL
+
+} // namespace
+
+/********************************************************
+ * Switch functions
+ *********************************************************/
+
+CHIP_ERROR InitManualOperation()
+{
+#if CONFIG_ENABLE_CHIP_SHELL
+ RegisterManualOperationCommands();
+#endif
+ return CHIP_NO_ERROR;
+}
diff --git a/examples/all-clusters-app/ameba/main/OperationalStateManager.cpp b/examples/all-clusters-app/ameba/main/OperationalStateManager.cpp
new file mode 100644
index 00000000000000..9e4001e7d24e2d
--- /dev/null
+++ b/examples/all-clusters-app/ameba/main/OperationalStateManager.cpp
@@ -0,0 +1,173 @@
+/*
+ *
+ * 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
+
+using namespace chip;
+using namespace chip::app;
+using namespace chip::app::Clusters;
+using namespace chip::app::Clusters::OperationalState;
+using namespace chip::app::Clusters::RvcOperationalState;
+
+CHIP_ERROR GenericOperationalStateDelegateImpl::GetOperationalStateAtIndex(size_t index, GenericOperationalState & operationalState)
+{
+ if (index >= mOperationalStateList.size())
+ {
+ return CHIP_ERROR_NOT_FOUND;
+ }
+ operationalState = mOperationalStateList[index];
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR GenericOperationalStateDelegateImpl::GetOperationalPhaseAtIndex(size_t index, GenericOperationalPhase & operationalPhase)
+{
+ if (index >= mOperationalPhaseList.size())
+ {
+ return CHIP_ERROR_NOT_FOUND;
+ }
+ operationalPhase = mOperationalPhaseList[index];
+ return CHIP_NO_ERROR;
+}
+
+void GenericOperationalStateDelegateImpl::HandlePauseStateCallback(GenericOperationalError & err)
+{
+ auto error = GetInstance()->SetOperationalState(to_underlying(OperationalState::OperationalStateEnum::kPaused));
+ if (error == CHIP_NO_ERROR)
+ {
+ err.Set(to_underlying(ErrorStateEnum::kNoError));
+ }
+ else
+ {
+ err.Set(to_underlying(ErrorStateEnum::kUnableToCompleteOperation));
+ }
+}
+
+void GenericOperationalStateDelegateImpl::HandleResumeStateCallback(GenericOperationalError & err)
+{
+ auto error = GetInstance()->SetOperationalState(to_underlying(OperationalStateEnum::kRunning));
+ if (error == CHIP_NO_ERROR)
+ {
+ err.Set(to_underlying(ErrorStateEnum::kNoError));
+ }
+ else
+ {
+ err.Set(to_underlying(ErrorStateEnum::kUnableToCompleteOperation));
+ }
+}
+
+void GenericOperationalStateDelegateImpl::HandleStartStateCallback(GenericOperationalError & err)
+{
+ auto error = GetInstance()->SetOperationalState(to_underlying(OperationalStateEnum::kRunning));
+ if (error == CHIP_NO_ERROR)
+ {
+ err.Set(to_underlying(ErrorStateEnum::kNoError));
+ }
+ else
+ {
+ err.Set(to_underlying(ErrorStateEnum::kUnableToCompleteOperation));
+ }
+}
+
+void GenericOperationalStateDelegateImpl::HandleStopStateCallback(GenericOperationalError & err)
+{
+ auto error = GetInstance()->SetOperationalState(to_underlying(OperationalStateEnum::kStopped));
+ if (error == CHIP_NO_ERROR)
+ {
+ err.Set(to_underlying(ErrorStateEnum::kNoError));
+ }
+ else
+ {
+ err.Set(to_underlying(ErrorStateEnum::kUnableToCompleteOperation));
+ }
+}
+
+// Init Operational State cluster
+
+static OperationalState::Instance * gOperationalStateInstance = nullptr;
+static OperationalStateDelegate * gOperationalStateDelegate = nullptr;
+
+void OperationalState::Shutdown()
+{
+ if (gOperationalStateInstance != nullptr)
+ {
+ delete gOperationalStateInstance;
+ gOperationalStateInstance = nullptr;
+ }
+ if (gOperationalStateDelegate != nullptr)
+ {
+ delete gOperationalStateDelegate;
+ gOperationalStateDelegate = nullptr;
+ }
+}
+
+OperationalState::Instance * OperationalState::GetOperationalStateInstance()
+{
+ return gOperationalStateInstance;
+}
+
+void emberAfOperationalStateClusterInitCallback(chip::EndpointId endpointId)
+{
+ VerifyOrDie(endpointId == 1); // this cluster is only enabled for endpoint 1.
+ VerifyOrDie(gOperationalStateInstance == nullptr && gOperationalStateDelegate == nullptr);
+
+ gOperationalStateDelegate = new OperationalStateDelegate;
+ EndpointId operationalStateEndpoint = 0x01;
+ gOperationalStateInstance = new Instance(gOperationalStateDelegate, operationalStateEndpoint, Clusters::OperationalState::Id);
+
+ gOperationalStateInstance->SetOperationalState(to_underlying(OperationalState::OperationalStateEnum::kStopped));
+
+ gOperationalStateInstance->Init();
+}
+
+// Init RVC Operational State cluster
+
+static OperationalState::Instance * gRvcOperationalStateInstance = nullptr;
+static RvcOperationalStateDelegate * gRvcOperationalStateDelegate = nullptr;
+
+OperationalState::Instance * OperationalState::GetRVCOperationalStateInstance()
+{
+ return gRvcOperationalStateInstance;
+}
+
+void RvcOperationalState::Shutdown()
+{
+ if (gRvcOperationalStateInstance != nullptr)
+ {
+ delete gRvcOperationalStateInstance;
+ gRvcOperationalStateInstance = nullptr;
+ }
+ if (gRvcOperationalStateDelegate != nullptr)
+ {
+ delete gRvcOperationalStateDelegate;
+ gRvcOperationalStateDelegate = nullptr;
+ }
+}
+
+void emberAfRvcOperationalStateClusterInitCallback(chip::EndpointId endpointId)
+{
+ VerifyOrDie(endpointId == 1); // this cluster is only enabled for endpoint 1.
+ VerifyOrDie(gRvcOperationalStateInstance == nullptr && gRvcOperationalStateDelegate == nullptr);
+
+ gRvcOperationalStateDelegate = new RvcOperationalStateDelegate;
+ EndpointId operationalStateEndpoint = 0x01;
+ gRvcOperationalStateInstance =
+ new Instance(gRvcOperationalStateDelegate, operationalStateEndpoint, Clusters::RvcOperationalState::Id);
+
+ gRvcOperationalStateInstance->SetOperationalState(to_underlying(OperationalState::OperationalStateEnum::kStopped));
+
+ gRvcOperationalStateInstance->Init();
+}
diff --git a/examples/all-clusters-app/ameba/main/SmokeCOAlarmManager.cpp b/examples/all-clusters-app/ameba/main/SmokeCOAlarmManager.cpp
new file mode 100644
index 00000000000000..bede2bcf537a76
--- /dev/null
+++ b/examples/all-clusters-app/ameba/main/SmokeCOAlarmManager.cpp
@@ -0,0 +1,171 @@
+/*
+ *
+ * Copyright (c) 2023 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "SmokeCOAlarmManager.h"
+#include
+#include
+
+using namespace chip;
+using namespace chip::app::Clusters::SmokeCoAlarm;
+using namespace chip::DeviceLayer;
+
+static std::array sPriorityOrder = {
+ ExpressedStateEnum::kSmokeAlarm, ExpressedStateEnum::kInterconnectSmoke, ExpressedStateEnum::kCOAlarm,
+ ExpressedStateEnum::kInterconnectCO, ExpressedStateEnum::kHardwareFault, ExpressedStateEnum::kTesting,
+ ExpressedStateEnum::kEndOfService, ExpressedStateEnum::kBatteryAlert
+};
+
+CHIP_ERROR SmokeCoAlarmManager::Init()
+{
+ return CHIP_NO_ERROR;
+}
+
+void SmokeCoAlarmManager::StartSelfTesting()
+{
+ // Currently selftest is not implemented
+}
+
+bool emberAfHandleEventTrigger(uint64_t eventTrigger)
+{
+ SmokeCOTrigger trigger = static_cast(eventTrigger);
+
+ switch (trigger)
+ {
+ case SmokeCOTrigger::kForceSmokeCritical:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force smoke (critical)");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetSmokeState(1, AlarmStateEnum::kCritical), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kForceSmokeWarning:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force smoke (warning)");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetSmokeState(1, AlarmStateEnum::kWarning), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kForceSmokeInterconnect:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force smoke interconnect (warning)");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetInterconnectSmokeAlarm(1, AlarmStateEnum::kWarning), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kForceCOCritical:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force CO (critical)");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetCOState(1, AlarmStateEnum::kCritical), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kForceCOWarning:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force CO (warning)");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetCOState(1, AlarmStateEnum::kWarning), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kForceCOInterconnect:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force CO (warning)");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetInterconnectCOAlarm(1, AlarmStateEnum::kWarning), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kForceSmokeContaminationHigh:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force smoke contamination (critical)");
+ SmokeCoAlarmServer::Instance().SetContaminationState(1, ContaminationStateEnum::kCritical);
+ break;
+ case SmokeCOTrigger::kForceSmokeContaminationLow:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force smoke contamination (warning)");
+ SmokeCoAlarmServer::Instance().SetContaminationState(1, ContaminationStateEnum::kLow);
+ break;
+ case SmokeCOTrigger::kForceSmokeSensitivityHigh:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force smoke sensistivity (high)");
+ SmokeCoAlarmServer::Instance().SetSmokeSensitivityLevel(1, SensitivityEnum::kHigh);
+ break;
+ case SmokeCOTrigger::kForceSmokeSensitivityLow:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force smoke sensitivity (low)");
+ SmokeCoAlarmServer::Instance().SetSmokeSensitivityLevel(1, SensitivityEnum::kLow);
+ break;
+ case SmokeCOTrigger::kForceMalfunction:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force malfunction");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetHardwareFaultAlert(1, true), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kForceLowBatteryWarning:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force low battery (warning)");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetBatteryAlert(1, AlarmStateEnum::kWarning), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kForceLowBatteryCritical:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force low battery (critical)");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetBatteryAlert(1, AlarmStateEnum::kCritical), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kForceEndOfLife:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force end-of-life");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetEndOfServiceAlert(1, EndOfServiceEnum::kExpired), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kForceSilence:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force silence");
+ SmokeCoAlarmServer::Instance().SetDeviceMuted(1, MuteStateEnum::kMuted);
+ break;
+ case SmokeCOTrigger::kClearSmoke:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Clear smoke");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetSmokeState(1, AlarmStateEnum::kNormal), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kClearCO:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Clear CO");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetCOState(1, AlarmStateEnum::kNormal), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kClearSmokeInterconnect:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Clear smoke interconnect");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetInterconnectSmokeAlarm(1, AlarmStateEnum::kNormal), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kClearCOInterconnect:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Clear CO interconnect");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetInterconnectCOAlarm(1, AlarmStateEnum::kNormal), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kClearMalfunction:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Clear malfunction");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetHardwareFaultAlert(1, false), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kClearEndOfLife:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Clear end-of-life");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetEndOfServiceAlert(1, EndOfServiceEnum::kNormal), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kClearSilence:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Clear silence");
+ SmokeCoAlarmServer::Instance().SetDeviceMuted(1, MuteStateEnum::kNotMuted);
+ break;
+ case SmokeCOTrigger::kClearBatteryLevelLow:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Clear low battery");
+ VerifyOrReturnValue(SmokeCoAlarmServer::Instance().SetBatteryAlert(1, AlarmStateEnum::kNormal), true);
+ SmokeCoAlarmServer::Instance().SetExpressedStateByPriority(1, sPriorityOrder);
+ break;
+ case SmokeCOTrigger::kClearContamination:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Force SmokeContamination (warning)");
+ SmokeCoAlarmServer::Instance().SetContaminationState(1, ContaminationStateEnum::kNormal);
+ break;
+ case SmokeCOTrigger::kClearSensitivity:
+ ChipLogProgress(Support, "[Smoke-CO-Alarm-Test-Event] => Clear Smoke Sensitivity");
+ SmokeCoAlarmServer::Instance().SetSmokeSensitivityLevel(1, SensitivityEnum::kStandard);
+ break;
+ default:
+
+ return false;
+ }
+
+ return true;
+}
diff --git a/examples/all-clusters-app/ameba/main/chipinterface.cpp b/examples/all-clusters-app/ameba/main/chipinterface.cpp
index ac3426f4b438cc..21280c676154be 100644
--- a/examples/all-clusters-app/ameba/main/chipinterface.cpp
+++ b/examples/all-clusters-app/ameba/main/chipinterface.cpp
@@ -22,15 +22,18 @@
#include "DeviceCallbacks.h"
#include "Globals.h"
#include "LEDWidget.h"
+#include "ManualOperationCommand.h"
#include "chip_porting.h"
#include
#include
#include
+#include
#include
#include
#include
#include
+#include